2009-12-11 23 views
13

Niedawno dowiedziałem się, że możliwe jest wprowadzanie tablic do zmiennych PHP GET w celu wykonania kodu?Zastrzyki tablicowe PHP GET

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

To był przykład dostałam. Nie mam pojęcia, jak to działa i zastanawiałem się, czy to nawet możliwe?

+3

Witamy StackOverflow, Samsung. Pozwól mi być pierwszym, który przyzna Ci 12 punktów reputacji;) – Sampson

Odpowiedz

0

Ktoś okłamał cię, nie wykonasz niczego z tym, po prostu wyślesz tablicę zamiast zwykłej zmiennej.

wypróbować ten kod

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

oraz dostęp za pomocą? X = 1 i wtedy? X [A] = 1 & x [b] = 2 to normalne zachowanie, nie wtrysk i nie można uruchomić dowolny kod z tym.

8

PHP będzie analizować ciąg kwerendy i wstrzyknąć te wartości w $_GET super globalnej tablicy (taki sam dla $_POST jeśli zostało to zrobione w formie za pomocą POST, btw).

W twoim przypadku, tablica $_GET będzie zawierać to:

array 
    'a' => 
    array 
     0 => string 'asd' (length=3) 
     1 => string 'asdasd' (length=6) 
    'b' => 
    array 
     0 => string '$a' (length=2) 

Każda wartość przekazana w ciągu kwerendy zostaną zadane przez PHP w tablicy $_GET, tworząc sub-macierzy, jeśli to konieczne, gdy istnieją [] użyte w ciągu zapytania.

Ale to nie powoduje żadnego rodzaju "wykonania kodu": o ile dobrze radzisz sobie z wprowadzaniem danych (tj. Nie ufaj wprowadzeniu i używaj na nim eval lub jakiegokolwiek złego pomysłu), nie ma ryzyka wstrzyknięcia kodu.

+0

Dzięki za udzielenie dokładnej odpowiedzi dla pytającego, Pascala. Tworzy tutaj znacznie lepsze środowisko. – Sampson

+0

@ Jonathan: Dzięki :-) ;; Po prostu próbuje pomóc ; mam nadzieję, że to ^^; Przypuszczam, że to trochę w mój sposób "oddawania". –

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

Wygląda na to, że coś źle zinterpretowałeś.

Powyższy przykład po prostu tworzy tablicę jak

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

Jest to udokumentowane i działa dokładnie tak, jak zamierzał.

2

Powyższe nie pozwala na ścisłe wykonanie kodu, ale może zmienić przepływ sterowania istniejącego kodu, jeśli nie uwzględnia faktu, że dane mogą być tablicą.

Powodem powyższego działania jest to, że PHP interpretuje zmienne kończące się na [] jako tablice. Jeśli więc podasz wiele zmiennych GET o tej samej nazwie kończącej się na [], PHP utworzy tablicę zawierającą wszystkie wartości.

2

Krótka historia: bez wykonywania kodu. W przeciwnym razie, nie sądzisz, że ktoś już zhakowałby Facebooka? :)

Wydaje mi się, że osoba, która ci powiedziała, myliła się z innymi błędami, które wykorzystywały zagnieżdżanie w głębokich tablicach do wywołania przepełnienia bufora/podwójnego wolnego/jakiegoś innego wektora hackowego, które teoretycznie można wykorzystać do wykonania jakiegoś kodu. To są błędy oprogramowania, które można zobaczyć codziennie w wielu popularnych programach. Zwykle są szybko załatani.

Możecie znaleźć więcej informacji na http://www.suspekt.org/

5

Jeżeli nie jesteś pewien, jak się bezpieczny, najmniej można zrobić jest filtrowanie tablicy $ _GET. Oto funkcja:

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

Teraz można filtrować $ _GET tak:

$_GET = filter_url($_GET); 

To będzie zasadniczo oczyścić tablicę $ _GET z podejrzanych znaków takich jak [].

Dzięki

+0

To był doskonały i rozwiązany mój problem ... Dziękuję. Jeśli chcesz wiedzieć, miałem zastrzyki na mojej stronie internetowej i używając "mysqli_real_escape", blokowałem zastrzyki, ale również uniemożliwiałem działanie strony internetowej ... ale teraz, funkcja działa, a zastrzyk jest zablokowany. DZIĘKUJĘ – Darkeden

+0

@Darkeden: Serdecznie zapraszamy. – Sarfraz

+3

Świetne, proste rozwiązanie. W wyrażeniu regularnym występuje błąd, a-Z powinno być-z, w przeciwnym razie php daje błędy :) – Spaceship09

2

myślę, że mówi o czymś oceniającego inaczej, gdy przeszedł tablicę

strcasecmp($_GET['password'], $password) == 0) { echo($secret); } ` Jeśli zdasz pustą tablicę w strcasecmp oceni true dla jakikolwiek powód.

IE: hasło index.php = []

+0

+1 jest to również udokumentowane tutaj: https://www.owasp.org/index.php/PHP_Security_Cheat_Sheet#Input_handling –

0

adres URL chce być jak ten

www.mysite.com/page.php? name = Jan

ale chcesz, aby zapobiec wstawić coś takiego

www.mysite.com/page.php? nazwa [] = Jan

rozwiązanie:

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