Po drátě 5: Řešení úlohy č. 7

Hráče coby uživatele systému Po Drate Testing Intranet Solution (Corporate Enterprise Edition) přivítala informace o tom, že nejsou vítáni. Stačilo ale v adrese změnit hodnotu allowed na 1 a objevil se mnohem pohostinnější, ač poloprázdný, seznam úloh k testování. Přímo přístupných jich bohužel bylo jen málo. Na ty ostatní sice bylo možné se dostat úpravou parametru "id", ale i pak hráče odmítly s tím, že "Not public."

Úloha je téměř učebnicovou ukázkou SQL injection - zmíněný parametr id nebyl nijak ošetřený proti neplatným vstupům, takže bylo celkem snadné modifikovat SQL dotaz, do kterého se parametr vkládal. Tomu napomáhal ladící výpis v HTML komentáři, kde se celý dotaz (včetně jména tabulky) zobrazoval spolu s případným výstupem funkce mysql_error(). Popisky políček tabulce detailů úlohy navíc přesně odpovídaly jménům i pořadí sloupců v databázové tabulce.

Postupů, jak s těmito informacemi získat přístup k záznamu o úloze 7, je několik. Ten autorský nastavuje parametr id na řetězec "123456 UNION SELECT id, 1 as public, password as name, password, good, fail, notes FROM testing WHERE id=7". Tím pádem výsledek původního "SELECT *" zůstane prázdný, protože úloha 123456 neexistuje, a výsledek toho druhého SELECTu nám zase zajistí, že nalezená úloha bude zobrazena (public), a pro jistotu nechá heslo zobrazit v poli "name", protože pole "password" bez ohledu na heslo zobrazuje vždy text "(hidden)".

Pak sice zjistíme, že heslo je prázdné, ale to nám nevadí - poznámka k úloze (tedy pole notes) heslo ráda prozradí.

Zajímavosti

Jeden z neotřelejších způsobů řešení úlohy je následující: když neznáme SQL UNION, metodou postupného zkoušení zjistíme délku textu v poli notes přidáváním podtržítek do id=7 AND notes LIKE '____'. Dokud je délka špatně, vrací se nám chyba "Not exist", jakmile se trefíme, změní se na "Not public". Pokračujeme doplňováním písmenek abecedy za jednotlivá podtržítka, dokud neznáme celý text.

Chhoti Sadri je šestnáctitisícové městečko na severozápadě Indie, známé hlavně chrámem bohyně Bhavar Mátá z 5. století n.l.
Pokuta 100 000 rupií odpovídá zhruba 42 tisícům korun.

Autorem úlohy je matejcik.

Re: Po drátě 5: Řešení úlohy č. 7 JS (8. 12. 2010 - 13:40) Sbalit(2)
SQL injection jsem nikdy nedelal, ale zkousel jsem tu pismenkovou metodu, i kdyz trochu jinak - lexikografickym porovnavanim retezcu. Protoze jsem skrt, delal jsem to pulenim intervalu, takze to rychle selhalo na collating order (a cestine) v poznamkach. Tak jsem nasel funkci hex(), ktera vraci binarni data. Na nich se to pak pulilo jeste lepe. :-)
Re: Po drátě 5: Řešení úlohy č. 7 mecirt (9. 12. 2010 - 12:53) Sbalit(1)
Mňa UNION tiež nenapadol, tak som to vyriešil písmenkovou metódou perlovským skriptom. Dúfam že orgom veľmi nevadili tie tisíce HTTP requestov čo to poslalo :)