Documente Academic
Documente Profesional
Documente Cultură
<<include>>
Validare date
Introduce/modifica date <<include>>
user
Autentificare utilizator
Pașii (scenariul de acces) care ar trebui realizați în
procesul interacțiunii cu BD atunci când așteaptă
răspund la o anumită interogare (cum ar trebui să fie)
1. Introducerea datelor în formular
2. Validarea datelor introduse și apoi transferul acestora spre server
3. Recepționarea datelor pe server și validarea corectitudinii acestora
4. Crearea interogării BD
5. Primirea răspunsului de la BD (vor fi returnate una sau mai multe înregistrări)
6. Crearea răspunsului în format HTTP (depinde de rezultatul interogării)
1. În acest răspuns poate nimeri un set de înregistrări extrase din BD
2. Sau răspunsul poate să depindă de rezultatele interogării (ca de exemplu în procesul
autentificării sunt generate diferite pagini – în funcție de răspunsul returnat de BD)
Pașii (scenariul de acces) care ar trebui realizați în
procesul interacțiunii cu BD atunci când așteaptă răspund
la o anumită interogare (cum ar trebui să fie - grafic)
...cum se întâmplă de fapt atunci când se acordă
atenție realizării funcționalităților, fără să se
țină cont de securizarea accesării aplicației
<<include>>
Validare date
Introduce/modifica date <<include>>
user
Autentificare utilizator
Cum se realizează un atac de tip SQL
injection
■ Un atac de succes de tip SQL Injection, necesită ca atacatorul să prelucreze și să corecteze, așa cum are
el nevoie, o interogare SQL (preventiv înțelegând și ce tehnologii au fost utilizate pentru a elabora
partea server a aplicației)
■ Dacă aplicația returnează un mesaj de eroare, generat de aplicație la accesarea interogării incorecte,
atunci atacatorului îi poate fi chiar mai simplu să înțeleagă logica pe care ar trebui să o aplice și cum ar
trebui să realizeze injectarea
■ Sunt cunoscute câteva metode ce pot fi aplicate pentru a realiza SQL-injection. Ele pot fi utilizate în
combinație sau chiar și separat:
– Operatorul SQL Union: poate fi utilizat în operatorul SELECT, ceea ce va permite reuniunea a
două interogări într-un singur rezultat
– Boolean: sunt folosite condițiile logice pentru a verifica dacă anumite condiții adevărate sau false
– Metoda bazată pe erori: această metodă obligă BD să genereze o eroare, ceea ce poate oferi
atacatorului informații suplimentare pentru ca acesta să perfecteze interogarea pentru atac
– Reținerea timpului: sunt folosite comenzi ale BD (de exemplu, sleep – în MySql) pentru a reține
răspunsurile în interogările condiționale
Metode de depistare a vulnerabilităților
pentru atacuri de tip SQL injection
Primul pas care trebuie realizat ar fi înțelegerea în ce moment aplicația interacționează cu BD
pentru a solicita anumite date. Exemple tipice de interacțiune a aplicației cu BD ar fi:
■ Formularele de autentificare: atunci când autentificarea se face cu utilizarea unui formular
HTML, datele de cont ale utilizatorului sunt verificate cu cele stocate într-o BD și care
conține toale loghinurile și parolele
■ (Sub)sistemele de căutare: șirul introdus de utilizator în câmpul de căutare se folosește într-
o interogare SQL, care va extrage toate înregistrările cerute din BD
■ Site-urile care realizează comerț electronic: denumirile produselor și alte caracteristici ale
acestora (preț, descriere, accesibilitate etc.), mai mult ca sigur se vor păstra într-o BD
■ Înregistrare utilizator, abonare la noutăți etc.
Suplimentar mai trebuie analizate toate antetele HTTP și fișierele cookie
Exemplu pentru testare online
■ https://demo.owasp-juice.shop/#/
Problemă
■ Fie o mini-aplicație care acceseaza detalii referitoare la niște produse. Pentru a avea acces la
funcționalitățile acestei aplicații este solicitată autentificarea utilizatorului
■ Formularul de autentificare are 2 câmpuri: loghin și parolă
■ Pentru a avea posibilitatea ieșirii din spațiul privat al paginii de administrare acesta accesează opțiunea
corespunzătoare și este direcționat înapoi la formularul de autentificare
■ În BD a aplicației există câteva conturi de utilizator, pentru a fi posibilă intrarea în spațiul privat. Voi
folosi pentru acces contul cu datele: admin1 (loghin), admin1 (parola)
■ Atunci când datele sunt introduse corect (acestea coincid cu un set din cele existente în BD) – este posibil
accesul la spațiul privat
Introducerea incorectă a delor – nu va
permite accesul la spațiul privat
... Utilizatorul va fi direcționat înapoi la formularul de autentificare
• În script se verifică doar ca datele introduse în formular să coincidă cu un set
existent în BD
• Alte validări nu se fac – nici pe partea client și nici pe partea server
La introducerea intenționată a unor date eronate,
dar care conțin condiții logice suplimentare –
aplicația va oferi acces în spațiul privat
■ Din cauză că utilizatorul a introdus în câmpuri datele (loghin = 1' or '1' = '1 parolă = 1'
or '1' = '1), care se vor concatena în interogare și rezultatul interogării mereu va returna
«true»
■ Astfel de date în BD nu există – dar intrarea a fost realizată. De ce?
Analizăm scriptul de comparare a datelor...
$login = $parola = "";
if ($_POST['ok']) {
$login = $_POST["login"];
$parola = $_POST['password'];
$query = "SELECT * FROM users WHERE login='$login' AND password='$parola'";
$res = mysqli_query($conn, $query);
if($row=mysqli_fetch_array($res)) {
header('Location: http://'.$_SERVER['SERVER_NAME'].$cale.'meniu.php');
} else { header('Location: http://'.$_SERVER['SERVER_NAME'].$cale); }
mysqli_close($conn);
}
$login = $parola = "";
Ce se întâmplă la introducerea datelor
corecte și incorecte?
Este necesar să se implementeze reguli de diferențiere a unei interogări reușite și a uneia
nereușite
■ La introducerea datelor corecte:
$query = "SELECT * FROM users WHERE login = 'admin1' AND password = 'admin1' ";
– Se va găsi o potrivire a datelor (true) – ele sunt în BD
■ La introducerea datelor incorecte – și schimbării textului interogării:
$query = "SELECT * FROM users WHERE login='1' or '1' = '1' AND password='1' or '1' = '1' ";
– Nu se vor găsi potriviri cu datele existente în BD – astfel de date acolo nu sunt, dar rezultatul
returnat de condiția din «where», mereu va fi «true» indiferent câte înregistrări sunt în tabelul
BD – se vor găsi tot atâtea potriviri și aplicația va direcționa utilizatorul la pagina privată:
header('Location: http://'.$_SERVER['SERVER_NAME'].$cale.'meniu.php');
Ce se recomandă a fi verificat?
■ Primele simboluri care trebuie verificate dacă pot fi introduse în câmp sunt adăugarea de
ghilimea unară (') sau simbolului punct-virgulă (;) la testarea câmpului
– Primul simbol numit se folosește în SQL ca și delimitator al sirurilor de simboluri
textuale - și dacă nu se filtrează va genera o interogare incorectă
– Cel de-al doilea simbol se folosește în SQL pentru a specifică sfârșitul interogării, și
dacă nu este filtrat nici acesta – tot se generează o eroare
■ De asemenea se testează câmpul la acceptarea simbolurilor care indică comentarii în script (--
sau / * * /) și alte cuvinte cheie din SQL, precum 'AND’ și 'OR’, folosite în modificarea
interogării. O metodă simplă și recomandată este de a încerca introducerea unui șir de
caractere atunci când se așteaptă un număr
■ Se recomadă să fie controlate toare răspunsurile serverului web și să fie parcurse codurile
HTML / javascript. Uneori în ele pot fi depistate erori
■ Este foarte importat ca fiecare câmp să fie testat separat. O singură variabilă trebuie să fie
modificată, iar celelalte să rămână constante, pentru a înțelege care ca pametri sunt
vulnerabili și care nu
Uneori pot fi injectate și următoarele
succesiuni de simboluri....
1. Se comentează restul textului
interogării
-- se folosește la comentare în SQL
2. Se inserează un comentariu în
PHP
function validare() {
var log = document.getElementById("log").value;
var pass = document.getElementById("pass").value;
var mess="";
var er=0;
if(!/^[A-z0-9]{4,20}$/.test(log)) {mess += "Loghinul contine doar litere sau cifre - minim 4 si maxim
20!"; er=er+1; }
if(!/^[A-z0-9]{6,15}$/.test(pass)) {mess += "<br />Parola contine doar litere sau cifre - minim 6 si
maxim 15!"; er++;};
document.getElementById("err").innerHTML = mess;
return (er==0);
}
Rezultatul îndeplinirii acestui script –
datele nevalide nu sunt expediate pe server
Aceste date vor fi validate pe partea client pănă când utilizatorul nu va introduce litere și
cifre în numărul solicitat
Aceste intrări de date de asemenea nu
vor fi acceptate
Avantajele validării datelor pe partea client
■ Browserul va valida datele introduse pentru a se convinge că utilizatorul a introdus
datele solicitate înainte de expedierea formularului pe server. Atunci când datele nu
satisfac cerințele înaintate utilizatorului, acestuia i se propune să înlăture neajunsurile,
iar acesta nu va putea transmite datele spre server până nu va rezolva problema
■ Avantajul validării datelor pe partea client mai constă și în faptul că utilizatorul
primește momentan informația referitoare la problemele apărute. Dacă nu ar fi funcția
de validare în browser utilizatorul va expedia datele pe server, acolo se vor valida,
apoi i se vor genera erorile. Pentru rețelele de calculatoare cu o viteză mică de transfer
al datelor și a serverelor care sunt supraîncărcate acest proces poate fi foarte
îndelungat și chiar neplăcut
■ !!! Validarea pe partea client trebuie să suplimenteze validările pe partea server și nici într-
un caz să nu le înlocuiască. Nu trebuie să avem încredere în utilizatori și să folosim doar
validarea în browser. Pentru un atacator a scrie un script care să atace aplicația, atunci
când nu se fac validările pe partea server, este o nimica toată
Este recomandat să se facă validările și pe
partea server
■ În cazul în care este deconectată opțiunea executării JavaScripturilor
■ Pentru asigurarea unui nivel mai înalt al securizării
■ Dacă se adaugă doar o condiție suplimentară în scriptul server-side (1-l nivel de
protecție)
■ A fost: $query = "SELECT * FROM users WHERE login='$login' AND password='$parola' "; $res =
mysqli_query($conn, $query); $row=mysqli_fetch_array($res); if($row) {...}
■ Transformăm în: $query = "SELECT * FROM users WHERE login='$login' AND password='$parola' ";
$res = mysqli_query($conn, $query); $row = mysqli_fetch_array($res); if(mysqli_num_rows($res)==1) {...} – se
va minimiza numărul coincidențelor până la 1. Dar noi deja știm că avem 3
conturi și numărul coincidenților la adăugarea secvenței 1' or '1' = '1 va fi tot 3 și
această validare suplimentară va exclude posibilitatea accesării panoului de
administrare
Completăm scripurile server side...