Sql injectare, toate pentru un hacker începător software gratuit pentru hacking, tutoriale video

Injecția SQL este una dintre cele mai accesibile metode de hacking a unui site.
Esența acestor injecții este introducerea unui cod SQL arbitrar în date (transmise prin GET, POST cereri sau valori Cookie). Dacă site-ul este vulnerabil și efectuează astfel de injecții, atunci există, de fapt, posibilitatea de a crea din baza de date (cel mai adesea este MySQL) orice.







Cum se calculează vulnerabilitatea care vă permite să implementați injectarea SQL?

Modificați cererea GET la? Detail = 1 \ 'sau? Detail = 1. "În continuare încercăm să transmitem aceste cereri către server, adică mergeți la test.ru/? Detail = 1 \ .

Dacă apare o eroare la introducerea acestor pagini, site-ul este vulnerabil la injectarea SQL.

Un exemplu de eroare care apare când este verificată o vulnerabilitate

Practica. Opțiuni pentru hacking un site cu o vulnerabilitate la implementarea SQL

Deci, am menționat deja site-ul test.ru. Baza de date stochează 4 știri, dintre care 3 rezultate. Permisiunea de a publica știri depinde de parametrul public (dacă parametrul conține valoarea 1, știrile sunt publicate).

Testez următoarele opțiuni:
test.ru/?detail=4+OR+1
test.ru/?detail=4+-
test.ru/?detail=4+UNION+SELECT+*+FROM+news+WHERE+id=4

Ca rezultat, norocul a zâmbit și două solicitări (primul și al treilea) ne-au returnat o descriere detaliată a celei de-a patra știri

Analiza unui exemplu din interior

