写这个反序列化题目,学到了几点
1 | 1,__clone()魔法函数的触发方法以及一些细节 |
直接看题目,
1 |
|
分析一波,确定了基本pop链,
1 | Start:__destruct==>Sec::__toString==>Easy::__call==>eeee::__clone==>Start::__isset==>Sec::__invoke |
更详细的pop链,
1 | $Start::__destruct()@$this->name=$sec -> $Sec::__toString()@$this->obj=$easy -> $Easy::__call()@$this->cla=$copy_eee&$var[0]=$eee -> $eee::__clone()@($this->obj)=($start) -> $Start::__isset()@$this->func=$sec -> sec::__invoke() |
接下来编写poc,
1 |
|
运行,发现php报错,
然后搞了好久也没找到解决方法,又检查了好几遍pop链,感觉pop链没错,一时间不知道怎么做了。
直到writeup出来😶😶……
最后看了一下writeup,发现构造的pop链是正确的,只是构造过程中几个细节没有处理好,导致php出错。
重新编写的poc,
1 |
|
其中,为什么$easy->cla=$copy_ee;
删除掉,我的理解是要想让eeee类中__clone()函数触发,只需要eeee类被克隆就OK了,就是让Easy类中的$var=$eeee类,而不用再定义Easy中的cla属性。
最后,编写的exp可以运行,传入后得到flag