<?php
class A{
public $code = "";
function __call($method,$args){
eval($this->code);
}
function __wakeup(){
$this->code = "";
}
}
class B{
function __destruct(){
echo $this->a->a();
}
}
if(isset($_REQUEST['poc'])){
preg_match_all('/"[BA]":(.*?):/s',$_REQUEST['poc'],$ret);
if (isset($ret[1])) {
foreach ($ret[1] as $i) {
if(intval($i)!==1){
exit("you want to bypass wakeup ? no !");
}
}
unserialize($_REQUEST['poc']);
}
}else{
highlight_file(__FILE__);
}
当时我是用的class大小写特性绕过的,但是如果正则变成匹配大小写AB,我们又该这么办呢。。。。
反序列化,它是先从里面里面开始反序列话,而不是最外面。。。。。。可以看到是先执行的里面的__wakeup,再到外面的{}然后到__call。。。
这里有两个方式可以先触发__call,再执行__wakeup,其实准确点是先执行了外面的类,然后再执行里面的类,注意这里并不是绕过wakeup
绕过是这种。。
而这里
法一
在后面两个}}中加;
可以看到是先执行了外面的{},这个我调试过的
法二
就是把最后}}删掉一个},效果同法一