2009-12-11 3 views
13

Я недавно узнал, что можно реализовать массивы PHP в переменных GET для выполнения кода?PHP GET переменная массива впрыска

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

Это был пример, который я получил. Я понятия не имею, как это работает, и задавался вопросом, возможно ли это?

+3

Добро пожаловать в StackOverflow, Samsung. Позвольте мне быть первым, кто наградит вас 12 репутационными очками;) – Sampson

ответ

0

Кто-то лгал вам, вы ничего не выполните с этим, вы просто отправите массив вместо простой переменной.

попробуйте этот код

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

и доступ к нему с помощью? Х = 1, а затем? Х [а] = 1 & х [Ь] = 2 это ожидаемое поведение, а не инъекции, и вы не можете запустить любой код с ним.

8

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 на нем, или любые плохие идеи, подобные этому), нет риска инъекции кода.

+0

Спасибо, что предоставили вам тщательный ответ для искателя Паскаля. Здесь создается намного лучшая среда. – Sampson

+0

@ Джонатан: Спасибо :-) ;; просто пытаясь помочь; надеюсь, что это будет ^^; Я полагаю, что это мой способ «вернуть» –

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

+0

@Darkeden: добро пожаловать – Sarfraz

+3

Отличное, простое решение. В регулярном выражении есть ошибка, a-Z должен быть a-z, иначе php дает ошибки: – Spaceship09

2

Я думаю, что он говорит о чем-то оценивая по-другому, когда передается массив

strcasecmp($_GET['password'], $password) == 0) { echo($secret); } ` Если вы передаете пустой массив в strcasecmp будет вычисляться верно для по какой-то причине.

IE: index.php пароль = []

+0

+1 это также описано здесь: https://www.owasp.org/index.php/PHP_Security_Cheat_Sheet#Input_handling –

0

ваш URL хотите быть похожим, что

www.mysite.com/page.php? имя = джон

но вы хотите, чтобы предотвратить вставить что-то вроде этого

www.mysite.com/page.php? имя [] = джон

решение:

<?php 
$myname = is_array($_GET['name'])? "invalid" : $_GET['name'] ; 
echo $myname; 
?> 
Смежные вопросы