SQL Injection în serverul MySQL

SecurityLab.ru în colaborare cu Centrul de Formare „INFOSEC“ si magazine online Softkey.ru organizează un concurs pentru articolul naluchshuyu pe tema securității informațiilor.

injecție SQL - o vulnerabilitate care apare ca urmare a controalelor inadecvate primite de la un utilizator valori într-un script sau program. Voi lua în considerare injectarea în baza de date MySQL. Această bază de date este una dintre cele mai comune. Cu excepția cazului în care se convine altfel, se consideră, prin injecție în MySQL script php disponibile.

Identificarea SQL Injection.

De multe ori, prezența de eroare SQL Injection se poate spune, indicând în mod clar că o eroare a avut loc în interogarea SQL. În același timp, existența unor erori într-o interogare SQL poate fi judecat de dovezi circumstanțiale.

Analiza bazei de date MySQL prin injectare.

Disponibilitatea mesajului de eroare detaliat cu textul interogării SQL, în care a apărut eroarea va reduce dificultatea de exploatare a SQL Injection la un nivel minim. Cu toate acestea, multe se poate face chiar dacă mesajele de eroare nu sunt afișate deloc.

Ar trebui să ia act de faptul că, chiar dacă este afișat textul de eroare, puteți totuși judeca în mod clar dacă a apărut o eroare sau nu (de exemplu, interogarea returnează un rezultat gol).

În special, pot exista situații în eroare, returnează codul de răspuns de 500, sau de a redirecționa către pagina principală, în timp ce un set de rezultate gol vor fi returnate la o pagină goală.

Pentru a identifica aceste semne secundare ar trebui să facă cereri http, care sunt cunoscute, ceea ce va conduce la dreapta (dar returnează un gol concluzie) cerere SQL, și care va duce la o interogare SQL incorectă. De exemplu, atunci când parametrii de filtrare id

Acum, că știm cum să distingă o solicitare eronată de la un gol, începe să extragă în mod constant informații despre interogare și baza de date.

Luați în considerare cazul în care are loc o injecție după unde. Dacă luăm în considerare baza de date MySQL, primirea informațiilor din baza de date poate fi posibilă numai în cazul în care serverul este versiunea 4. *, cele pe care le este posibil să se introducă în cererea de unire

1) Numărul de câmpuri între selecteze și în cazul în care

Noi încercăm în mod repetat până când obțineți interogarea corectă:

mai mult, în cazul în care nu este posibil să se separe cererea invalidă de returnare un rezultat gol, puteți face acest lucru:

În acest scop, este suficient să se poată separa dreptul la cerere greșită, și este întotdeauna posibil, în cazul în care există existența SQL Injection.

După ce primim o cerere valabilă, numărul de nul, va fi egal cu numărul de câmpuri între selecteze și în cazul în care

2) Numărul coloanei cu retragerea. Vom avea nevoie să știe în ce se întâmplă pe coloana de cont scris pe pagina.

În acest caz, în cazul în care producția este pe pagina de câțiva parametri, cel mai bine pentru a găsi unul este că pare să aibă cea mai mare cantitate de tipuri de date (text cel mai bun), cum ar fi descrierea produsului, textul articolului și așa mai departe. Cautam el

Și până atunci, până când vom vedea testul cuvânt în locația dorită.

Trebuie remarcat faptul că, în acest caz, una dintre aceste interogări ar reveni valoare non-nulă.

Aici puteți rula într-o capcană: script-ul, poate exista un test de a nu nule unul dintre parametrii (de exemplu, id-ul) nu va trebui să utilizeze MySQL proprietate, de tip numeric poate fi distribuit pentru orice tip de date, fără o eroare, și astfel că își va păstra sale valoare.

Același truc va avea loc și în cazul în care ghilimelele sunt scăpat.

Acum este posibil să sortați numele de masă.

interogările corespunzătoare vor fi conforme cu numele tabelului existent. Probabil, va fi interesant pentru a verifica existența tabelei de utilizatori, parole, etc regusers și etc

avem suficiente informații pentru a face o astfel de cerere.

În cazul în care, această interogare ne va întoarce la hash parolele ar trebui să aibă dreptul de a selecta dintr-o bază de date de baze de date MySQL, care, în cele mai multe cazuri, ușor de decodat. Atunci când un singur rând de interogare (de exemplu, în loc de corpul articolului), puteți trece prin rândurile

În plus, puteți învăța o mulțime de lucruri interesante:

5) numele coloanelor din tabel

fișiere text prin injectare MySQL.

În cazul în care utilizatorul sub care avea acces la baza de date, are dreptul la file_priv, puteți obține textul unui fișier arbitrar

scrierea fișierelor în directorul web (php shell).

Experiența a arătat că, dacă avem file_priv dreapta, directorul este inscriptibil pentru toți utilizatorii disponibile în plus față de web, (uneori, încărcați directoare, bannere, etc), precum și cunosc numele a cel puțin o masă (mysql.user, de exemplu, se va face, dacă aveți acces la baza de date MySQL), puteți încărca orice fișier la server folosind o injecție de tip similar.

În același timp, de la proiectare necesar Table1.

În cazul în care, în plus, site-ul are vulnerabilități, ceea ce permite să execute fișiere arbitrare pe server, (include ( „/ calea / $ file.php“)), apoi, în orice caz, puteți încărca un shell php, de exemplu, în directorul / tmp /, și apoi pentru a ridica fișierul de acolo cu ajutorul vulnerabilitate pentru a include.

