PHP获取变量数组注入
我最近了解到,可以将数组注入PHP GET变量来执行代码执行PHP获取变量数组注入,php,security,arrays,get,exploit,Php,Security,Arrays,Get,Exploit,我最近了解到,可以将数组注入PHP GET变量来执行代码执行 .php?a[]=asd&a[]=asdasd&b[]=$a 这就是我得到的例子。我不知道它是如何工作的,我想知道这是否可能?有人对你撒谎,你不会用它执行任何事情,你只会发送一个数组而不是一个普通变量 试试这个代码 <?php $x = $_GET['x']; var_dump($x); ?> 然后使用?x=1和?x[a]=1&x[b]=2访问它,这是预期的行为,而不是注入,您不能用它运行任何代码。P
.php?a[]=asd&a[]=asdasd&b[]=$a
这就是我得到的例子。我不知道它是如何工作的,我想知道这是否可能?有人对你撒谎,你不会用它执行任何事情,你只会发送一个数组而不是一个普通变量 试试这个代码
<?php
$x = $_GET['x'];
var_dump($x);
?>
然后使用?x=1和?x[a]=1&x[b]=2访问它,这是预期的行为,而不是注入,您不能用它运行任何代码。PHP将解析查询字符串,并将这些值注入
$\u GET
超级全局数组中(如果这是在使用POST的表单中完成的,那么$\u POST
也是如此)
在您的情况下,$\u GET
数组将包含以下内容:
array
'a' =>
array
0 => string 'asd' (length=3)
1 => string 'asdasd' (length=6)
'b' =>
array
0 => string '$a' (length=2)
当查询字符串中使用了[]
时,PHP会将查询字符串中传递的每个值放入$\u GET
数组中,必要时创建子数组
但这不会导致任何类型的“代码执行”:只要您正确处理输入(即不信任输入并对其使用
eval
,或任何类似的坏主意),就不会有代码注入的风险。似乎您误解了什么
echo $_GET['a'][0]; //prints "asd"
echo $_GET['a'][1]; //prints "asdasd"
echo $_GET['b'][0]; //prints "$a"
上面的示例只是创建了一个类似
Array (
[a] => Array (
[0] => asd
[1] => asdasd
)
[b] => Array ( [0] => $a )
)
这是有文档记录的,并且完全按照预期工作。上述内容不严格允许代码执行,但如果不考虑数据可能是数组的事实,则可能会改变现有代码的控制流
上述方法之所以有效,是因为PHP将以[]结尾的变量解释为数组。因此,如果提供多个以[]结尾的同名GET变量,PHP将创建一个包含所有值的数组。长话短说:无代码执行。否则,你不认为有人已经入侵了Facebook吗?:) 我想告诉你这件事的人对其他一些bug感到困惑,这些bug使用深层数组嵌套触发缓冲区溢出/双重释放/其他黑客向量,理论上可以用来执行一些代码。这些都是软件缺陷,你每天都能在许多流行软件中看到。他们通常会很快得到修补
如果您不确定如何确保安全,您可能会在上找到更多信息,至少可以过滤$\u get数组。以下是函数:
function filter_url($url)
{
if (is_array($url))
{
foreach ($url as $key => $value)
{
// recurssion
$url[$key] = filter_url($value);
}
return $url;
}
else
{
// remove everything except for a-zA-Z0-9_.-&=
$url = preg_replace('/[^a-zA-Z0-9_\.\-&=]/', '', $url);
return $url;
}
}
现在,您可以过滤$\u,如下所示:
$_GET = filter_url($_GET);
这将从本质上清除$\u GET数组中的可疑字符,如[]
谢谢我想他说的是当通过数组时,计算结果会有所不同
strcasecmp($\u GET['password',$password)==0)
{
echo($secret);
}
`
如果将空数组传递到strcasecmp,无论出于何种原因,它的计算结果都将为true
IE:index.php?password=[]您的url想要这样吗 www.mysite.com/page.php?name=john 但是你想阻止插入这样的东西吗 www.mysite.com/page.php?name[]=john 解决方案:
<?php
$myname = is_array($_GET['name'])? "invalid" : $_GET['name'] ;
echo $myname;
?>
感谢您为询问者Pascal提供了全面的回复。它在这里创造了一个更好的环境。@乔纳森:谢谢:-);;只是想帮忙;希望如此^^ ^;我想这是我“回馈”三星StackOverflow的方式。让我第一个给你12点声誉积分;)非常完美,解决了我的问题…谢谢。如果你想知道的话,我在我的网站上进行了注射,并使用了“mysqli_real_escape”,阻止了注射,但也阻止了网站功能进入wokr。。。但现在,该功能正在工作,注入被阻止。谢谢,非常简单的解决方案。正则表达式中有一个错误,a-Z应该是a-Z,否则php会给出错误:)@Spaceship09很好的发现,但是你能告诉我如何添加空格吗?+1这里也有记录: