site-ul atac DB

Special: Hacker, Sala # 052, p 052-084-1.

Ce poate atacator folosind SQL injection

Cu fiecare zi care trece, mai multe script-uri folosind baza de date, mai de încredere parolele clienților săi SQL baze de date hosting, site-uri mai populare merge pe forumuri publice și a motoarelor care lucrează cu MySQL. Dar nu toată lumea imagina în mod clar cât de periculos poate fi folosit prost concepută de script-uri MySQL.







Fără cunoștințe de bază de SQL limbaj este dificil de înțeles nimic. În primul rând, vom înțelege, ceea ce este esența tipului de atacuri SQL injection. De exemplu, pe serverul destinație este în valoare ca urmare a unui script PHP, care se bazează pe câmpul category_id preia titlurile articolelor din tabelul de articole și le afișează pentru utilizator:

// conectarea la MySQL

mysql_connect ($ dbhost, $ dbuname, $ dbpass) or die (mysql_error ());

mysql_select_db ($ DBNAME) sau die (mysql_error ());

$ Rezultat = mysql_query ( "SELECT article_id, ARTICLE_TITLE din articole în cazul în care category_id = $ cid"); // <- уязвимый запрос

în timp ce ($ out = mysql_fetch_array ($ rezultat)):

// afișează rezultatul într-o listă

De ce o greșeală? Să vedem ce au solicitat PHP MySQL. Variabila $ Cid este # 1“, atunci cererea ia o greșită din punct de vedere al MySQL: SELECT article_id, ARTICLE_TITLE din articole în cazul în care category_id = # 1' . Atunci când o eroare de sintaxă în șirul de interogare MySQL răspunde „EROARE 1064: Ai o eroare în sintaxa SQL.“. PHP nu recunoaște răspunsul și rapoartele de eroare pe care un hacker poate judeca prezența tipului de vulnerabilități SQL Injection. Evident, atacatorul va fi capabil de a seta variabila $ orice valoare CID ($ = $ _ cid GET [cid]) și, prin urmare, să modifice interogarea MySQL. De exemplu, în cazul în care $ Cid este egal cu „1 sau 1“ (fara ghilimele, la începutul și la sfârșitul anului), atunci MySQL returnează toate intrările CATEGORY_ID indiferent, din moment ce cererea va avea forma (..) în cazul în care category_id = 1 sau 1. Că este fie category_id = 1 (numai category_id înregistrare adecvată, egală cu 1) sau 1 (se potrivesc toate înregistrările, deoarece numărul este mai mare decât zero - întotdeauna adevărat).

Doar acești pași doar numite SQL Injection - SQL-injecții de cod în cererea de script pentru MySQL. un atacator poate avea acces la datele prin SQL Injection, are acces la scriptul vulnerabil: parolele pentru părțile restricționate ale site-ului, informațiile cărții de credit, parola pentru admin-ul, etc. Un hacker cu un succes pentru el circumstanțe va fi capabil de a executa comenzi pe server.

Un exemplu clasic de vulnerabilitatea tipului de SQL Injection - următoarea interogare: SELECT * adminilor WHERE autentificare = # „$ de conectare #“ și o parolă = MD5 (# „$ parola #“).

Uniunea și MySQL versiunea 4

Să ne întoarcem la script-ul a primit titluri de articole. De fapt, acesta permite unui atacator să câștige mult mai mult decât o listă a tuturor articolelor. Faptul este că, în MySQL versiunea 4 adaugă un nou operator - UNION, care este folosit pentru a combina rezultatele mai multor instrucțiuni SELECT într-un singur set de rezultate. De exemplu: article_id SELECT, ARTICLE_TITLE din articole UNION SELECT id, titlu de la sondaje. Ca rezultat, MySQL returnează intrările N, unde N - numărul de înregistrări dintr-o interogare din partea stângă, plus numărul de intrări din rezultatul interogării dreapta. Și toate acestea, în ordinea în care cererile sunt separarea Uniunii.

Dar există unele restricții privind utilizarea Uniunii:

1. Numerele indică coloana din toate interogările ar trebui să fie același: nedoputimo de a alege prima solicitare, de exemplu, ID-ul, numele, titlul, iar al doilea numai ARTICLE_TITLE;