injecție poslelimit.

Destul de des posibil, prin injecție SQL apare în parametrii trecut la limita. Acest lucru poate fi un număr de pagină, etc și etc

Practica arată că toate cele de mai sus poate fi aplicată în acest caz.

MySQL răspunde corect la întrebări, cum ar fi:

Selectați ... limita de unire 1,2 selectați ....

Selectați ... limita de 1 uniune selectați ....

Dacă doriți să primul sub-interogare a returnat un rezultat gol, cilindree mare, este necesar să se stabilească în mod artificial pentru prima solicitare:

Selectați ... limita 99999,1 unire selectați .... Sau, selectați ... limită de unire 1,0 selectați ....

unele „capcane“.

Cele mai frecvente Capcană poate fi includerea de magie de configurare citate php. Acest șir parametru este posibilă, în general, pentru a evita SQL Injection, iar în cazul unui parametri (fracționată), aceste cereri nu pot fi folosite citate, și, prin urmare, linia.

rezolva parțial această problemă ne va ajuta să char funcție care returnează un șir de caractere. de exemplu

Singura restricție. În cazul în care, dacă doriți să faceți în outfile, precum și numele de fișier, trebuie să transferați numele fișierului în ghilimele. în char outfile (.) returnează o eroare.

S-ar părea că acest server de web modul apache, ceea ce face imposibil să funcționeze vulnerabilitatea injecție SQL. Cu toate acestea, în unele configurații, PHP și acest modul, atacul poate fi efectuată în mod transparent pentru acest modul.

Modulul mod_security de configurare implicit nu filtrează valoarea este trecut ca un cookie. În același timp, în unele cazuri, iar în unele configurații, PHP implicit, variabilele cookie sunt înregistrate automat.

Astfel, variabile rău intenționate, complet transparent mod_security poate fi trimis ca valoare cookie.

DOS în injecție MySQL.

Dacă nu există nici o posibilitate de a folosi unirea într-o interogare, de exemplu, MySQL este versiunea 3. *, apoi, cu toate acestea, injecția poate fi operată, de exemplu, pentru a face serverul de baze de date pentru a epuiza resursele.

Pentru a face acest lucru, vom folosi funcția BENCHMARK care repetă executarea numărului expr specificat de ori specificat în contorul de argumente. Ca expresie generală să luăm funcția, care, în sine necesită ceva timp. De exemplu, md5 (). Deoarece linia ia current_date, astfel încât șirul nu conține ghilimele. Funcția Benchmark poate fi imbricate. Și astfel, intocmim o cerere:

1000000 interogări MD5 sunt realizate (în funcție de capacitatea serverului), aproximativ 5 secunde 10000000 se va efectua aproximativ 50 de secunde. valoare de referință va lua o imbricate lungă perioadă de timp, pe orice server. Acum, va trimite până la câteva zeci de cereri http similare pe secundă pentru a intra pe serverul de nestăpânit jos.

Alte tipuri de injectare MySQL.

valori întregi de filtrare pentru parametrii întregi și citate pentru parametrii string sunt uneori insuficiente. Uneori, aplicarea funcționalitate nezaplaniruemoy poate provoca% și _ ca caractere speciale în interogare. De exemplu:

mysql_query ( "select id-ul de la utilizatori în cazul în care parola ca '" .addslashes ($ parola). " 'și de utilizator cum ar fi'" "" .addslashes ($) de utilizator.');

în acest caz, pentru a se potrivi orice parolă de utilizator%

În unele cazuri, injectarea SCR este posibilă chiar și în setarea, care este convertit prin metode modulul apache mod_rewrite, GET parametru la script-ul.

De exemplu, /news/127.html script-uri de tip sunt convertite în /news/news.php?id=127 următoarea regulă: RewriteRule ^ / stiri / \ html $ "/news/news.php?id=$1" (*.).

Acesta va transmite valorile parametrilor de script rău intenționate. De exemplu /news/128-1.html

scurt pentru protecție.

Pentru a proteja împotriva tuturor celor de mai sus este suficient să urmeze câteva reguli simple.

1) pentru întreg și valorile fracționate înainte de a le utiliza în rezultatul interogării în cantitate suficientă pentru tipul dorit.

În schimb, aveți posibilitatea să inserați pentru sistemul de urmărire de testare pentru injectare SQL.

// scrie în jurnalul de pe această încercare

2) pentru parametrii șirului care nu sunt utilizate ca, regexp și TD, scut ghilimele.

3) linii, care sunt presupuse a fi utilizate în interior cum ar fi, regexp, și așa mai departe, este de asemenea necesar să se sorteze caracterele speciale utilizate în aceste situații, dacă este necesar. În caz contrar, este posibil să se documenteze utilizarea acestor simboluri.

Compania Softkey - un serviciu unic pentru clienți, dezvoltatori, dealeri și parteneri afiliați. În plus, acesta este unul dintre cele mai bune magazine online din România, Ucraina, Kazahstan, care oferă clienților o gamă largă, varietate de metode de plată, operaționale (de multe ori instantanee), procesarea comenzilor, urmărirea procesului de onorare a comenzilor în secțiunea cu informații personale, reduceri de la magazin și producătorii software-ul.

  • SQL Injection în serverul MySQL
  • SQL Injection în serverul MySQL
  • SQL Injection în serverul MySQL
  • SQL Injection în serverul MySQL

SQL Injection în serverul MySQL