Kurz SQL Injection: Učte se s příkladem
⚡ Chytré shrnutí
SQL injection je útok, který zneužívá dynamické SQL příkazy, aby obešel ověřování nebo zpřístupnil data, a zneužívá webové aplikace, které vytvářejí dotazy z neošetřených uživatelských vstupů. Tato stránka ukazuje, jak útok funguje a jak mu předcházet.

Co je to SQL Injection?
SQL Injection je útok, který zneužívá dynamické SQL příkazy tak, že zakomentuje určité části příkazu nebo přidá podmínku, která bude vždy pravdivá. Využívá konstrukčních nedostatků ve špatně navržených webových aplikacích k zneužití SQL příkazů ke spuštění škodlivého SQL kódu.
Data jsou jednou z nejdůležitějších součástí informačních systémů. Webové aplikace založené na databázích používají organizace k získávání dat od zákazníků. SQL je zkratka pro strukturovaný dotazovací jazykPoužívá se k načítání a manipulaci s daty v databázi.
Jak funguje útok SQL injection?
Typy útoků, které lze provést pomocí SQL injection, se liší v závislosti na typu databázového enginu. Útok funguje na dynamických SQL příkazech. Dynamický příkaz je příkaz, který je generován za běhu pomocí parametrů předaných z webového formuláře nebo řetězce dotazu URI.
Příklad SQL Injection
Uvažujme jednoduchou webovou aplikaci s přihlašovacím formulářem. Kód pro HTML formulář je uveden níže.
<form action=‘index.php’ method="post"> <input type="email" name="email" required="required"/> <input type="password" name="password"/> <input type="checkbox" name="remember_me" value="Remember me"/> <input type="submit" value="Submit"/> </form>
TADY,
- Výše uvedený formulář přijímá e-mailovou adresu a heslo a poté je odesílá do PHP soubor s názvem index.php.
- Má možnost ukládat přihlašovací relaci do souboru cookie. To jsme odvodili ze zaškrtávacího políčka remember_me. Pro odeslání dat používá metodu post. To znamená, že hodnoty se nezobrazují v souboru cookie. URL.
Předpokládejme, že příkaz na backendu pro kontrolu ID uživatele vypadá takto.
SELECT * FROM users WHERE email = $_POST['email'] AND password = md5($_POST['password']);
TADY,
- Výše uvedený příkaz používá hodnoty pole $_POST[] přímo bez jejich sanitizace.
- Heslo je hašováno pomocí algoritmu MD5.
Ukážeme si útok SQL injection pomocí SQL Fiddle. Otevři URL http://sqlfiddle.com/ ve vašem webovém prohlížeči. Zobrazí se následující okno.
Poznámka: Budete muset napsat SQL příkazy.
Krok 1) Zadejte tento kód do levého panelu.
CREATE TABLE `users` ( `id` INT NOT NULL AUTO_INCREMENT, `email` VARCHAR(45) NULL, `password` VARCHAR(45) NULL, PRIMARY KEY (`id`)); insert into users (email,password) values ('m@m.com',md5('abc'));
Krok 2) Klikněte na Vytvořit schéma.
Krok 3) Zadejte tento kód do pravého panelu.
select * from users;
Krok 4) Klikněte na Spustit SQL. Zobrazí se následující výsledek.
Předpokládejme, že uživatel zadá admin@admin.sys a heslo 1234. Příkaz provedený pro databázi by vypadal takto:
SELECT * FROM users WHERE email = 'admin@admin.sys' AND password = md5('1234');
Výše uvedený kód lze zneužít zakomentováním části s heslem a přidáním podmínky, která bude vždy pravdivá. Předpokládejme, že útočník zadá do pole e-mailové adresy následující vstup.
xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ]
xxx pro heslo.
Vygenerovaný dynamický příkaz bude vypadat následovně.
SELECT * FROM users WHERE email = 'xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ] AND password = md5('1234');
TADY,
- xxx@xxx.xxx končí jednoduchou uvozovkou, která doplňuje řetězcovou uvozovku.
OR 1 = 1LIMIT 1 je podmínka, která bude vždy pravdivá a omezuje vrácené výsledky pouze na jeden záznam.- — ' AND … je komentář SQL, který eliminuje část hesla.
Zkopírujte výše uvedený SQL příkaz a vložte ho do SQL Fiddle Spusťte textové pole SQL, jak je znázorněno níže.
Hacking Activity: SQL Inject a Web Application
Máme jednoduchou webovou aplikaci na http://www.techpanda.org/ ...který je zranitelný vůči útokům SQL Injection pouze pro demonstrační účely. Výše uvedený kód HTML formuláře je převzat z přihlašovací stránky. Aplikace poskytuje základní zabezpečení, jako je například sanitace pole e-mailu. To znamená, že výše uvedený kód nelze použít k obejití přihlášení.
Abychom se tomu vyhnuli, využijeme místo toho pole pro heslo. Následující diagram ukazuje kroky, které je třeba dodržet.
Předpokládejme, že útočník poskytne následující vstup.
- Krok 1: Zadejte xxx@xxx.xxx jako e-mailovou adresu
- Krok 2: Zadejte xxx') NEBO 1 = 1 — ]
- Klikněte na tlačítko Odeslat.
- Budete přesměrováni na řídicí panel.
Vygenerovaný SQL příkaz bude vypadat následovně.
SELECT * FROM users WHERE email = 'xxx@xxx.xxx' AND password = md5('xxx') OR 1 = 1 -- ]');
Níže uvedený diagram znázorňuje, jak je příkaz generován.
TADY,
- Příkaz inteligentně předpokládá, že je použito šifrování md5.
- Doplňuje jednoduchou uvozovku a uzavírací závorku.
- Připojí k příkazu podmínku, která bude vždy pravdivá.
Obecně platí, že úspěšný útok kombinuje několik technik, jako jsou ty uvedené výše.
Další typy útoků SQL Injection
SQL injections mohou napáchat více škody než jen obcházení přihlašovacích algoritmů. Mezi útoky patří například:
- Mazání dat
- Aktualizace dat
- Vkládání dat
- Provádění příkazů na serveru, které mohou stahovat a instalovat škodlivé programy, jako jsou trojské koně
- Export cenných dat, jako jsou údaje o kreditní kartě, e-mail a hesla, na vzdálený server útočníka
- Získání přihlašovacích údajů uživatelů atd.
- SQL injection na základě cookies
- Chybová injekce SQL
- Blind SQL Injection
Výše uvedený seznam není vyčerpávající; pouze vám dává představu o tom, co SQL Injection dokáže.
Automatizační nástroje pro SQL Injection
Ve výše uvedeném příkladu jsme použili manuální techniky útoku založené na našich rozsáhlých znalostech SQL. Existují automatizované nástroje, které vám mohou pomoci provést útoky efektivněji a v co nejkratším čase. Mezi tyto nástroje patří:
- SQLMap – http://sqlmap.org/
- jSQL injection – https://www.kali.org/tools/jsql/
Jak zabránit útokům SQL injection
Organizace může přijmout následující zásady, aby se chránila před útoky SQL Injection.
- Uživatelským vstupům by se nikdy nemělo věřit – Před použitím v dynamických SQL příkazech musí být vždy „sanitizován“.
- Uložené procedury – tyto mohou zapouzdřovat SQL příkazy a zacházet se všemi vstupy jako s parametry.
- Připravené výkazy – připravené příkazy fungují tak, že nejprve vytvoří SQL příkaz a poté se se všemi odeslanými uživatelskými daty zachází jako s parametry. Toto nemá žádný vliv na syntaxi SQL příkazu.
- Pravidelné výrazy – tyto lze použít k detekci potenciálně škodlivého kódu a jeho odstranění před spuštěním SQL příkazů.
- Přístupová práva uživatelů k databázovému připojení – účtům používaným k připojit k databázi. To může pomoci snížit výkon příkazů SQL na serveru.
- Chybové zprávy – tyto by neměly odhalovat citlivé informace ani přesné místo, kde k chybě došlo. Místo zobrazení příkazů SQL, které chybu způsobily, lze použít jednoduché vlastní chybové zprávy, například „Omlouváme se, došlo k technickým chybám. Technický tým byl kontaktován. Zkuste to prosím znovu později“.
Hacking Activity: Použijte Havij pro SQL Injection
V tomto praktickém scénáři používáme program Havij Advanced SQL Injection k prohledání webových stránek a nalezení zranitelností.
Poznámka: Havij je zastaralý, neudržovaný Windows nástroj — SQLMap výše je aktuálním standardem s otevřeným zdrojovým kódem.
Poznámka: Váš antivirový program jej může kvůli jeho povaze označit. Měli byste jej přidat do seznamu vyloučených programů nebo pozastavit jeho antivirový program.
Obrázek níže ukazuje hlavní okno programu Havij.
Výše uvedený nástroj lze použít k posouzení zranitelnosti webové stránky nebo aplikace.