2. Tipurile de coloane indică o singură solicitare trebuie să îndeplinească coloane rămase indică tipurile de cereri în cazul în care același tip de interogare selectat coloanele INT, TEXT, TEXT, TINYTEXT, și apoi cere coloanele rămase să fie selectate de același tip și în aceeași ordine;

3. Uniunea nu poate merge după limita operatorului și ordine.

Deci, cum ai devenit un complice al UNIUNII este atacator? În scenariul nostru este prezenta cerere „SELECT article_id, ARTICLE_TITLE din articole în cazul în care category_id = $ cid“. Ce împiedică un hacker folosind SQL Injection, introduceți un alt SELECT-interogare și selectați datele dorite să-l? Asta-i drept: nimic!

Să ne uităm la cererea modificată de la PHP pentru MySQL: SELECT article_id, ARTICLE_TITLE din articole în cazul în care category_id = 1 UNION SELECT 1,2. Ca răspuns MySQL returnează rezultatul primei SELECT (lista articole) și rezultatul celei de a doua SELECT - numărul „1“ în prima coloană, și „2“ în coloana a doua (SELECT + 1,2). Cu alte cuvinte, acum înlocuind # '# ​​1' și # „# 2“ numele reale ale coloanelor din orice tabel, va fi pentru a obține valorile lor.







De ce nu a făcut atacator pentru a introduce numele coloanei în locul unității? El are nevoie de o informație de text (nume de utilizator, parola), iar în cazul nostru în interogarea SELECT din stânga, în primul rând este article_id, de tip INT. Prin urmare, dreptul de a solicita un hacker nu poate pune mai întâi informațiile de nume de coloană de text (normele Uniunii).

Acum, să ne ia în considerare anumite situații în care utilizarea a Uniunii Europene este dificil pentru un motiv sau altul.

Se întâmplă ca PHP-cod într-un rând este mai mult SQL-interogări de injectare predispuse. Și toate folosesc o variabilă pentru care un atacator introduce un cod SQL. De exemplu (omițând PHP):

$ Rezultat = mysql_query ( "SELECT article_id, ARTICLE_TITLE din articole în cazul în care category_id = $ cid");

$ Rezultat = mysql_query ( "SELECT ARTICLE_NAME din articole în cazul în care category_id = $ cid");

// aici rezultatul încheierii

Acest lucru este destul de neplăcut pentru hacker, deoarece pentru prima injecție de interogare SQL va fi bine, iar pentru al doilea Union - nu au, deoarece numărul de coloane solicitate este diferit. Și dacă programatorul care a scris codul, opriți script-ul furnizat în cazul unui tip de eroare „Sau die (“ Eroare bază de date! «)», Funcționarea metodelor convenționale nu pot, deoarece script-ul se va opri înainte de a va aduce rezultate.

Script-ul nu emite întregul rezultat al interogării, și, de exemplu, numai prima intrare. Și dacă un hacker va folosi direct UNION, script-ul va ieșire doar prima înregistrare de răspuns MySQL și a renunța la celelalte, inclusiv rezultatul SQL Injection. Pentru a depăși toate obstacolele și în această etapă, a da un hacker a lăsat un parametru cerere la cazul în care, ca răspuns la o MySQL nu a returnat gol.

De exemplu, există această interogare: SELECT nume FROM autori WHERE id = $ id. După SQL Injection, el va fi după cum urmează: (..) id = 1 UNION SELECT parola de la autori. Dar un script PHP afișează doar prima înregistrare, astfel încât codul de încorporare ar trebui să fie modificat: (..) id = -12345 UNION SELECT (..). Acum, ca răspuns la interogarea MySQL din stânga nu se întoarce nimic, și ca răspuns la dreapta - bun venit la datele hackerului.

Luați în considerare următoarea interogare: SELECT id FROM autori în cazul în care category_id = -1 UNION SELECT 1,2 la autori WHERE id = 1 AND ASCII (subșir (parola, 1,1))> 109. rezultatul interogării va fi o intrare în cazul în care codul ASCII al primelor caractere ale parolei mai mult de 109, și nici o înregistrare, dacă este mai mare sau egal. Astfel, metoda de căutare binare pot găsi cu ușurință caracterul dorit. De ce un hacker folosește semnele „mai mult / mai puțin“, mai degrabă decât „egală“? În cazul în care un atacator trebuie să obțină un hash de 32 de caractere a parolei, va trebui să facă aproximativ 32 * 25 cereri! Metoda de căutare binară face posibilă reducerea acestui număr la jumătate. Desigur, hacker-ul trebuie să facă, nu va fi mâinile, și cu un script care automatizează de căutare.

