我最近才知道可以将数组注入PHP GET变量来执行代码执行?PHP GET变量数组注入
.php?a[]=asd&a[]=asdasd&b[]=$a
这是我给出的例子。我不知道它是如何工作的,并想知道这是否有可能?
我最近才知道可以将数组注入PHP GET变量来执行代码执行?PHP GET变量数组注入
.php?a[]=asd&a[]=asdasd&b[]=$a
这是我给出的例子。我不知道它是如何工作的,并想知道这是否有可能?
有人骗你,你不会执行任何事情,你只需发送一个数组而不是一个普通的变量。
试试这个代码
<?php
$x = $_GET['x'];
var_dump($x);
?>
和访问它使用X = 1,然后?X [A] = 1 & X [B] = 2它的预期的行为,不注射,你不能运行任何代码与它。
PHP将解析查询字符串,以及(如果这是在一个形式使用POST做,顺便说一句相同的$_POST
)的$_GET
超全局数组在注入这些值。如果必要的话
array
'a' =>
array
0 => string 'asd' (length=3)
1 => string 'asdasd' (length=6)
'b' =>
array
0 => string '$a' (length=2)
在查询字符串将通过PHP的$_GET
阵列中把传递的每个值,创建子阵列,当有[]
:
在你的情况下,$_GET
阵列将包含这用于查询字符串中。
但是这不会导致任何类型的“代码执行”:只要你正确地处理输入(即不要相信输入和使用eval
或任何类似这样的坏主意),没有代码注入的风险。
感谢您为提问者帕斯卡提供全面的回应。它在这里创造了一个更好的环境。 – Sampson 2009-12-11 05:36:07
@Jonathan:谢谢:-) ;;只是想帮助;希望它确实^^;我想这是我“回馈”的方式 – 2009-12-11 05:41:08
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吗? :)
我想告诉你的人,对于使用深度数组嵌套触发缓冲区溢出/双重释放/一些其他的黑客矢量的其他错误感到困惑,这可能在理论上被用来执行一些代码。这些都是软件错误,正如您在许多流行软件中每天都能看到的那样。他们通常很快得到补丁。
找到更多的信息,如果你不知道如何获得安全的,你至少可以做的是过滤$ _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;
}
}
现在可以过滤$ _GET这样的:
$_GET = filter_url($_GET);
这将从根本上清理可疑的字符,如[]你的$ _GET数组。
感谢
这是完美的,解决了我的问题......谢谢。 如果你想知道,我在我的网站注射并使用“mysqli_real_escape”,阻止注射,但也阻止网站功能wokr ...但现在,功能正在工作和注射被阻止。谢谢 – Darkeden 2012-09-03 03:48:10
@Darkeden:不客气 – Sarfraz 2012-09-11 09:22:34
伟大的,简单的解决方案。在正则表达式中有一个错误,a-z应该是a-z,否则php给出错误:) – Spaceship09 2015-06-25 09:09:33
我认为,当传递一个数组
strcasecmp($_GET['password'], $password) == 0)
{
echo($secret);
}
` 如果你传递一个空数组到strcasecmp它的值为true,因为他是在谈论什么评估不同无论原因。
IE:index.php的密码= []
+1这也记录在这里:https://www.owasp.org/index.php/PHP_Security_Cheat_Sheet#Input_handling – 2014-09-24 02:12:08
您的网址想是这样的
www.mysite.com/page.php? 名称=约翰
,但要防止插入这样的事情
www.mysite.com/page.php? 名称[] =约翰
溶液:
<?php
$myname = is_array($_GET['name'])? "invalid" : $_GET['name'] ;
echo $myname;
?>
欢迎的StackOverflow,三星。让我成为第一个授予你12点声望的人;) – Sampson 2009-12-11 05:36:38