题目:
?解题:
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 参数,由该函数设置的变量将覆盖已存在的同名变量。
? ? ? ? 具体介绍:https://www.runoob.com/php/func-string-parse-str.html
????????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:
|