Regula №1. Filtru de intrare. Citat se înlocuiește cu un slash-citat (# „), slash - pentru a slash-slash. In PHP, acest lucru se face prin includerea sau magic_quotes_gpc în php.ini sau addslashes funcția (). În Perl: $ id =

s / ([# „\]) / \ $ 1 / g;. Și doar în cazul în care: $ id =

s / [a-zA-z] // g; - pentru parametrii numerice.

Regula №2. Nu lăsa pe nimeni nu trebuie să pună în aplicare SQL-cod! Fi citate toate variabilele din interogare. De exemplu, SELECT * FROM utilizatori WHERE id = # '$ id #'.

Regula №3. Suprimarea mesaje de eroare. Unii programatori, dimpotrivă, face astfel încât atunci când script-ul afișează un mesaj de eroare de MySQL, sau chiar mai rău - întreaga SQL-interogare. Acesta oferă informații suplimentare cu privire la structura de bază personaj negativ și facilitează foarte mult operația.

Regula №4. Niciodată nu permite script-uri pentru a rula cu MySQL de la rădăcină. Nimic bun nu va ieși, în cazul în care un hacker nu obține accesul la întreaga bază de date.

Regula №5. Lansează script-uri publice de la un singur utilizator într-o bază de date separată. Este neplăcut să fie, în cazul în care orice kiddies folosind-hole 0 zi în forum, va avea acces la o bază de date cu un mop clienții.

Regula №6. Opriți privilegiul FILE MySQL-utilizator - nu lasa atacatorul să scrie în fișier ceva de genul prin MySQL.

Regula №7. Nu suna foi de calcul și baze de date, în conformitate cu scopul lor, pentru a ascunde numele real de privirile curioase. În script-urile publice oferă adesea o oportunitate de a seta prefixul pentru tabelele - stabilește cele mai dificile. Dacă cineva găsește și injecție SQL, nu va fi capabil să-l exploateze.

Cel mai adesea lăsat vulnerabile la aceste solicitări, parametrii care sunt transmise prin forma ascunsă în HTML sau prin intermediul cookie-urile au, se pare că, datorită faptului că acestea nu sunt vizibile pentru utilizator și să nu atragă atenția personaje negative.

De multe ori uita despre SQL Injection în funcția de răspuns, despre găsirea de mesaje în forumuri, raportează diverse servicii. În 80% injecție WAP-servicii SQL sunt zece bucăți în fiecare scenariu (probabil, adminii cred că există doar trec prin celulă). De fapt, mulți oameni subestima SQL Injection. Un caz în care un raport normal de script SQL Injection a condus la reale rue trei servere și concerte cu basculante de baze de date. Toate în toate, SQL injection ...

inattack.ru/group_article/34.html
www.rst.void.ru/papers/sql-inj.txt
www.securitylab.ru/49424.html
www.securitylab.ru/49660.html

Din ce în ce, administratorii pot asigura securitatea la cunoștințele de interogare MySQL nu este la fel de importantă ca și utilizarea eficientă a acestor solicitări.

Proteja baza dvs. de hackeri posibil - doar trebuie să urmați corect anumite reguli pentru a neutraliza aceste atacuri.

Cu hacker UNION pot găsi cu ușurință baza de date de utilizator și versiunea de MySQL, care sunt folosite pentru utilizator () funcție, baza de date () și versiunea (), respectiv. Piroliza de pur și simplu SELECT tipuri de utilizatori interogarea ().

Chiar dacă există un decalaj în apărare, este posibil să se inducă în eroare inamicul prin atribuirea unui nume de variabilă ilogic. Apoi, ei vor fi pur și simplu imposibil de a alege.

Mai mult decât știi cum să rupă în jos, cu atât mai ușor este de a preveni hacking.

ceas regulat de știri pe site-urile de securitate, să fie conștienți de modurile nou inventat de hacking și pentru a preveni scurgerile de informații sensibile.