前一阵子看到一篇文章:How To Exploit PHP Remotely To Bypass Filters & WAF Rules ,讲的是利用PHP的特性绕过WAF规则,刚看的时候也顺手测试,发现并不能成功。今天再次复现,才发现这种技巧只能利用在PHP7.x版本,这里做一个总结。

整片文章使用到的技巧有:PHP字符串的转义表示法、PHP可变函数、PHP对未定义字符串的处理、PHP内建函数get_defined_functions。

先贴一个测试代码,模拟存在漏洞的网站环境:

1

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引入该功能)

2

PHP可变函数

PHP支持可变函数这种概念。这意味着如果一个变量名后面跟着圆括号,那么PHP将寻找与变量值同名的函数,并尝试执行该函数。除此之外,可变函数还可以用于实现回调、函数表等其他使用场景。

PHP对未定义字符串的处理

将其直接强转成字符串类型,然后结合PHP可变函数进行利用,绕过单/双引号。

1
2
3
➜  html php -r "var_dump(test);"
PHP Warning: Use of undefined constant test - assumed 'test' (this will throw an Error in a future version of PHP) in Command line code on line 1
string(4) "test"

PHP内建函数get_defined_functions

PHP自带的 get_defined_functions 函数包含了所有PHP内建及用户自定义的函数,内建函数会放在 internal 键中,而用户自定义函数会放在 user 中。

3

题外话

该文章作者以往写的文章都挺不错的,建议大家可以看看。

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

参考

How To Exploit PHP Remotely To Bypass Filters & WAF Rules