在本文中,咱们将与咱们共享怎么运用PHP字符串解析函数绕过IDS/IPS以及运用防火墙规矩。
咱们都知道,PHP会将(在URL或body中的)查询字符串转换成$_GET或许$_POST中的相关数组。比方:/?foo=bar会被转换成Array([foo] => “bar”)。查询字符串解析进程会删去或许运用下划线替换参数名中的某些字符。比方,/?%20news[id%00=42会被转换成Array([news_id] => 42)。假如IDS/IPS或许WAF所运用的规矩会阻挠或许记录下news_id参数中的非数字值,那么就能够乱用这种解析进程来绕过这一约束,比方:
/news.php?%20news[id%00=42″+AND+1=0–
在PHP中,假如运用如上查询句子,那么%20news[id%00参数的值会被存放到$_GET[“news_id”]中。
0x01 原理解析
PHP需要将一切参数转成有用的变量名,因此在解析查询字符串时,PHP首要会履行两个操作:
删去最初的空格符
将某些字符转换成下划线字符(包含空格符)
比方:
输入
解码
PHP变量名
%20foo_bar%00
foo_bar
foo_bar
foo%20bar%00
foo bar
foo_bar
foo%5bbar
foo[bar
foo_bar
比方咱们能够运用如下代码,勘探哪些字符会被parser_str函数删去或许转换为下划线:
图. PHP parser_str函数
foreach(
[
"{chr}foo_bar",
"foo{chr}bar",
"foo_bar{chr}"
] as $k => $arg) {
for($i=0;$i255;$i++) {
echo "33[999D33[Kr";
echo "[".$arg."] check ".bin2hex(chr($i))."";
parse_str(str_replace("{chr}",chr($i),$arg)."=bla",$o);
/* yes... I've added a sleep time on each loop just for
the scenic effect ? like that movie with unrealistic
brute-force where the password are obtained
one byte at a time (∩`-´)⊃━☆゚.*・。゚
*/
usleep(5000);
if(isset($o["foo_bar"])) {
echo "33[999D33[Kr";
echo $arg." -> ".bin2hex(chr($i))." (".chr($i).")n";
}
}
echo "33[999D33[Kr";
echo "n";
}
图. parse_str.php运转成果动图
parse_str在GET、POST以及cookie上都有运用。假如web服务器能够承受头部字段中带有点或许空格的字段名,那么也会呈现这种状况。我分3次履行了如上循环,枚举了参数名两头从0到255的一切字符(除下划线外),成果如下:
[1st]foo_bar
foo[2nd]bar
foo_bar[3rd]
[1][2][3]黑客接单网