[hackpl] ataki html injection, Hacking i komputery, Hacking, tutoriale
[ Pobierz całość w formacie PDF ]
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ąć?
źródłowy przedstawiony jest na Listin-
gach 1 i 2 (
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
–
. 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
2
www.hakin9.org
Hakin9 Nr 1/2004
P
rzyjrzyjmy się stronie, której kod
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:
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
:
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
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
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
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
</script>
%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=
<
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
<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
[ Pobierz całość w formacie PDF ]