Ranjivost SQL skraćivanja obično postoji u MySQL bazama podataka. Ova je ranjivost prvi put opisana u CVE-2008-4106, koja je bila povezana s WordPress CMS-om.
Kako funkcioniraju napadi na skraćivanje SQL-a
Ovaj napad djeluje zbog skraćivanja korisničkog unosa u bazama podataka pomoću funkcija 'odabira' i 'umetanja'.
- Kada je unos dat u polju obrasca, funkcija 'select' provjerava redundanciju koja odgovara ulazima u bazi podataka.
- Nakon provjere suvišnosti, funkcija 'umetanja' provjerava duljinu unosa, a korisnički unos će se skratiti ako duljina premaši.
Pretpostavimo da programer kreira tablicu "korisnici" putem sljedećeg upita:
stvoriti korisnike tablice (user_id INT NIJE NULL AUTO_INCREMENT,
korisničko ime VARCHAR (20) NIJE NULL,
lozinka VARCHAR (40) NIJE NULL,
PRIMARNI KLJUČ (user_id)
);
Koristeći ovu shemu, ako programer stvori administratorski račun sa sljedećim:
user_name = 'admin'lozinka = "secret_p4ssw0ord"
Očito je da ove vjerodajnice nisu javne. U bazi podataka postoji samo jedan administratorski račun, a ako napadač pokuša registrirati drugi račun s korisničkim imenom 'admin', napadač neće uspjeti zbog provjere suvišnosti baze podataka. Napadač i dalje može zaobići tu provjeru suvišnosti kako bi dodao još jedan račun administratora iskorištavajući ranjivost SQL skraćivanja. Pretpostavimo da napadač registrira drugi račun sa sljedećim ulazom:
Korisničko ime = 'adminxxxxxxxxxxxxxxx slučajno'(x su razmaci)
&
Lozinka = "RandomUser"
Baza podataka će uzeti 'korisničko ime' (26 znakova) i provjeriti postoji li to već. Zatim će se unos korisničko ime skratiti, a u bazu podataka unijet će se 'admin' ('admin' s razmakom), što će rezultirati dvama duplikatima administratora.
Tada napadač može stvoriti 'admin' korisnika sa vlastitom lozinkom. Sada baza podataka ima dva administratorska "user_name" unosa, ali s različitim lozinkama. Napadač se može prijaviti s novostvorenim vjerodajnicama kako bi dobio administratorsku ploču jer su oba korisnička imena "admin" i "admin" jednaka za razinu baze podataka. Sada ćemo pogledati primjer praktičnog napada.
Uzorak napada
U ovom ćemo primjeru preuzeti web stranicu s prekomjerne žice.org. Zajednica overwireova osigurava CTF-ove ratnih igara na kojima možemo vježbati svoje sigurnosne koncepte. Scenarij SQL skraćivanja događa se u natas igri 26 -> 27. Razini možemo pristupiti na sljedeći način:
URL: http: // natas27.natas.laboratorijima.prevrnuti.orgKorisničko ime: natas27
Lozinka: 55TBjpPZUUJgVP5b3BnbG6ON9uDPVzCJ
Ova je razina dostupna na: https: // overthewire.org / wargames / natas / natas27.html. Prikazat će vam se stranica za prijavu koja je ranjiva na napad SQL skraćivanja.
Nakon pregleda izvornog koda, vidjet ćete da je duljina korisničkog imena 64, kao što je prikazano u nastavku.
Korisnik pod nazivom 'natas28' već postoji. Cilj nam je stvoriti drugog korisnika pod nazivom 'natas28' pomoću napada SQL_truncation. Dakle, unijet ćemo natas28, nakon čega slijedi 57 razmaka i slučajna abeceda (u našem slučaju a), korisničko ime i bilo koja lozinka. Slovo "a" nije vidljivo na snimci zaslona zbog korisničkog imena dužine 65 znakova. Nakon stvaranja korisničkog računa, moći ćete vidjeti 'a.'
Ako baza podataka sadrži ranjivost sql_truncation, tada bi baza podataka trebala imati dva korisnička imena 'natas28'. Jedno korisničko ime sadržavat će našu lozinku. Pokušajmo unijeti vjerodajnice na stranici za prijavu.
Sada smo prijavljeni kao korisnik 'natas28'.
Smanjenje
Da bismo ublažili ovaj napad, morat ćemo uzeti u obzir više čimbenika.
- Ne bismo smjeli dopustiti dupliciranje kritičnih identiteta poput korisničkog imena. Te bismo identitete trebali učiniti Primarnim ključevima.
- Funkcija skraćivanja trebala bi se implementirati za sva polja obrazaca sučelja, kao i pozadinski kôd, tako da baze podataka primaju skraćene ulaze.
- Strogi način rada trebao bi biti omogućen na razini baze podataka. Ako nije omogućen strogi način rada, baze podataka samo daju upozorenja u pozadini, ali i dalje spremaju duplicirane podatke. U strogom načinu rada, baze podataka daju pogreške u slučaju dupliciranja i izbjegavaju spremanje podataka.
Na primjer, provjerimo strogi način pomoću sljedećeg upita:
mysql> odaberite @@ sql_mode
Stvorit ćemo bazu podataka i korisnike tablice.'
mysql> test STVARI BAZU PODATAKAUpit je u redu, zahvaćen 1 redak (0.02 sek)
mysql> Koristi test
Baza podataka promijenjena
mysql> CREATE TABLE korisnici (korisničko ime VARCHAR (10), lozinka VARCHAR (10));
Upit je u redu, 0 redaka pogođeno (0.05 sek)
Dalje ćemo stvoriti administrativnog korisnika s vjerodajnicama pomoću upita INSERT.
mysql> UMETNI U VRIJEDNOSTI korisnika ('admin', 'password1');Upit je u redu, zahvaćen 1 redak (0.01 sek)
Informacije o tablici "korisnici" možemo vidjeti pomoću opcije "odaberi * od korisnika".
Duljina korisničkog imena je 10 znakova. Sada ćemo pokušati s napadom SQL skraćivanja.
Kada pokušamo unijeti sljedeće:
Korisničko ime = 'adminxxxxxa'(x su razmaci)
&
Lozinka = 'pass2'
Dobit ćemo pogrešku, što znači da je strogi način rada potpuno učinkovit.
mysql> INSERT INTO u korisničke vrijednosti ('admin a', 'pass2')POGREŠKA 1406 (22001): Podaci su predugi za stupac 'korisničko ime' u retku 1
Ako nije omogućen strogi način rada, baza podataka će izdavati upozorenja, ali će svejedno umetati podatke u tablicu.
Zaključak
Napadači mogu dobiti pristup visoko privilegiranim računima ako u vašoj aplikaciji postoji ranjivost sql_trunction. Napadač lako može dobiti informacije o korisničkom imenu i duljini njegove baze podataka pomoću kritičnih polja, zatim stvoriti isto korisničko ime, nakon čega slijede razmaci i nasumične abecede nakon minimalne duljine, što rezultira stvaranjem više računa s visokim privilegijima. Ova je ranjivost kritična, ali može se izbjeći ako poduzmete neke sigurnosne mjere predostrožnosti, poput aktiviranja strogog načina za korisničke unose i postavljanja osjetljivog polja kao primarnog ključa u bazi podataka.