PHP GET变量数组注入

dav*_*ave 13 php arrays security exploit get

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

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

这就是我给出的榜样.我不知道它是如何工作的,并且想知道这是否可能?

Pas*_*TIN 8

PHP将解析查询字符串,并将这些值注入$_GET超全局数组($_POST如果使用POST,btw在表单中完成,则相同).

在您的情况下,$_GET数组将包含:

array
  'a' => 
    array
      0 => string 'asd' (length=3)
      1 => string 'asdasd' (length=6)
  'b' => 
    array
      0 => string '$a' (length=2)
Run Code Online (Sandbox Code Playgroud)

查询字符串中传递的每个值都将由PHP放入$_GET数组中,如果需要,[]在查询字符串中使用时创建子数组.

但这并不会导致任何类型的"代码执行":只要你正确处理输入(即不信任输入并使用eval它,或任何类似的坏主意),就没有风险代码注入.


Sar*_*raz 6

如果您不确定如何获得安全,那么您至少可以过滤$ _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;
  }
}
Run Code Online (Sandbox Code Playgroud)

现在您可以像这样过滤$ _GET:

$_GET = filter_url($_GET);
Run Code Online (Sandbox Code Playgroud)

这将基本上从可疑字符(如[])中清除$ _GET数组.

谢谢

  • 很棒,简单的解决方案 正则表达式中有一个错误,aZ应该是az,否则php会给错误:) (3认同)

use*_*321 0

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

试试这个代码

<?php
    $x = $_GET['x'];
    var_dump($x);
?>
Run Code Online (Sandbox Code Playgroud)

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