题目:
解题:
1:查看源码
发现提示:I've set up WAF to ensure security.
url:"calc.php?num=
2:尝试calc.php页面
过滤了一些特殊符号:空格、\t、\r等,正确传入num参数后,执行 eval('echo '.$str.';'); 语句。
3:尝试num=phpinfo()
输入:http://node4.buuoj.cn:25599/calc.php?num=phpinfo()
无法访问,说明WAF对num参数做了过滤。
(WAF对来自Web应用程序客户端的各类请求进行内容检测和验证,确保其安全性与合法性,对非法的请求予以实时阻断,从而对各类网站站点进行有效防护。)
输入num=123可以回显123,输入num=abc被拒绝,猜测WAF对num参数过滤了英文字母。
4:查询字符串解析特性
parse_str函数
parse_str() 函数把查询字符串解析到变量中。
语法:parse_str(string,array)
参数:string:必需。规定要解析的字符串。
array:可选。规定存储变量的数组名称。该参数指示变量存储到数组中。如果未设置 array 参数,由该函数设置的变量将覆盖已存在的同名变量。
parse_str函数通常被自动应用于get、post请求和cookie中。如果你的Web服务器接受带有特殊字符的参数名,parse_str() 函数在解析的过程中会将某些特殊字符删除或用下划线代替。具体情形如下:
情形 | 问号处特殊字符 | 解析结果 |
?foo_bar=bla | %20 ( ) | foo_bar |
%2b (+) | ||
foo?bar=bla | %20 ( ) | |
%2b (+) | ||
%2e (.) | ||
%5b ([) | ||
%5f (_) | ||
foo_bar?=bla | %00 () |
可在php交互模式下自行验证:
5:利用查询字符串解析特性绕过WAF
WAF能够过滤特定Web应用程序的内容,利用查询字符串解析特性,将num参数变形:http://node4.buuoj.cn:25153/calc.php?+num=abc,这样对于WAF来说传入的参数为+num,而WAF并没有对+num参数做限制,而PHP经过parse_str函数解析过后获得的仍然是num参数,这样就绕过了WAF。
6:读根目录
scandir 函数
scandir(string $directory, int $sorting_order)
返回指定目录中的文件和目录的数组。
参数: directory:要被浏览的目录
sorting_order:默认的排序顺序是按字母升序排列,如果sorting_order设为 1,则降序排列。
print_r 函数
print_r ( mixed $expression )
$expression: 要打印的变量,如果给出的是 string、integer 或 float 类型变量,将打印变量值本身。如果给出的是 array,将会按照一定格式显示键和元素。
chr 函数
chr(int $ascii): string
返回相对应于 ascii码 所指定的单个字符。
因为 “/” 符号被过滤了,所以用chr(47)绕过。
读取根目录:http://node4.buuoj.cn:25345/calc.php?+num=print_r(scandir(chr(47)))
右键查看网页源代码得到:文件f1agg
7:读取文件f1agg
readfile 函数
readfile(string: $filename, string: $include_path)
)
readfile() 函数输出一个文件。该函数读入一个文件并写入到输出缓冲,若成功,则返回从文件中读入的字节数;若失败,则返回 false。
参数: $filename : 规定要读取的文件。
$include_path:可选,在 include_path 中搜索文件。
http://node4.buuoj.cn:25345/calc.php?+num=readfile(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103))
得到flag: