Kurz SQL Injection: Jak se učit s příkladem

Co je to SQL Injection?

SQL Injection je útok, který otráví dynamické příkazy SQL, aby okomentovaly určité části příkazu nebo připojily podmínku, která bude vždy pravdivá. Využívá konstrukčních chyb ve špatně navržených webových aplikacích ke zneužívání příkazů SQL ke spouštění škodlivého kódu SQL.

Data jsou jednou z nejdůležitějších součástí informačních systémů. Webové aplikace využívající databázi používá organizace k získávání dat od zákazníků. SQL je zkratka pro Structured Query Language. Slouží k získávání a manipulaci s daty v databázi.

SQL Injection

Jak funguje SQL Injection Attack?

Typy útoků, které lze provést pomocí SQL injection, se liší v závislosti na typu databázového stroje. Útok funguje na dynamických SQL příkazech. Dynamický příkaz je příkaz, který je generován za běhu pomocí parametrů heslo 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 HTML formuláře 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 odešle na adresu a PHP soubor s názvem index.php.
  • Má možnost uložit relaci přihlášení do souboru cookie. To jsme odvodili ze zaškrtávacího políčka Remember_me. K odesílání dat používá metodu post. To znamená, že hodnoty se v URL nezobrazují.

Předpokládejme, že příkaz na backendu pro kontrolu ID uživatele je následující

SELECT * FROM users WHERE email = $_POST['email'] AND password = md5($_POST['password']);

TADY,

  • Výše uvedený příkaz používá hodnoty $_POST[] pole přímo bez jejich dezinfekce.
  • Heslo je zašifrováno pomocí algoritmu MD5.

Budeme ilustrovat útok SQL injection pomocí sqlfiddle. Otevřete adresu URL http://sqlfiddle.com/ ve vašem webovém prohlížeči. Zobrazí se následující okno.

Poznámka: budete muset napsat příkazy SQL

SQL Injection funguje

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) Klepněte na tlačítko Sestavit schéma

Krok 3) Zadejte tento kód do pravého panelu

select * from users;

Krok 4) Klikněte na Spustit SQL. Uvidíte následující výsledek

SQL Injection funguje

Předpokládejme, že uživatelský spotřební materiál admin@admin.sys si 1234 jako heslo. Příkaz, který se má provést proti databázi, by byl

SELECT * FROM users WHERE email = 'admin@admin.sys' AND password = md5('1234');

Výše uvedený kód lze zneužít zakomentováním části hesla a připojení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čí jednou 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ý příkaz SQL a vložte jej SQL FiddleSpusťte textové pole SQL, jak je znázorněno níže

SQL Injection funguje

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 dezinfekce e-mailového pole. To znamená, že náš výše uvedený kód nelze použít k obejití přihlášení.

Abychom to obešli, můžeme místo toho využít pole hesla. Níže uvedený diagram ukazuje kroky, které musíte dodržet

SQL Inject webové aplikace

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

SQL Inject webové aplikace

  • Klikněte na tlačítko Odeslat
  • Budete přesměrováni na řídicí panel

Vygenerovaný příkaz SQL bude vypadat následovně

SELECT * FROM users WHERE email = 'xxx@xxx.xxx' AND password = md5('xxx') OR 1 = 1 -- ]');

Níže uvedený diagram ilustruje vygenerované prohlášení.

SQL Inject webové aplikace

TADY,

  • Příkaz inteligentně předpokládá, že je použito šifrování md5
  • Doplní jednoduchou uvozovku a uzavírací závorku
  • Připojí k výroku podmínku, která bude vždy pravdivá

Obecně platí, že úspěšný útok SQL Injection se pokouší provést úspěšný útok řadou různých technik, jako jsou ty demonstrované výše.

Další typy útoků SQL Injection

SQL Injections může způsobit více škody než pouhé předání přihlašovacích algoritmů. Některé z útoků zahrnují

  • 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živatele atd
  • SQL injection na základě cookies
  • Chybová injekce SQL
  • Blind SQL Injection

Výše uvedený seznam není vyčerpávající; jen vám dává představu o tom, co SQL Injection

Automatizační nástroje pro SQL Injection

Ve výše uvedeném příkladu jsme použili techniky ručního útoku založené na našich rozsáhlých znalostech SQL. Existují automatizované nástroje, které vám pomohou provádět ú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ému vstupu by se nikdy nemělo věřit – Před použitím v dynamických příkazech SQL musí být vždy dezinfikován.
  • Uložené procedury – tyto mohou zapouzdřit příkazy SQL a zacházet se všemi vstupy jako s parametry.
  • Připravené výpisy - připravené příkazy fungovat tak, že nejprve vytvoříte příkaz SQL a poté budete všechna odeslaná uživatelská data považovat za parametry. To nemá žádný vliv na syntaxi příkazu SQL.
  • Regulární výrazy - tyto lze použít k detekci potenciálního škodlivého kódu a jeho odstranění před provedením příkazů SQL.
  • Přístupová práva uživatele připojení k databázi – k používaným účtům by měla být udělena pouze nezbytná přístupová práva připojit k databázi. To může pomoci snížit výkon příkazů SQL na serveru.
  • Chybové zprávy – ty by neměly odhalit citlivé informace a kde přesně došlo k chybě. Jednoduché vlastní chybové zprávy jako „Je nám líto, došlo k technickým chybám. Technický tým byl kontaktován. Zkuste to znovu později“ lze použít místo zobrazení příkazů SQL, které způsobily chybu.

Hacking Activity: Použijte Havij pro SQL Injection

V tomto praktickém scénáři použijeme program Havij Advanced SQL Injection k prohledání zranitelností webu.

Poznámka: vaše antivirový program může jej označit kvůli jeho povaze. Měli byste jej přidat do seznamu výjimek nebo pozastavit antivirový software.

Obrázek níže ukazuje hlavní okno pro Havij

Použijte Havij pro SQL Injection

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

Shrnutí

  • SQL Injection je typ útoku, který využívá špatné příkazy SQL
  • SQL injection lze použít k obcházení přihlašovacích algoritmů, načítání, vkládání a aktualizaci a mazání dat.
  • Nástroje pro vkládání SQL zahrnují SQLMap, SQLPing a SQLSmack atd.
  • Dobrá bezpečnostní politika při psaní příkazu SQL může pomoci snížit útoky SQL injection.