![]() 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 |
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.
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
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
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.
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.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