Protecția bazei de date (2) - articol, pagina 7

În unele cazuri, injecția SCP este posibilă chiar și într-un parametru care este convertit de metodele mod_rewrite ale modulului apache, la parametrul GET al scriptului.

De exemplu, /news/127.html script-uri de tip sunt convertite în /news/news.php?id=127 următoarea regulă: RewriteRule ^ / stiri / \ html $ "/news/news.php?id=$1" (*.).







Aceasta va permite ca valorile parametrilor rău-intenționați să fie transmise scriptului. De exemplu, /news/128-1.html

în curând despre protecție.

Pentru a proteja împotriva tuturor celor de mai sus, este suficient să urmați câteva reguli simple.

1) pentru valori întregi și fracționare, înainte de a le folosi în interogare, este suficient să aduceți valoarea la tipul dorit.

În schimb, puteți introduce un sistem de urmărire a testelor în injecția SQL.

// scrieți în jurnal despre încercare

2) pentru parametrii string care nu sunt utilizați în regexp, etc., evităm citate.

3) în liniile care ar trebui să fie folosite în interior, cum ar fi regexp și așa mai departe, trebuie să afișați și caracterele speciale folosite de acești operatori, dacă este necesar. În caz contrar, puteți documenta utilizarea acestor simboluri.

Acest document nu acoperă sintaxa de bază SQL sau injectarea SQL. Se presupune că cititorul are deja o înțelegere excelentă a subiectului. Acest document se va concentra pe tehnici avansate care pot fi utilizate în atacurile asupra aplicațiilor web folosind Microsoft SQL Server. Aceste tehnici demonstrează modul în care un atacator poate folosi injecții SQL pentru a extrage conținut din baza de date, ocolind paravanul de protecție și pătrundând în rețeaua internă. Acest document este conceput pentru a învăța profesioniștii în domeniul securității informațiilor despre efectele potențial periculoase ale injecțiilor SQL care pot apărea în organizația dvs.

Aplicațiile Web devin din ce în ce mai sigure, deoarece numărul de notificări de atacuri, cum ar fi injecția SQL, crește. Cu toate acestea, în aplicațiile mari și complexe, o singură supraveghere poate fi rezultatul compromiterii întregului sistem. Mulți dezvoltatori de aplicații web și administratori pot avea un sentiment fals de securitate, deoarece folosesc proceduri stocate sau ascund mesajele de eroare returnate în fereastra browserului. Acest lucru dă motive să creadă că vulnerabilitatea nu poate fi utilizată.

Deși discutăm Microsoft SQL Server în acest document, acest lucru nu înseamnă că acest produs este mai puțin sigur decât alte platforme, cum ar fi Oracle sau IBM DB2. Injecția SQL nu este o vulnerabilitate specifică Microsoft SQL Server este, de asemenea, o problemă de bază de date în general. Poate că cea mai mare problemă cu Microsoft SQL Server este flexibilitatea. Această flexibilitate deschide noi oportunități pentru atacurile clasei SQL Injection. Scopul acestui document este de a arăta că, ori de câte ori un administrator sau un dezvoltator permite executarea unei interogări SQL arbitrare, sistemul atacat este deschis pentru captură completă. Acest lucru nu înseamnă că produsul Microsoft SQL Server este vulnerabil în ansamblu.







SQL Injection Detection

Când încercați să utilizați injecții SQL în aplicații, atacatorul are nevoie de o metodă pentru a determina dacă a fost introdusă o interogare SQL arbitrară. Există, de asemenea, o nevoie pentru o metodă de obținere a rezultatelor. Pentru aceasta, pot fi utilizate două funcții server SQL încorporate. Funcțiile OPENROWSET și OPENDATASOURCE pentru deschiderea unei surse de date la distanță. Aceste funcții sunt utilizate pentru a deschide o conexiune printr-un furnizor OLEDB. Funcția OPENROWSET va fi utilizată în toate exemplele, dar funcția OPENDATASOURCE poate fi utilizată cu aceleași rezultate.

Această expresie returnează toate rândurile tabelului1 din sursa de date la distanță:

'selectați * din tabelul1')

Opțiuni:
(1) Numele furnizorului OLEDB
(2) Șir de conectare (poate fi în formatul cerut de OLEDB sau ODBC)
(3) expresia SQL

'selectați * din tabel')

'selectați * din tabel')

În procesul de injectare SQL, atacatorul poate determina dacă interogarea SQL a fost executată. Dacă interogarea SQL are succes, serverul atacat va încerca să stabilească o conexiune de ieșire cu computerul atacatorului la portul specificat. Această conexiune SQL exterioară va fi, în majoritatea cazurilor, blocată de paravanul de protecție, deoarece este utilizat portul 80.

Această tehnică permite atacatorului să afle dacă a fost executată interogarea SQL, chiar dacă mesajele de eroare și rezultatele interogării nu au fost afișate în fereastra browserului.

Obținerea rezultatelor din SQL Injections

Funcțiile OPENROWSET și OPENDATASOURCE sunt utilizate cel mai adesea pentru a extrage datele necesare. Ele pot fi, de asemenea, folosite pentru plasarea datelor pe un server SQL la distanță. Funcția OPENROWSET poate fi utilizată nu numai pentru a executa o interogare SELECT, dar și pentru a efectua INSERT și DELETE în sursele de date externe. Prelucrarea datelor de la o sursă la distanță nu este un caz general și funcționează numai dacă furnizorul OLEDB acceptă această caracteristică. Furnizorul SQLOLEDB are o astfel de funcționalitate.

Următoarea este un exemplu despre modul de plasare a datelor într-o sursă de date externă:

'selectați * din tabelul1')

selectați * din tabelul2

În acest exemplu, toate rândurile din tabela 2 a serverului SQL local vor fi adăugate la tabela table1 localizată pe serverul de la distanță. Pentru realizarea cu succes a interogării, este necesar ca ambele tabele să aibă o structură similară.

După cum am aflat în paragraful anterior, sursele de date la distanță pot fi redirecționate către orice server de atac al atacatorului.

Atacatorul poate modifica interogarea de mai sus pentru a se conecta la o sursă de date la distanță, cum ar fi o copie a Microsoft SQL Server care rulează pe aparatul atacatorului.

'selectați * din tabelul1'

selectați * din tabelul2

Pentru a introduce datele cu succes, atacatorul trebuie să creeze un tabel1 cu aceleași coloane și tipuri de date ca în tabelul2. Aceste informații pot fi determinate folosind același truc pentru tabelele de sistem. Acest lucru va funcționa, deoarece structura tabelelor de sistem este cunoscută în prealabil. Atacatorul ar trebui să înceapă prin crearea de tabele cu o structură identică cu tabelele de sistem sysdatabases, sysobjects și syscolumns. Apoi, pentru a extrage informațiile necesare, trebuie executate următoarele interogări SQL:

'selectați * din _sysdatabases')

selectați * din master.dbo.sysdatabases

'selectați * din _sysobjects')







Articole similare

Trimiteți-le prietenilor: