Vodič za SQL ubacivanje: Kako učiti pomoću primjera
Što je SQL injekcija?
SQL Injection je napad koji truje dinamičke SQL izjave kako bi komentirao određene dijelove izjave ili dodao uvjet koji će uvijek biti istinit. Iskorištava nedostatke u dizajnu loše dizajniranih web aplikacija za iskorištavanje SQL naredbi za izvođenje zlonamjernog SQL koda.
Podaci su jedna od najvitalnijih komponenti informacijskih sustava. Organizacija koristi web-aplikacije temeljene na bazi podataka za dobivanje podataka od kupaca. SQL je akronim za Structured Query Language. Koristi se za dohvaćanje i manipuliranje podacima u bazi podataka.
Kako funkcionira napad SQL injekcijom?
Vrste napada koji se mogu izvesti korištenjem SQL injekcije razlikuju se ovisno o vrsti pogona baze podataka. Napad radi na dinamičkim SQL izjavama. Dinamička izjava je izjava koja se generira tijekom izvođenja pomoću lozinke parametara iz web obrasca ili URI niza upita.
Primjer SQL injekcije
Razmotrimo jednostavnu web aplikaciju s obrascem za prijavu. Kôd za HTML obrazac prikazan je u nastavku.
<form action=‘index.php’ method="post"> <input type="email" name="email" required="required"/> <input type="password" name="password"/> <input type="checkbox" name="remember_me" value="Remember me"/> <input type="submit" value="Submit"/> </form>
OVDJE,
- Gornji obrazac prihvaća adresu e-pošte i lozinku, a zatim ih šalje a PHP datoteka pod nazivom index.php.
- Ima opciju pohranjivanja sesije prijave u kolačić. To smo zaključili iz potvrdnog okvira Remember_me. Za slanje podataka koristi post metodu. To znači da vrijednosti nisu prikazane u URL-u.
Pretpostavimo da je izjava u pozadini za provjeru korisničkog ID-a sljedeća
SELECT * FROM users WHERE email = $_POST['email'] AND password = md5($_POST['password']);
OVDJE,
- Gornja izjava koristi vrijednosti od
$_POST[]
izravno bez dezinfekcije. - Lozinka je šifrirana pomoću MD5 algoritma.
Ilustrirati ćemo napad SQL injekcijom koristeći sqlfiddle. Otvorite URL http://sqlfiddle.com/ u vašem web pregledniku. Dobit ćete sljedeći prozor.
Napomena: morat ćete napisati SQL naredbe
Korak 1) Unesite ovaj kod u lijevo okno
CREATE TABLE `users` ( `id` INT NOT NULL AUTO_INCREMENT, `email` VARCHAR(45) NULL, `password` VARCHAR(45) NULL, PRIMARY KEY (`id`)); insert into users (email,password) values ('m@m.com',md5('abc'));
Korak 2) Kliknite Izradi shemu
Korak 3) Unesite ovaj kod u desno okno
select * from users;
Korak 4) Pritisnite Pokreni SQL. Vidjet ćete sljedeći rezultat
Pretpostavimo korisničke zalihe admin@admin.sys i 1234 kao lozinku. Izjava koja bi se izvršila prema bazi podataka bila bi
SELECT * FROM users WHERE email = 'admin@admin.sys' AND password = md5('1234');
Gornji kôd može se iskoristiti komentiranjem dijela lozinke i dodavanjem uvjeta koji će uvijek biti istinit. Pretpostavimo da napadač unese sljedeći unos u polje adrese e-pošte.
xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ]
xxx za lozinku.
Generirana dinamička izjava bit će sljedeća.
SELECT * FROM users WHERE email = 'xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ] AND password = md5('1234');
OVDJE,
- xxx@xxx.xxx završava jednim navodnikom koji dovršava navodnik niza
OR 1 = 1
LIMIT 1 je uvjet koji će uvijek biti istinit i ograničava vraćene rezultate na samo jedan zapis.- — ' I ... je SQL komentar koji eliminira dio lozinke.
Kopirajte gornju SQL naredbu i zalijepite je SQL FiddleTekstni okvir Pokreni SQL kao što je prikazano u nastavku
Hakiranje: SQL umetanje web aplikacije
Imamo jednostavnu web aplikaciju na http://www.techpanda.org/ koji je ranjiv na napade SQL Injection samo u svrhu demonstracije. Gornji kod HTML obrasca preuzet je sa stranice za prijavu. Aplikacija pruža osnovnu sigurnost kao što je čišćenje polja e-pošte. To znači da se naš gornji kod ne može koristiti za zaobilaženje prijave.
Da bismo to zaobišli, možemo umjesto toga iskoristiti polje lozinke. Donji dijagram prikazuje korake koje morate slijediti
Pretpostavimo da napadač unese sljedeći unos
- Korak 1: Unesite xxx@xxx.xxx kao adresu e-pošte
- Korak 2: Unesite xxx') ILI 1 = 1 — ]
- Kliknite na gumb Pošalji
- Bit ćete usmjereni na nadzornu ploču
Generirana SQL izjava bit će sljedeća
SELECT * FROM users WHERE email = 'xxx@xxx.xxx' AND password = md5('xxx') OR 1 = 1 -- ]');
Donji dijagram ilustrira generiranu izjavu.
OVDJE,
- Izjava inteligentno pretpostavlja da se koristi md5 enkripcija
- Dovršava jednostruke navodnike i zatvorenu zagradu
- Izjavi dodaje uvjet koji će uvijek biti istinit
Općenito, uspješan napad SQL Injection pokušava nizom različitih tehnika kao što su one prikazane gore za izvođenje uspješnog napada.
Druge vrste napada SQL injekcijom
SQL injekcije mogu učiniti više štete nego samo propuštanjem algoritama za prijavu. Neki od napada uključuju
- Brisanje podataka
- Ažuriranje podataka
- Umetanje podataka
- Izvršavanje naredbi na poslužitelju koji mogu preuzeti i instalirati zlonamjerne programe poput trojanaca
- Izvoz vrijednih podataka poput podataka o kreditnoj kartici, e-pošte i lozinki na napadačev udaljeni poslužitelj
- Dobivanje podataka za prijavu korisnika itd
- SQL injekcija temeljena na kolačićima
- SQL ubacivanje temeljeno na pogreškama
- Slijepo SQL ubrizgavanje
Gore navedeni popis nije konačan; samo vam daje ideju o tome što SQL Injection
Alati za automatizaciju za SQL Injection
U gornjem primjeru koristili smo tehnike ručnog napada temeljene na našem golemom poznavanju SQL-a. Postoje automatizirani alati koji vam mogu pomoći da napade izvedete učinkovitije iu najkraćem mogućem vremenu. Ovi alati uključuju
- SQLMap – http://sqlmap.org/
- JSQL injekcija – https://tools.kali.org/vulnerability-analysis/jsql
Kako se spriječiti od napada SQL injekcijom
Organizacija može usvojiti sljedeću politiku kako bi se zaštitila od napada SQL Injection.
- Nikada se ne smije vjerovati korisničkom unosu – Uvijek se mora očistiti prije upotrebe u dinamičkim SQL izjavama.
- Pohranjene procedure – oni mogu enkapsulirati SQL izjave i tretirati sve ulaze kao parametre.
- Pripremljene izjave – pripremljene izjave za rad tako što ćete prvo stvoriti SQL izjavu, a zatim tretirati sve dostavljene korisničke podatke kao parametre. Ovo nema utjecaja na sintaksu SQL naredbe.
- Regularni izrazi – oni se mogu koristiti za otkrivanje potencijalnog štetnog koda i njegovo uklanjanje prije izvršavanja SQL naredbi.
- Korisnička prava pristupa povezivanju s bazom podataka – samo potrebna prava pristupa treba dati računima koji se koriste spojiti na bazu podataka. Ovo može pomoći u smanjenju onoga što SQL izjave mogu izvesti na poslužitelju.
- Poruke o pogrešci – oni ne bi trebali otkrivati osjetljive informacije i gdje se točno dogodila pogreška. Jednostavne prilagođene poruke o pogrešci kao što je "Žao nam je, imamo tehničke pogreške. Kontaktiran je tehnički tim. Pokušajte ponovno kasnije” može se koristiti umjesto prikaza SQL naredbi koje su uzrokovale pogrešku.
Aktivnost hakiranja: Koristite Havij za SQL Injection
U ovom praktičnom scenariju koristit ćemo program Havij Advanced SQL Injection za skeniranje web stranice u potrazi za ranjivostima.
Napomena: vaš antivirusni program može ga označiti zbog njegove prirode. Trebali biste ga dodati na popis izuzetaka ili pauzirati antivirusni softver.
Slika ispod prikazuje glavni prozor za Havij
Gore navedeni alat može se koristiti za procjenu ranjivosti web stranice/aplikacije.
Rezime
- SQL Injection je vrsta napada koja iskorištava loše SQL izjave
- SQL injekcija se može koristiti za zaobilaženje algoritama za prijavu, dohvaćanje, umetanje te ažuriranje i brisanje podataka.
- Alati za ubacivanje SQL-a uključuju SQLMap, SQLPing i SQLSmack itd.
- Dobra sigurnosna politika prilikom pisanja SQL izjave može pomoći u smanjenju napada SQL injekcijom.