Injecție de injecție

Introducerea SQL-cod (injecție SQL limba engleză.) - una dintre cele mai comune modalități de a hack site-uri și programe, care lucrează cu baze de date, bazate pe introducerea unei cereri SQL-cod arbitrar.

injecție SQL, în funcție de tipul de baze de date și introducerea unor condiții poate permite unui atacator să execute interogare arbitrare la baza de date (de exemplu, pentru a citi conținutul de la orice masă, elimina, modifica sau adăuga date) să fie capabil să citească și / sau scrie fișiere locale și executa comenzi arbitrare pe serverul atacat.

Un atac de tip SQL de injectare poate fi posibil din cauza procesării incorecte a datelor de intrare utilizate în interogările SQL.

Dezvoltatorul programelor de aplicații care lucrează cu bazele de date ar trebui să fie conștienți de astfel de vulnerabilități și să ia măsuri pentru a contracara implementarea SQL.

Principiul atacurilor de injecție SQL

Să presupunem că software-ul server, după ce a primit ID-ul parametrului de intrare, îl folosește pentru a crea o interogare SQL. Luați în considerare următorul script PHP:

Astfel, modificarea parametrilor de intrare prin adăugarea de constructori de limbaj SQL le determină o schimbare în logica executării interogării SQL (în acest exemplu, în loc de știri cu identificatorul dat, toate știrile din baza de date vor fi selectate, deoarece expresia 1 = 1 este întotdeauna adevărată).

Embedding în Parametrii de coarde

Să presupunem că software-ul de server, după ce a primit o interogare pentru a căuta date în știri cu ajutorul parametrului search_text, o folosește în următoarea interogare SQL (aici parametrii sunt evacuați cu ghilimele):

Dar, prin introducerea ghilimelei în parametrul search_text (care este folosit în interogare), putem schimba drastic comportamentul interogării SQL. De exemplu, trecând valoarea ") + și + (news_id_author = '1 ca parametru search_text, numim interogarea:

Folosind UNION

Limba SQL vă permite să combinați rezultatele mai multor interogări utilizând operatorul UNION. Acest lucru permite unui atacator să obțină acces neautorizat la date.

Luați în considerare scriptul de afișare a știrilor (ID-ul de știri pe care doriți să îl afișați este trecut în parametrul id):

Dacă un atacator trece parametrul -1 UNION SELECT 1, numele de utilizator, parola, 1 FROM din parametrul id ca parametru id, aceasta va cauza executarea interogării SQL

Deoarece identificator de știri -1, evident, nu există, tabelul de știri este selectat înregistrare audio, dar va scădea în înregistrările rezultate neautorizate selectate din tabelul de administrare rezultată prin injecție SQL.

Folosind UNION + group_concat ()

În unele cazuri, un hacker poate efectua un atac, dar nu poate vedea mai mult de o coloană. În cazul MySQL, un atacator poate folosi funcția: care combină mai multe coloane într-una. De exemplu, pentru exemplul de mai sus, apelul funcției va fi:

Protejați coada cererii

Împărțirea unei interogări SQL

Pentru a separa comenzile din SQL, utilizați simbolul; (punct și virgulă), prin injectarea acestui caracter în interogare, un atacator poate executa mai multe comenzi într-o singură interogare, dar nu toate dialectele SQL suportă această caracteristică.

De exemplu, în cazul în care parametrii script-ul este transmis printr-o structură care cuprinde un punct și virgulă, de exemplu 12; INSERT INTO admin (nume de utilizator, parola) VALORI ( „HACKER“, „foo“); apoi într-o singură cerere, vor fi executate 2 comenzi și intrarea HaCkEr va fi adăugată la tabelul de administrare neautorizat.

Tehnica atacurilor, cum ar fi introducerea codului SQL

Căutați scripturi vulnerabile la atac

