SQL Injection pre každého

V dnešnej dobe plnej webových frameworkov, databázových knižníc a ORM by som tak trochu čakal, že webov náchylných na SQL Injection už nebude veľmi veľa. Opak je však pravdou a zaútočiť na tieto weby pomocou SQL Injection už môže naozaj ktokoľvek, stačí mu len vhodný nástroj a trochu trpezlivosti.

SQL Injection

SQL Injection je technika namierená proti (nielen) webovým aplikáciám využívajúcim SQL databázu. Myšlienkou je databáze vhodne podstrčiť dáta, napríklad v URL alebo prostredníctvom formulára, ktoré následne databáza vykoná. SQL Injection využíva bezpečnostné chyby v aplikáciach, najčastejšie nekontrolovanie vstupu od používateľa.

Celú myšlienku najlepšie ilustruje XKCD komix Exploits of a Mom

Predstavte si napríklad SQL výraz

statement = "SELECT * FROM users WHERE name ='" + userName + "';"

ak ako userName zadáte napríklad

' or '1'='1

stane sa z neho

SELECT * FROM users WHERE name = '' OR '1'='1';

A výsledkom je zoznam všetkých používateľov z databázy. Injectovať môžete samozrejme akékoľvek SQL, napríklad zmazanie nejakej tabuľky, vloženie nového záznamu a podobne.

Ako nájsť potencionálne zraniteľné weby?

Najjednoduchší spôsob je nájsť weby, ktoré obsahujú v URL index.php?id= alebo asp?id=. Na to stačí do Google zadať

allinurl:  asp?id= OR index.php?id=	

Prípadne to môžete trochu obmedziť a skúšať napadnúť len české weby

allinurl:  asp?id= OR index.php?id= site:.cz	

Ako zaútočiť?

Najjednoduchší spôsob útoku je použiť nejaký nástroj, na ktorého ovládanie nemusíte o SQL Injection v podstate nič vedieť. Odporúčam Havij, ktorý je celkom dobre použiteľný aj v bezplatnej verzii, najmä ak budete napádať klasické PHP+MySQL weby. (Pozor: Zdá se že program Havij byl infikován, použijte raději jinou aplikaci.)

get_data_1_2

Havij sa používa naozaj jednoducho, zadáte URL, stlačíte Analyze a čakáte. Ak máte šťastie, dostanete oznam o úspechu, ak nie, pokračujete ďalším z nájdených webov. V prípade úspechu sa prepnete na záložku Tables a môžete skúmať jednotlivé tabuľky, stĺpce a hlavne ich dáta.

Prvý web náchylný na SQL Injection, ktorý som po pár pokusoch našiel, obsahoval zahashované heslá. Ak ide o MD5, čo je väčšina prípadov, môžete použiť záložku MD5 skúsiť heslo k danému hashu zisť z niektorého reverse md5 lookup webu.

Ako sa brániť?

Kontrolujte vstupné dáta. Proces ošetrenia vstupu a odstránenia nebezpečných výrazov sa v angličtine označuje sanitize a pre každý jazyk, framework, databázu je možné nájsť množstvo článok, ako na to. Napríklad pre PHP a MySQL je vhodné použiť mysqli_real_escape_string.

Aktualizace. Dodatek Michala Špačka:

Pokud se chcete bránit proti útoku SQL Injection, použijte třídy nebo funkce, které umožňují oddělit SQL dotaz od vstupních proměnných. Takové funkce a třídy pak tyto proměnné buď správně ošetří nebo rovnou posílají na server odděleně (nativní prepared statements), takže se nemůže stát, že nějakou proměnnou ošetřit zapomenete, pokud ji přímo nevložíte do samotného dotazu. Pro PHP existuje několik tříd, které oddělování dotazů od proměnných podporují, jsou to například nástroje jako je dibi, NotORM nebo funkce qsprintf z knihovny libphutil. Přímo v PHP je dostupná knihovna PDO a její metody prepare a execute. PDO neposkytuje všechny vymoženosti předchozích knihoven, chybí například podpora polí pro SQL dotaz INSERT INTO nebo podmínku WHERE IN. Při jejím rozšiřování si tak musíte dávat pozor na to, abyste do kódu nějakou zranitelnost nezavlekli.

