审计代码
这是A类
其中_call方法会在A类中无其他方法执行,为避免报错时执行
其中的eval()会对括号内的命令进行执行
_wakeup会使得code为空是我们要避免的。我们可以在序列化后对属性进行增加来跳过
class A{
public $code = "";
function __call($method,$args){
eval($this->code);
}
function __wakeup(){
$this->code = "";
}
}
这是B类
在反序列化时会,_destruct()方法会执行a中的a()方法
class B{
function __destruct(){
echo $this->a->a();
}
}
这是主体部分
在接收poc的内容后会进行判空,然后对BA进行全局正则匹配,匹配结果以数组形式记录下来。
之后会用if语句来判断匹配成功次数
if(isset($_REQUEST['poc'])){
preg_match_all('/"[BA]":(.*?):/s',$_REQUEST['poc'],$ret);
if (isset($ret[1])) {
foreach ($ret[1] as $i) {
if(int