Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP获取变量数组注入_Php_Security_Arrays_Get_Exploit - Fatal编程技术网

PHP获取变量数组注入

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 GET变量来执行代码执行

.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这里也有记录: