【问题标题】:PHP GET variable array injectionPHP GET 变量数组注入
【发布时间】:2009-12-11 05:30:07
【问题描述】:

我最近了解到可以将数组注入到 PHP GET 变量中以执行代码?

.php?a[]=asd&a[]=asdasd&b[]=$a

这是给我的例子。我不知道它是如何工作的,我想知道这是否可能?

【问题讨论】:

  • 欢迎来到三星的 StackOverflow。让我第一个奖励你 12 点声望 ;)

标签: php security arrays get exploit


【解决方案1】:

PHP 将解析查询字符串,并将这些值注入到$_GET 超级全局数组中(如果这是在使用 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 数组中,如果查询字符串中使用了 [],则在必要时创建子数组。

但这不会导致任何类型的“代码执行”:只要您正确处理输入(即不信任输入并在其上使用eval,或任何类型的坏主意像这样),没有代码注入的风险。

【讨论】:

  • 感谢您为提问者 Pascal 提供详尽的答复。它在这里创造了一个更好的环境。
  • @Jonathan : 谢谢 :-) ;;只是想帮忙;希望是的^^;我想这是我“回馈”的一种方式
【解决方案2】:

如果您不确定如何确保安全,您至少可以过滤 $_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”,阻止了注射,但也阻止了网站功能工作......但现在,功能正在工作并且注射被阻止。谢谢你
  • 伟大而简单的解决方案。正则表达式中有错误,a-Z 应该是 a-z 否则 php 会出错 :)
  • @Spaceship09 很好的发现,但你能告诉我如何添加空格吗?
【解决方案3】:

以上内容并不严格允许代码执行,但如果不考虑数据可能是数组的事实,它可能会改变现有代码的控制流程。

上述工作的原因是因为 PHP 将以 [] 结尾的变量解释为数组。因此,如果您提供多个以 [] 结尾的同名 GET 变量,PHP 会创建一个包含所有值的数组。

【讨论】:

    【解决方案4】:

    长话短说:没有代码执行。否则,你不认为已经有人入侵了 Facebook 吗? :)

    我认为告诉您的人对使用深度数组嵌套来触发缓冲区溢出/双重释放/其他一些黑客向量的其他一些错误感到困惑,理论上可以用来执行一些代码。这些是您在许多流行软件中每天都能看到的软件错误。它们通常会很快得到修补。

    您可以在http://www.suspekt.org/找到更多信息

    【讨论】:

      【解决方案5】:
      echo $_GET['a'][0]; //prints "asd"
      echo $_GET['a'][1]; //prints "asdasd"
      echo $_GET['b'][0]; //prints "$a"
      

      【讨论】:

        【解决方案6】:

        我认为他在谈论传递数组时评估不同的东西

        strcasecmp( $_GET['password'], $password ) == 0 ) { echo($secret); } ` 如果您将一个空数组传递给 strcasecmp,无论出于何种原因,它都会评估为 true。

        IE:index.php?password=[]

        【讨论】:

        【解决方案7】:

        你好像误会了什么。

        上面的例子只是简单地创建了一个数组

        Array (
          [a] => Array (
            [0] => asd
            [1] => asdasd
          )
          [b] => Array ( [0] => $a )
        )
        

        这已记录在案并且完全按预期工作。

        【讨论】:

          【解决方案8】:

          有人骗了你,你不会执行任何操作,你只会发送一个数组而不是一个普通的变量。

          试试这个代码

          <?php
              $x = $_GET['x'];
              var_dump($x);
          ?>
          

          并使用 ?x=1 然后 ?x[a]=1&x[b]=2 访问它,这是预期的行为,而不是注入,您不能使用它运行任何代码。

          【讨论】:

            【解决方案9】:

            你的网址想要这样

            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;
            ?>
            

            【讨论】:

              猜你喜欢
              • 2013-04-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-05-08
              相关资源
              最近更新 更多