Pentru o descriere detaliată a știrilor, un bloc de cod răspunde:
$ detail_id = $ _ GET [\ 'detalii \'];
$ zapros = "SELECT * FROM" $ table_news` Unde `public` = \ '1 \' ȘI 'id` = $ detail_id ORDER BY` poziția `DESC';

Mai mult decât atât, acesta este setat la $ detail_id fără nici un tratament, astfel încât, de asemenea, construi `id` = $ detail_id scris strâmbă, este mai bine să rămânem la` id` = \„$ detail_id \“(adică valoarea comparație pentru a scrie în apostroful drepte).

Privind la interogarea primită la accesarea paginii prin test.ru/?detail=4+OR+1

SELECT * FROM `news` WHERE` public` = \ '1 \' ȘI `id` = 4 OR 1 ORDER BY`

nu devine foarte clar de ce a fost afișată a 4-a veste. Faptul este că interogarea a returnat toate înregistrările din tabelul de știri, sortate în ordine descrescătoare din partea de sus. Așadar, cea de-a 4-a știre sa dovedit a fi prima, dar a apărut și ea ca una detaliată. E doar o coincidență.

Dezasamblam cererea formată la referință prin test.ru/?detail=4+UNION+SELECT+*+FROM + news + WHERE + id = 4.

Aici numele mesei cu știri (în cazul nostru este știri) a fost realizat printr-o căutare logică.
Deci, a fost executată interogarea SELECT * FROM `news`. WHERE` public` = \ '1 \' ȘI `id` = 4 UNION SELECT * FROM news WHERE id = 4 ORDER BY`` DESC. Rezultatul celei de-a doua părți (după UNION), care a returnat descrierea detaliată a celei de-a 4-a știri, sa alăturat rezultatului zero al primei părți a interogării (înainte de UNION).

Protecția împotriva injectării SQL (implementare SQL)

Protecția împotriva hacking-ului se reduce la principiul de bază al "încredere, dar verificați". Trebuie să verificați totul - numere, linii, date, date în formate speciale.

Pentru a verifica o variabilă pentru o valoare numerică, utilizați funcția is_numeric (n); care returnează true dacă parametrul n este un număr și altfel fals.
De asemenea, nu puteți verifica valoarea pentru un număr, dar suprascrieți manual tipul. Iată un exemplu care suprascrie valoarea $ id obținută de la $ _GET [\ 'id_news \'] în valoarea întregului (întreg):
$ id = (int) $ _ GET [\ 'id_news \'];

Majoritatea hack-urilor prin SQL apar datorită prezenței unor citate, apostrofe și alte caractere speciale în linii. Pentru o astfel de neutralizare, trebuie să utilizați funcția addslashes ($ str); care returnează un șir $ str cu un backslash adăugat (\\) înainte de fiecare caracter special. Acest proces se numește screening.

$ a = "text exemplu cu un apostrof \" ";
echo addslashes ($ a); // va fi afișat: text exemplu cu un apostrof \\\ '

În plus, există două funcții create special pentru screening-ul șirurilor folosite în expresiile SQL.
Acesta este mysql_escape_string ($ str); și mysql_real_escape_string ($ str);

Primul nu ia în considerare codificarea conexiunii la baza de date și poate fi bypassed, dar al doilea îl ia în considerare și este absolut sigur. mysql_real_escape_string ($ str); returnează un șir $ str cu backslash adăugat la următoarele caractere: \\ x00, \\ n, \\ r, \\, \ ', "și \\ x1a.

Citate magice

citate Magic - efect citate automate de înlocuire la backslash (\\) și citat la operațiunile de I / O. În unele configurații PHP, această opțiune este activată, iar în unele nu există. Pentru a evita caractere duble ekranizirovaniya zaekranizirovat date în mod normal, prin mysql_real_escape_string ($ str);, trebuie să eliminați backslash automată aplicată (dacă sunt citate magice incluse).







Verificarea includerii citatelor magice pentru datele primite de la GET, POST sau Cookie este organizată prin intermediul funcției get_magic_quotes_gpc (); (se întoarce 1 dacă citatele magice sunt active, 0 dacă sunt dezactivate).

Dacă sunt incluse citatele magice (adică sunt adăugate spate-lămpi) și acest lucru se întâmplă mai des, atunci acestea trebuie eliminate. Aceasta se face prin funcția stripslashes ($ str); (returnează șirul $ str fără backslash-uri în ghilimele și apostrofe directe).

În concluzie, rezultă un cod cu o adaptare completă a liniilor pentru scrierea în baza de date

dacă (get_magic_quotes_gpc () == 1)
$ element_title = stripslashes (trim ($ _ POST ["element_title"])));
$ element_text = stripslashes (trim ($ _ POST ["element_text"]));
$ element_date = stripsleri (trim ($ _ POST ["element_date"]));
>
altfel
$ element_title = decupați ($ _ 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);

Injecția SQL este una dintre cele mai accesibile metode de hacking a unui site.
Esența acestor injecții este introducerea unui cod SQL arbitrar în date (transmise prin GET, POST cereri sau valori Cookie). Dacă site-ul este vulnerabil și efectuează astfel de injecții, atunci există, de fapt, posibilitatea de a crea din baza de date (cel mai adesea este MySQL) orice.

Cum se calculează vulnerabilitatea care vă permite să implementați injectarea SQL?

Modificați cererea GET la? Detail = 1 \ 'sau? Detail = 1. "În continuare încercăm să transmitem aceste cereri către server, adică mergeți la test.ru/? Detail = 1 \ .

Dacă apare o eroare la introducerea acestor pagini, site-ul este vulnerabil la injectarea SQL.

Un exemplu de eroare care apare când este verificată o vulnerabilitate

Practica. Opțiuni pentru hacking un site cu o vulnerabilitate la implementarea SQL

Deci, am menționat deja site-ul test.ru. Baza de date stochează 4 știri, dintre care 3 rezultate. Permisiunea de a publica știri depinde de parametrul public (dacă parametrul conține valoarea 1, știrile sunt publicate).

Testez următoarele opțiuni:
test.ru/?detail=4+OR+1
test.ru/?detail=4+-
test.ru/?detail=4+UNION+SELECT+*+FROM+news+WHERE+id=4

Ca rezultat, norocul a zâmbit și două solicitări (primul și al treilea) ne-au returnat o descriere detaliată a celei de-a patra știri

Analiza unui exemplu din interior

Pentru o descriere detaliată a știrilor, un bloc de cod răspunde:
$ detail_id = $ _ GET [\ 'detalii \'];
$ zapros = "SELECT * FROM" $ table_news` Unde `public` = \ '1 \' ȘI 'id` = $ detail_id ORDER BY` poziția `DESC';

Mai mult decât atât, acesta este setat la $ detail_id fără nici un tratament, astfel încât, de asemenea, construi `id` = $ detail_id scris strâmbă, este mai bine să rămânem la` id` = \„$ detail_id \“(adică valoarea comparație pentru a scrie în apostroful drepte).

Privind la interogarea primită la accesarea paginii prin test.ru/?detail=4+OR+1

SELECT * FROM `news` WHERE` public` = \ '1 \' ȘI `id` = 4 OR 1 ORDER BY`

nu devine foarte clar de ce a fost afișată a 4-a veste. Faptul este că interogarea a returnat toate înregistrările din tabelul de știri, sortate în ordine descrescătoare din partea de sus. Așadar, cea de-a 4-a știre sa dovedit a fi prima, dar a apărut și ea ca una detaliată. E doar o coincidență.

Dezasamblam cererea formată la referință prin test.ru/?detail=4+UNION+SELECT+*+FROM + news + WHERE + id = 4.

Aici numele mesei cu știri (în cazul nostru este știri) a fost realizat printr-o căutare logică.
Deci, a fost executată interogarea SELECT * FROM `news`. WHERE` public` = \ '1 \' ȘI `id` = 4 UNION SELECT * FROM news WHERE id = 4 ORDER BY`` DESC. Rezultatul celei de-a doua părți (după UNION), care a returnat descrierea detaliată a celei de-a 4-a știri, sa alăturat rezultatului zero al primei părți a interogării (înainte de UNION).

Protecția împotriva injectării SQL (implementare SQL)

Protecția împotriva hacking-ului se reduce la regula principală de "încredere, dar verificați". Trebuie să verificați totul - numere, linii, date, date în formate speciale.

Pentru a verifica o variabilă pentru o valoare numerică, utilizați funcția is_numeric (n); care returnează true dacă parametrul n este un număr și altfel fals.
De asemenea, nu puteți verifica valoarea pentru un număr, dar suprascrieți manual tipul. Iată un exemplu care suprascrie valoarea $ id obținută de la $ _GET [\ 'id_news \'] în valoarea întregului (întreg):
$ id = (int) $ _ GET [\ 'id_news \'];

Majoritatea hack-urilor prin SQL apar datorită prezenței unor citate, apostrofe și alte caractere speciale în linii. Pentru o astfel de neutralizare, trebuie să utilizați funcția addslashes ($ str); care returnează un șir $ str cu un backslash adăugat (\\) înainte de fiecare caracter special. Acest proces se numește screening.

$ a = "text exemplu cu un apostrof \" ";
echo addslashes ($ a); // va fi afișat: text exemplu cu un apostrof \\\ '

În plus, există două funcții create special pentru screening-ul șirurilor folosite în expresiile SQL.
Acesta este mysql_escape_string ($ str); și mysql_real_escape_string ($ str);

Primul nu ia în considerare codificarea conexiunii la baza de date și poate fi bypassed, dar al doilea îl ia în considerare și este absolut sigur. mysql_real_escape_string ($ str); returnează un șir $ str cu backslash adăugat la următoarele caractere: \\ x00, \\ n, \\ r, \\, \ ', "și \\ x1a.

Citate magice

citate Magic - efect citate automate de înlocuire la backslash (\\) și citat la operațiunile de I / O. În unele configurații PHP, această opțiune este activată, iar în unele nu există. Pentru a evita caractere duble ekranizirovaniya zaekranizirovat date în mod normal, prin mysql_real_escape_string ($ str);, trebuie să eliminați backslash automată aplicată (dacă sunt citate magice incluse).

Verificarea includerii citatelor magice pentru datele primite de la GET, POST sau Cookie este organizată prin intermediul funcției get_magic_quotes_gpc (); (se întoarce 1 dacă citatele magice sunt active, 0 dacă sunt dezactivate).

Dacă sunt incluse citatele magice (adică sunt adăugate spate-lămpi) și acest lucru se întâmplă mai des, atunci acestea trebuie eliminate. Aceasta se face prin funcția stripslashes ($ str); (returnează șirul $ str fără backslash-uri în ghilimele și apostrofe directe).

În concluzie, rezultă un cod cu o adaptare completă a liniilor pentru scrierea în baza de date

dacă (get_magic_quotes_gpc () == 1)
$ element_title = stripslashes (trim ($ _ POST ["element_title"])));
$ element_text = stripslashes (trim ($ _ POST ["element_text"]));
$ element_date = stripsleri (trim ($ _ POST ["element_date"]));
>
altfel
$ element_title = decupați ($ _ 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);







Articole similare

Trimiteți-le prietenilor: