2009-12-11 34 views
13

我最近才知道可以将数组注入PHP GET变量来执行代码执行?PHP GET变量数组注入

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

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

+3

欢迎的StackOverflow,三星。让我成为第一个授予你12点声望的人;) – Sampson 2009-12-11 05:36:38

回答

0

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

试试这个代码

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

和访问它使用X = 1,然后?X [A] = 1 & X [B] = 2它的预期的行为,不注射,你不能运行任何代码与它。

8

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或任何类似这样的坏主意),没有代码注入的风险。

+0

感谢您为提问者帕斯卡提供全面的回应。它在这里创造了一个更好的环境。 – Sampson 2009-12-11 05:36:07

+0

@Jonathan:谢谢:-) ;;只是想帮助;希望它确实^^;我想这是我“回馈”的方式 – 2009-12-11 05:41:08

2
echo $_GET['a'][0]; //prints "asd" 
echo $_GET['a'][1]; //prints "asdasd" 
echo $_GET['b'][0]; //prints "$a" 
1

看起来好像你误解了一些东西。

上面的例子只是创建像

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

这是记录和恰好按预期工作的阵列。

2

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

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

2

长话短说:无法执行代码。否则,你不觉得有人会破解Facebook吗? :)

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

你可能会在http://www.suspekt.org/

5

找到更多的信息,如果你不知道如何获得安全的,你至少可以做的是过滤$ _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数组。

感谢

+0

这是完美的,解决了我的问题......谢谢。 如果你想知道,我在我的网站注射并使用“mysqli_real_escape”,阻止注射,但也阻止网站功能wokr ...但现在,功能正在工作和注射被阻止。谢谢 – Darkeden 2012-09-03 03:48:10

+0

@Darkeden:不客气 – Sarfraz 2012-09-11 09:22:34

+3

伟大的,简单的解决方案。在正则表达式中有一个错误,a-z应该是a-z,否则php给出错误:) – Spaceship09 2015-06-25 09:09:33

2

我认为,当传递一个数组

strcasecmp($_GET['password'], $password) == 0) { echo($secret); } ` 如果你传递一个空数组到strcasecmp它的值为true,因为他是在谈论什么评估不同无论原因。

IE:index.php的密码= []

+0

+1这也记录在这里:https://www.owasp.org/index.php/PHP_Security_Cheat_Sheet#Input_handling – 2014-09-24 02:12:08

0

您的网址想是这样的

www.mysite.com/page.php? 名称=约翰

,但要防止插入这样的事情

www.mysite.com/page.php? 名称[] =约翰

溶液:

<?php 
$myname = is_array($_GET['name'])? "invalid" : $_GET['name'] ; 
echo $myname; 
?>