Arhivă etichetă sql injection

dehackeradvisor™

Prevenirea atacurilor SQL Injection

Cele mai multe site-uri au o modalitate de a stoca date, cea mai frecventa este cea care foloseste o bază de date. Când se foloseșt baze de date SQL pentru a stoca date site-ului, un proprietar de site trebuie sa se fereasca de atacurile SQL Injection, care pot fi folosite pentru a fura sau a modifica datele utilizatorilor.

Prevenirea atacurilor SQL Injection

 

Unele site-uri care returnează rezultate diferite pe baza informațiilor transmise de utilizator (cum ar fi spre exemplu, logarea un utilizator în baza unui username / parola) nu pot filtra în mod corespunzător toate datele introduse de utilizator. Astfel, atunci când un utilizator introduce unele date, acesta poate modifica datele dintr-o încercare de a schimba interogarea SQL asupra bazei de date. Dacă reuseste, atunci atacatorul poate fi în măsură să se conecteze ca si administrator, sau poate fura alte date ale utilizatorilor.

Imaginați-vă că aveți datele de logare a utilizatorilor, stocate într-o tabela a bazei de date (utilizatori), și ca aceasta are următoarea structură:

 

CREATE TABLE users(
	User_id INT,
	username VARCHAR(30),
	password VARCHAR(30)
	);

 

Uitandu-ne la codul pe care site-ul il foloseste pentru a trata procesul de log-are, observam ca se construiește dinamic o interogare SQL în PHP, după ce un utilizator a tastat numele de utilizator și parola într-un formular (cu campurile – utilizator și parola):

<?php
$results = mysql_query( "SELECT use_id FROM users WHERE username='".$_POST['user']."' AND password='".$_POST['pass']);
?>

 

Principala problemă de mai sus este ca datele de la utilizator nu sunt securizate, variabila POST este folosita pentru a trage date direct din formularul de login, și plasându-l în interogare. În acest moment, un atacator ar putea încerca sa puna într-un șir special pentru nume de utilizator:

‘ or 1=1 or ‘

Acum, interogarea returnează întotdeauna primul utilizator (potential administratorul ) și atacatorul se poate conecta ca si administrator!

 

Si alte atacuri sunt posibile folosind o logica similara. În loc să se conecteze ca administrator, un atacator ar putea folosi alte siruri de caractere speciale, pentru a solicita date din baza de date la care nu ar trebui să aibă acces, ar putea aduna toate datele din baza de date la care un utilizator al bazei de date are acces.

 

Cum afecteaza asta securitatea mea?

Un atac reusit ar permite unui atacator sa obtina majoritatea sau chiar toate informatiile din baza de date, inclusiv toate datele sensibile, și se conecteze cu drepturi de administrator.

SQL Injection este una dintre vulnerabilitățile cu riscul cel mai ridicat pe care il poate avea un site.

 

Cum sa previi Injectiile SQL ?

 

Atacurile de tip SQL Injection pot fi prevenite într-un mod similar cu XPath Injection. Cel mai bun mod este de a securiza cu atenție datele introduse de utilizator. Orice date primite de la un utilizator ar trebui să fie considerate nesigure. Eliminarea tuturor ghilimelelor simple și duble ar trebui să elimine cele mai multe tipuri de acest tip de atac.

 

 

Aveti grija la eliminarea ghilimelelor, deoarece poate avea efecte secundare, cum ar fi situatia când numele de utilizator ar putea conține ghilimele valide. Imaginați-vă nume comune, cum ar fi O’Malley, care conține ghilimelelor legitime și pot fi introduse printr-un formular ca si nume de utilizator. În aceste cazuri, campul de intrare ar trebui să fie escaped, de multe ori prin adaugarea unui \ în fața ghilimelei. Verificați in bibliotecile specifice și software-ul de bazei de date pentru sintaxa corespunzătoare.

 

Majoritatea bibliotecilor de programare conțin funcții pentru a face escape la datele introduse de utilizator. Consultați documentația specifică pentru modul corect de a face escape automat la date, inainte de interogarea bazelor de date SQL. În PHP si MySQL, mysql_real_escape_string este funcția de a face escape la datele de interogare periculoase. Folosind aceasta sau funcții similare, care trateaza toate datele introduse de utilizator va ajuta la mentinerea unui cod securizat.

 

În al doilea rând, scrie toate interogările SQL folosind interogări parametrizate, astfel incat interogarea este pre-definita, și datele tastate sunt verificate si transmise ulterior. În PHP, de exemplu, ai putea re-defini interogarile mentionate anterior folosind această interogare parametrizata, cu scopul de a preveni atacurile SQL injection:

 

<?php
	$query= "SELECT user_id FROM users WHERE username=? and password=?";	//query definition
	$preparedStatement=$database_connection()->prepare($query);				//prepare the statement
	mysqli_stmt_bind_param($preparedStatement, 'ss', $field1, $field2);		//prepare to bind two Strings (the ss)
	$field1 = $_POST['user'];			//you may want to do more input checking here!
	$field2 = $_POST['pass'];			//you may want to do more input checking here!
	mysqli_stmt_execute($preparedStatement);	//execute the parametrized query
?>

Resurse Suplimentare

SQL Injection Cheat Sheet
Prevent SQL Injection in PHP with MySQL
SQL Injection by Example

Prevenirea Injectiilor SQL (SQL Injection Attacks) asupra site-ului tau

HackerAdvisor.com include in procesul de scanare, diferite setari de test, care te vor ajuta sa reduci expunerea site-ului la atacuri, inclusiv atacurile SQL Injection.