Acasă Pregătiri pentru iarnă Controlul Autentificare. Cum să obțin rezultatele interogării mele SQL

Controlul Autentificare. Cum să obțin rezultatele interogării mele SQL

Această lucrare este o traducere a unei părți din injecția SQL avansată a lui Chris Anley în aplicațiile SQL Server. ()
În articolele ulterioare, dacă există timp liber, această traducere va fi finalizată.

P.S. Traducerea va fi de mai mult interes în scopuri educaționale și istorice.

Titlul original al articolului: Advanced SQL Injection in SQL Applications.

adnotare

Acest articol discută în detaliu metodele generale de „injectare SQL” pentru binecunoscuta platformă Microsoft Internet Information Server/Active Server Pages/SQL Server. Acesta discută despre diferitele utilizări ale injecției SQL în aplicații și explică tehnicile de validare a datelor, precum și securizarea bazelor de date în care pot fi utilizate injecțiile.

Introducere

Structured Query Language (SQL) este un limbaj structurat folosit pentru a interacționa cu bazele de date. Există multe „dialecte” ale limbajului SQL, dar astăzi, în general, toate se bazează pe standardul SQL-92, unul dintre standardele ANSI timpurii. Unitatea operațională de bază a SQL este o interogare, care este o colecție de expresii care returnează de obicei un set de rezultate. Expresiile SQL pot modifica structura bazelor de date (folosind expresii ale limbajelor de definire a datelor - DLL) și pot gestiona conținutul acestora (folosind expresii ale limbajelor de manipulare a datelor - DML). În această lucrare, ne vom uita la transact-SQL utilizat în Microsoft SQL Server.

Injectarea SQL este posibilă atunci când un atacator își poate introduce propriul cod SQL într-o interogare (interogare) pentru a controla datele care sunt trimise aplicației.

O instrucțiune SQL tipică arată astfel:

Selectați id, prenume, prenume dintre autori

Această expresie preia „id”, „prenume” și „nume” din coloanele din tabelul „autori” și returnează toate rândurile din tabel. Eșantionul poate fi limitat la un anumit „autor”, de exemplu:

Selectați id, prenume, prenume de la autori, unde prenume = „john” și prenume = „smith”

Trebuie remarcat faptul că în acest șir de interogare literalele sunt separate printr-un singur ghilimeleu. Se presupune că „prenumele” și „numele de familie” sunt date care sunt introduse de utilizator. În acest caz, atacatorul va putea să-și facă propria interogare SQL adăugând propriile valori la aplicație. De exemplu:

Prenume: jo "hn Nume: fierar

Atunci expresia va lua următoarea formă:

Selectați id-ul, prenumele, prenumele de la autori, unde prenumele = "jo"hn" și prenume = "smith"

După ce baza de date încearcă să proceseze o astfel de interogare, va fi returnată următoarea eroare:

Server: Msg 170, Level 15, State 1, Line 1 Line 1: Sintaxă incorectă lângă „hn”.

Motivul erorii va fi acela că ghilimelele introduse vor strica structura delimitatorului din interogare. Deci baza de date va încerca fără succes să execute comanda „hn”, ceea ce va duce la o eroare. Ca rezultat, dacă un atacator introduce următoarele informații în formular:

Prenume: jo"; drop table autori-- Prenume:

Tabelul „autori” va fi șters, de ce se întâmplă asta vom vedea mai târziu.

S-ar putea să credeți că dacă eliminăm ghilimele simple din formularul de introducere și, de asemenea, le „înlocuim”, asta ar putea rezolva problema noastră. Și veți avea dreptate, totuși există unele probleme cu utilizarea acestei metode ca soluție la această problemă. În primul rând, nu toate datele introduse de utilizator sunt „șiruri”. Dacă formularul de utilizator va conține „id-ul” autorului, care este de obicei un număr. De exemplu, cererea noastră ar putea arăta astfel:

Selectați id, prenume, prenume de la autori unde id=1234

În acest caz, crackerul poate adăuga liber orice expresie SQL după datele numerice. În alte varietăți de interogări SQL, sunt utilizați diferiți delimitatori. De exemplu, în Microsoft Jet DBMS, delimitatorul ar fi „#”. În al doilea rând, „scăparea” de ghilimele simple nu este cea mai ușoară modalitate de a proteja, așa cum ar părea la început. Vom vorbi mai multe despre asta mai târziu.

Iată un exemplu bazat pe o pagină de conectare bazată pe Active Server Pages (ASP) care utilizează SQL pentru a accesa o bază de date pentru a autoriza un utilizator într-o aplicație.

Iată codul paginii care conține formularul de autentificare, în care sunt introduse numele de utilizator și parola.

Pagina de logare

Autentificare

nume de utilizator:
Parola:

Mai jos este codul (process_login.asp) care determină corectitudinea datelor introduse.

Nou pe site

>

Cel mai popular