Posts Tagged ‘SQL injection’
Si daca totusi uitam!
Scriam in postul trecut cat de important este sa verifici tot input-ul de la utilizatori. Este de ajuns doar unu sa fie sarit si site-ul poate fi vulnerabil.
Dar daca totusi gresim si uitam sa validam un input ? Ce putem face in cazul in care site-ul este vulnerabil la SQL Injection?
Pentru astfel de cazuri folosesc urmatoarea solutie :
In toate site-urile care lucrez cu baze de date folosesc o clasa/functie pentru a executa interogarile sql. O functie ar arata asa:
function doQuery($strQuery)
{
return mysql_query($strQuery);
}
Si astfel voi folosi aceasta functie pentru toate interogarile.
Pasul urmator este de a modifica aceasta functie astfel incat atunci cand are loc o eroare SQL sa-mi bage eroarea intr-o tabela in baza de date cu urmatoarele informatii IP,data,SQL-ul,SQL-ul codat in base64 .
In continuare se va verifica daca ip-ul respectiv a declansat in total un maxim de (sa zicem) 5 erori. In acest caz il trecem intr-o tabela de ban-uri. Tabela de ban-uri va fi verificata evident la accesul oricarei portiuni din frontend.
Deci o astfel de functie arata asa :
function doQuery($strQuery)
{$rt= mysql_query($strQuery);
if (mysql_errno())
{
if (doQueryGetColumn(”SELECT COUNT(*) as total FROM modules_errors WHERE ip=’”.$_SERVER['REMOTE_ADDR'].”‘”,”total”)==4)
{
$dataset=array();
$dataset['state']=’denied’;
$dataset['data']=date(”Y-m-d H:i:s”);
$dataset['ip']=$_SERVER['REMOTE_ADDR'];
$dataset['description']=”Banned after unknown SQL errors(more than 4)”;
bansMod::add($dataset);mail (”email@email.ro”,”Attack detected on <nume site> ! FROM “. $_SERVER['REMOTE_ADDR'],$strQuery);
}
}
// inseram in baza de date eroarea
mysql_query(”INSERT INTO errors SET type=’sql’, extra=’”.make_safe($strQuery).”‘, query=’”.base64_encode($strQuery).”‘, data=’”.date(”Y-m-d H:i:s”).”‘, ip=’”.$_SERVER['REMOTE_ADDR'].”‘, error=’”.make_safe(mysql_error()).”‘”);// in cazul in care incercarea de a insera da eroare atunci inseram fara a mai adauga si SQL-ul in plain-text
if (mysql_errno())
mysql_query(”INSERT INTO modules_errors SET type=’sql’, query=’”.code($strQuery).”‘, data=’”.date(”Y-m-d H:i:s”).”‘, ip=’”.$_SERVER['REMOTE_ADDR'].”‘, error=’”.make_safe(mysql_error()).”‘”);
return false;
}
return $rt;
}
In acest mod daca va fi un atac asupra site-ului vom sti aproape imediat(depinde cat de des ne verificam adresa de mail). De obicei nici un atac nu reuseste numai dupa 5 erori in baza de date. Si odata ce cele 5 erori apar… respectivul are ban pe tot siteul iar noi avem informatiile necesare pentru a repara greseala!
Tags: securitate, SQL injection, tutorial
Securitate? ce e aia ?
Dupa o lunga perioada de timp am revenit cu un nou post.. si sper ca de acum in colo sa scriu mai des.
Astazi va voi vorbi cum sa incepeti sa va asigurati site-ul si ce sa face ti pentru o mai multa siguranta la codare.
Pentru inceput ar trebui sa fie stiut ca absolut tot ceea ce se primeste de la useri trebuie verificat.. si sa se presupuna ce e un posibil atac. Deci toate variabilele primite prin GET,POST,COOKIE, etc.. trebuie facute “safe” . Pentru asta puteti folosi o functie de genu:
function make_safe($value, $allow_html=false,$remove_html=false)
{
if ($remove_html)
$value=strip_tags($value);if (!$allow_html)
$value=htmlspecialchars($value);
// Stripslashes
if (get_magic_quotes_gpc())
$value = stripslashes($value);// Quote if not a number or a numeric string
if (!is_numeric($value))
$value = mysql_real_escape_string($value);return $value;
}
Astfel folosind o astfel de functie puteti sa va protejati impotriva atacurilor de timp SQL Injection sau XSS.
Tags: securitate, SQL injection, tutorial, XSS
SQL injection site fancourier
Astazi la indemnul unui coleg… am gasit din “greseala” posibilitatea de a face un SQL injection la search-ul pt. AWB la site-ul celor de la fancourier.
Mi se pare anormal ca site-ul unei firme de curierat destul de mare(22,4 milioane de EURO dupa 9 luni) sa aiba o securitate asa de proasta. Acest exploit fiind unul pe care si un copil de 12 ani cred ca ar putea sa-l aplice.
Nu stiu la ce date poti ajunge daca dezvolti si faci un atac cu SQL-uri complexe, si nici nu ma intereseaza.. sper doar ca nu au multe informatii confidentiale pe acolo : nume, adrese, nr. telefon… si altele…
Tags: exploit, fancourier, mysql, SQL injection