PHP参数字符串解析特性
我们知道PHP将查询字符串(在URL或正文中)转换为内部_POST。例如:/?foo=bar变成Array([foo] => “bar”)。值得注意的是,查询字符串在解析的过程中会将某些字符删除或用下划线代替。例如,/?%20news[id%00=42会转换为Array([news_id] => 42)。如果一个IDS/IPS或WAF中有一条规则是当news_id参数的值是一个非数字的值则拦截,那么我们就可以用以下语句绕过:
1 | /news.php?%20news[id%00=42"+AND+1=0-- |
上述PHP语句的参数%20news[id%00的值将存储到$_GET[“news_id”]中。
PHP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事:
1.删除空白符
2.将某些字符转换为下划线(包括空格)
例如:
| User input | Decoded PHP | variable name |
|---|---|---|
| %20foo_bar%00 | foo_bar | foo_bar |
| foo%20bar%00 | foo bar | foo_bar |
| foo%5bbar | foo[bar | foo_bar |
我们可以使用如下代码,探测哪些字符会被parser_str函数删除或者转换为下划线:
1 |
|



在上述方案中,foo%20bar和foo+bar等效,均解析为foo bar。
| 输入 | 输出 |
|---|---|
| %20news_id | news_id |
| news%20id | news_id |
| news%00id | news |
| news[id | news_id |
| news.id | news_id |
| news+id | news_id |
| news_id%20 | news_id_ |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Rick!
评论


