前一阵子看到一篇文章:How To Exploit PHP Remotely To Bypass Filters & WAF Rules ,讲的是利用PHP的特性绕过WAF规则,刚看的时候也顺手测试,发现并不能成功。今天再次复现,才发现这种技巧只能利用在PHP7.x版本,这里做一个总结。
整片文章使用到的技巧有:PHP字符串的转义表示法、PHP可变函数、PHP对未定义字符串的处理、PHP内建函数get_defined_functions。
先贴一个测试代码,模拟存在漏洞的网站环境:
PHP字符串的转义表示法
同样通过进制转义法绕过关键字黑名单检测。(PHP Strings )
- 以八进制表示的
\[0–7]{1,3}
转义字符会自动适配byte(如"\400" == "\000"
) - 以十六进制的
\x[0–9A-Fa-f]{1,2}
转义字符表示法(如"\x41"
) - 以Unicode表示的
\u{[0–9A-Fa-f]+}
字符,会输出为UTF-8字符串(自PHP 7.0.0引入该功能)
PHP可变函数
PHP支持可变函数这种概念。这意味着如果一个变量名后面跟着圆括号,那么PHP将寻找与变量值同名的函数,并尝试执行该函数。除此之外,可变函数还可以用于实现回调、函数表等其他使用场景。
PHP对未定义字符串的处理
将其直接强转成字符串类型,然后结合PHP可变函数进行利用,绕过单/双引号。
1 | ➜ html php -r "var_dump(test);" |
PHP内建函数get_defined_functions
PHP自带的 get_defined_functions 函数包含了所有PHP内建及用户自定义的函数,内建函数会放在 internal 键中,而用户自定义函数会放在 user 中。
题外话
该文章作者以往写的文章都挺不错的,建议大家可以看看。
Web Application Firewall (WAF) Evasion Techniques
Web Application Firewall (WAF) Evasion Techniques #2
Web Application Firewall (WAF) Evasion Techniques #3
How To Exploit PHP Remotely To Bypass Filters & WAF Rules
参考