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!
评论