În acest stadiu, atacatorul studiază comportamentul scripturilor de server atunci când manipulează parametrii de intrare pentru a detecta comportamentul lor anormal. Manipularea are loc cu toți parametrii posibili:
  • Datele au trecut prin metodele POST și GET
  • Valorile lui [HTTP-Cookie]
  • HTTP_REFERER (pentru scripturi)
  • AUTH_USER și AUTH_PASSWORD (când se utilizează autentificarea)
De regulă, manipularea este redusă la substituirea în parametrii caracterului unui singur ghilimel (mai puțin frecvent dublu sau spate).

Un comportament anormal este orice comportament în care paginile primite înainte și după înlocuirea cotelor sunt diferite (și pagina despre formatul incorect al parametrilor nu este afișată).

Cele mai frecvente exemple de comportament anormal sunt:
  • este afișat un mesaj despre diverse erori;
  • Atunci când solicitați date (de exemplu, știri sau lista de produse), datele solicitate nu sunt afișate deloc, deși pagina este afișată
etc. Trebuie să se ia în considerare faptul că există cazuri cunoscute în care mesajele de eroare, datorită specificității aspectului paginii, nu sunt afișate în browser, deși sunt prezente în codul său HTML.

Pentru a vă proteja împotriva acestui tip de atac, trebuie să filtrați cu atenție parametrii de intrare ale căror valori vor fi folosite pentru a construi interogarea SQL.

Filtrarea parametrilor de șir

Să presupunem că codul care generează interogarea (în limbajul de programare Pascal) arată astfel:

Pentru a implementa codul a fost imposibil, pentru unele DBMS, inclusiv MySQL, trebuie să citezi toți parametrii string. În parametrul înlocui citate în „apostrof în \„backslash la \\ (aceasta se numește“screening caractere speciale") Este posibil să se facă un astfel de cod .:

Pentru PHP, filtrarea poate fi:

Filtrarea parametrilor întregi

Să luăm o altă interogare:

În acest caz, id-ul câmpului are un tip numeric și nu poate fi citat. Prin urmare, "citarea" și înlocuirea caracterelor speciale cu secvențe de escape nu funcționează. În acest caz, tipul de verificare ajută; dacă variabila id nu este un număr, interogarea nu ar trebui executată deloc.

De exemplu, pe Delphi, pentru a contracara astfel de injecții, codul ajută:

În cazul unei erori, funcția StrToInt aruncă o excepție EConvertError, iar în manualul său va fi posibilă afișarea unui mesaj de eroare. Conversia dublă oferă un răspuns corect la numerele în format $ 132AB (notație hexazecimală). La standardul Pascal, care nu poate face față excepțiilor, codul este oarecum mai complicat.

Pentru PHP, această metodă va arăta astfel:

Trăsnete de intrare Parametri

Pentru a face schimbări în logica executării interogării SQL, este necesar să se implementeze linii suficient de lungi. Astfel, lungimea minimă a unui șir încorporat în exemplele de mai sus este de 8 caractere ("1 OR 1 = 1"). Dacă lungimea maximă a valorii corecte a parametrului este mică, atunci una dintre metodele de protecție poate fi trunchierea maximă a valorilor parametrilor de intrare.

De exemplu, dacă știți că câmpul ID din exemplele de mai sus nu poate depăși 9999, puteți "tăia" caracterele suplimentare, lăsând nu mai mult de patru:

Utilizarea interogărilor parametrizate

Multe servere de baze de date susțin abilitatea de a trimite interogări parametrizate. În acest caz, parametrii de origine externă sunt trimiși către server separat de cererea însăși sau sunt evacuați automat de biblioteca clientului. În acest scop,
  • pe Delphi - proprietatea TQuery.Params;
  • Perl - prin DBI :: citat sau DBI :: pregătește;
  • pe Java - prin clasa PreparedStatement;
  • pe C # - proprietatea SqlCommand.Parameters;
  • pe PHP (când lucrezi cu MySQL) - funcțiile mysql_escape_string, mysql_real_escape_string, addslashes.
  • pe Parser - limba însăși împiedică astfel de atacuri.