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