知识点
利用php的字符串解析特性,绕过waf
PHP的字符串解析特性:PHP在处理URL查询字符串时,会将某些字符删除或用下划线代替。例如,/? foo=bar 会变成 Array([foo] => “bar”)。如果参数值包含非法字符,可以通过在参数名前加空格或其他特殊字符来绕过检测
scandir()函数:scandir() 函数用于列出指定目录中的文件和目录。通过构造特定的payload,可以绕过WAF检测,列出服务器上的文件和目录
file_get_contents()函数:file_get_contents() 函数用于读取文件内容。通过构造特定的payload,可以绕过WAF检测,读取特定文件的内容
var_dump() — 打印数组的相关信息
WAF绕过技巧:题目中涉及到WAF(Web Application Firewall)的检测,通过在参数名前加空格或其他特殊字符,可以绕过WAF的检测,执行未授权的代码
绕过引号过滤
可以使用chr()函数,传入指定字符的askill码值,就可以得到对应的字符。而且得到的不仅是单个符号,还是有引号的。比如/的askill值是47,但是我们直接使用scandir(/)是会报错的,因为字符要用引号包裹,但是我们通过chr函数,通过它的askill码值得到对应的字符,和‘/’是等价的。
思考:
此题需要通过php特殊字符绕过waf检测,比如scandir(),file_get_contents(),var_dump()
chr()绕过引号,输入特定的askill的值,先用var_dump(scandir(chr(47)))查根目录的文件和目录,var_dump(file_get_contents(chr(47).f1agg))查文件内容
1.打开环境,看到源码js有相关内容,存在waf并给出calc.php
2.访问calc.php,得到源码,开始代码审计
3.题目中过滤了空格、tab、回车等字符,接下来传入num参数测试
4.发现传入字符数据时,系统会拦截返回403。而在php中传参时,PHP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事:删除空白符和将某些字符转换为下划线(包括空格),那么我们传入%20num测试,从而绕过此处
此时回显正常,查看/calc.php
可以看到禁用的php函数,那么利用scandir进行目录的读取,需要注意的是/是已经被代码过滤了,需要使用chr(47)来代替,那么构造payload:var_dump(scandir(chr(47)));
得到flagg文件的文件名,接下来进行文件内容的读取,构造payload:var_dump(file_get_contents(chr(47).f1agg))
flag{e273c5ca-6d74-4091-87dd-ca358f173684}