Acest articol explică cum să testați dacă un site web este sigur de SQL Injection folosind instrumentul de testare a penetrării SQLMAP.

Ce este SQL Injection?

SQL Injection este o tehnică de injecție de cod prin care un atacator execută interogări SQL malițioase care controlează baza de date a unei aplicații web. Cu un set corect de interogări, un utilizator poate obține acces la informațiile stocate în bazele de date. SQLMAP testează dacă un parametru ‘GET’ este vulnerabil la SQL Injection.
De exemplu, luați în considerare următorul segment de cod php:

$variable = $_POST;mysql_query("INSERT INTO `table` (`column`) VALUES ('$variable')");

Dacă utilizatorul introduce „value’); DROP TABLE table;-” ca intrare, interogarea devine

INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')

care este nedorită pentru noi, deoarece aici intrarea utilizatorului este compilată direct împreună cu interogarea sql scrisă în prealabil. Prin urmare, utilizatorul va putea introduce o interogare sql necesară pentru a manipula baza de date.

Unde puteți utiliza SQLMAP?

Dacă observați un url web care are forma http://testphp.vulnweb.com/listproducts.php?cat=1, unde parametrul „GET” este în bold, atunci site-ul web poate fi vulnerabil la acest mod de injecție SQL, iar un atacator poate avea acces la informațiile din baza de date. Mai mult decât atât, SQLMAP funcționează atunci când este bazat pe php.

Un test simplu pentru a verifica dacă site-ul dvs. este vulnerabil ar fi să înlocuiți valoarea din parametrul get request cu un asterisc (*). De exemplu,

http://testphp.vulnweb.com/listproducts.php?cat=* 

Dacă acest lucru are ca rezultat o eroare precum cea dată mai sus, atunci putem spune în mod concludent că site-ul web este vulnerabil.

Instalarea sqlmap

SQLMAP vine pre – instalat cu kali linux, care este alegerea preferată de majoritatea celor care fac teste de penetrare. Cu toate acestea, puteți instala sqlmap pe alte sisteme linux bazate pe debian folosind comanda

 sudo apt-get install sqlmap 

Usage

În acest articol, vom folosi un site web care este proiectat cu vulnerabilități în scop demonstrativ:

 http://testphp.vulnweb.com/listproducts.php?cat=1 

După cum puteți vedea, există un parametru de cerere GET (cat = 1) care poate fi schimbat de către utilizator prin modificarea valorii lui cat. Deci, acest site web ar putea fi vulnerabil la o injecție SQL de acest tip.
Pentru a testa acest lucru, folosim SQLMAP. Pentru a vedea setul de parametri care pot fi trecuți, tastați în terminal,

 sqlmap -h 

Parametrii pe care îi vom folosi pentru Injecția SQL de bază sunt prezentați în imaginea de mai sus. Împreună cu aceștia, vom folosi și parametrul -dbs și -u, a căror utilizare a fost explicată în Pasul 1.
Utilizarea SQLMAP pentru a testa un site web pentru vulnerabilitatea SQL Injection:

  1. Pasul 1: Listarea informațiilor despre bazele de date existente
    În primul rând, trebuie să introducem adresa web pe care dorim să o verificăm împreună cu parametrul -u. De asemenea, putem folosi parametrul -tor dacă dorim să testăm site-ul web folosind proxy-uri. Acum, în mod obișnuit, am dori să testăm dacă este posibil să obținem acces la o bază de date. Deci, folosim opțiunea -dbs pentru a face acest lucru. -dbs listează toate bazele de date disponibile.
     sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 --dbs 

    Avem următoarea ieșire care ne arată că există două baze de date disponibile. Uneori, aplicația vă va spune că a identificat baza de date și vă va întreba dacă doriți să testați alte tipuri de baze de date. Puteți merge mai departe și să tastați „Y”. Mai mult, este posibil să vă întrebe dacă doriți să testați alți parametri pentru vulnerabilități, tastați ‘Y’ pe aici, deoarece dorim să testăm temeinic aplicația web.

    Observăm că există două baze de date, acuart și information_schema

  2. Pasul 2: Listarea informațiilor despre tabelele prezente într-o anumită bază de date
    Pentru a încerca să accesăm oricare dintre bazele de date, trebuie să modificăm ușor comanda noastră. Acum folosim -D pentru a specifica numele bazei de date pe care dorim să o accesăm, iar odată ce avem acces la baza de date, am dori să vedem dacă putem accesa tabelele. Pentru aceasta, folosim interogarea -tables. Să accesăm baza de date acuart.
     sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 -D acuart --tables 

    Tabele

    În imaginea de mai sus, vedem că au fost recuperate 8 tabele. Deci, acum știm cu siguranță că site-ul web este vulnerabil.

  3. Pasul 3: Listarea informațiilor despre coloanele unui anumit tabel

    Dacă dorim să vizualizăm coloanele unui anumit tabel, putem utiliza următoarea comandă, în care folosim -T pentru a specifica numele tabelului și -columns pentru a interoga numele coloanelor. Vom încerca să accesăm tabelul „artiști”.

     sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 -D acuart -T artists --columns 

    Columns

  4. Pasul 4: Aruncați datele din coloane
    În mod similar, putem accesa informațiile dintr-o anumită coloană folosind următoarea comandă, unde -C poate fi folosit pentru a specifica mai multe nume de coloane separate prin virgulă, iar interogarea -dump recuperează datele
     sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1-D acuart -T artists -C aname --dump 

    Din imaginea de mai sus, putem vedea că am accesat datele din baza de date. În mod similar, în astfel de site-uri web vulnerabile, putem explora literalmente prin bazele de date pentru a extrage informații

Preveniți SQL Injection

Injecția SQL poate fi în general prevenită prin utilizarea Prepared Statements . Atunci când folosim o instrucțiune pregătită, practic folosim un șablon pentru cod și analizăm separat codul și intrarea utilizatorului. Nu se amestecă interogarea introdusă de utilizator și codul. În exemplul dat la începutul acestui articol, datele introduse de utilizator sunt inserate direct în cod și sunt compilate împreună și, prin urmare, putem executa codul malițios. În cazul instrucțiunilor pregătite, practic trimitem interogarea sql cu un spațiu rezervat pentru introducerea utilizatorului și apoi trimitem introducerea efectivă a utilizatorului ca o comandă separată.
Considerați următorul segment de cod php.

$db = new PDO('connection details');$stmt = db->prepare("Select name from users where id = :id");$stmt->execute(array(':id', $data));

În acest cod, introducerea utilizatorului nu este combinată cu instrucțiunea pregătită. Ele sunt compilate separat. Astfel, chiar dacă codul malițios este introdus ca intrare a utilizatorului, programul va trata pur și simplu partea malițioasă a codului ca pe un șir de caractere și nu ca pe o comandă.

Nota: Această aplicație trebuie folosită doar în scopuri de testare
Articolul asociat
Injecție SQL de bază și atenuare

Referință:stackoverflow.com

Acest articol este realizat de Deepak Srivatsav. Dacă vă place GeeksforGeeks și doriți să contribuiți, puteți, de asemenea, să scrieți un articol folosind contribute.geeksforgeeks.org sau să trimiteți articolul prin e-mail la [email protected]. Vedeți articolul dvs. apărând pe pagina principală GeeksforGeeks și ajutați alți Geeks.

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.