Dalšími nástroji, které slouží pro testování zranitelnosti SQL Injection jsou např. Burp Suite, Zed Attack Proxy nebo dvojice sqlmap a nosqlmap. V každém případě takové nástroje zkoušejte pouze na vlastních webech a na webech, které jsou k testování buď výslovně určené nebo k tomu máte povolení provozovatele.

Autor je absolventom softvérového inžinierstva na Univerzite Karlovej v Prahe, pracuje ako Windows Azure a Windows Phone vývojár v Inmite, občas publikuje a prednáša.

Věděli jste, že nám můžete zasílat zprávičky? (Jen pro přihlášené.)

Komentáře: 70

Přehled komentářů

bubla To ještě funguje?
Martin Hassman Re: To ještě funguje?
Filip Procházka Re: To ještě funguje?
filip.jirsak Re: To ještě funguje?
Filip Procházka Re: To ještě funguje?
Michal Špaček Re: To ještě funguje?
VladaHejda Re: To ještě funguje?
Jakub Vrána Re: To ještě funguje?
Michal Špaček Re: To ještě funguje?
jlk Re: To ještě funguje?
Jinaq Re: To ještě funguje?
OndrejMirtes Re: To ještě funguje?
filip.jirsak proč se vydávají takovéhle nesmysly?
David Adamczyk Re: proč se vydávají takovéhle nesmysly?
GraslT Havij
Michal Špaček Jak se *opravdu* bránit?
Jakub Vrána Re: Jak se *opravdu* bránit?
Michal Špaček Re: Jak se *opravdu* bránit?
Jakub Vrána Re: Jak se *opravdu* bránit?
Michal Špaček Re: Jak se *opravdu* bránit?
Jakub Vrána Re: Jak se *opravdu* bránit?
Michal Špaček Re: Jak se *opravdu* bránit?
Jakub Vrána Re: Jak se *opravdu* bránit?
Jakub Vrána Re: Jak se *opravdu* bránit?
Michal Špaček Re: Jak se *opravdu* bránit?
Jakub Vrána Re: Jak se *opravdu* bránit?
Michal Špaček Re: Jak se *opravdu* bránit?
Jakub Vrána Re: Jak se *opravdu* bránit?
Michal Špaček Re: Jak se *opravdu* bránit?
DavidGrudl Dotaz na autora
HonzaMarek Re: Dotaz na autora
JakubKohout Re: Dotaz na autora
OndrejMirtes Re: Dotaz na autora
JakubKohout Re: Dotaz na autora
Jan Prachař Re: Dotaz na autora
karel Re: Dotaz na autora
Martin Hassman Re: Dotaz na autora
T3RMiX Re: Dotaz na autora
karel Re: Dotaz na autora
Kolemjdouci Re: Dotaz na autora
Martin Prokeš úroveň vysokoškolského vzdělání
arron Re: úroveň vysokoškolského vzdělání
Chobot Re: úroveň vysokoškolského vzdělání
thecnology db
Lamicz Jak píše SQL autor
Lamicz
David Grudl Re:
Chobot Re:
Martin Hassman
v2kt0r Re:
Martin Hassman Re:
dword Re:
Martin Hassman Re:
dword Re:
Martin Hassman Re:
dword Re:
Martin Hassman Re:
dword Re:
Martin Hassman Re:
dword Re:
dword Re:
Martin Hassman Re:
dword Re:
dword Re:
Marek Sirkovský FUD
Marek Sirkovský
PJ Re:
Martin Hassman Re:
Martin Hassman Re:
karel clanek na urovni seminarky prvaku stredni skoly

Komentáře nejsou povoleny.

Zobrazit komentáře
Zdroj: https://www.zdrojak.cz/?p=12831