Ranljivost okrnjenosti SQL običajno obstaja v podatkovnih bazah MySQL. Ta ranljivost je bila prvič opisana v CVE-2008-4106, ki je bila povezana s WordPress CMS.
Kako delujejo napadi skrajšanja SQL
Ta napad deluje zaradi okrnitve uporabniškega vnosa v zbirkah podatkov s pomočjo funkcij 'izbira' in 'vstavljanje'.
- Ko je vnos podan v polju obrazca, funkcija 'select' preveri redundanco, ki ustreza vhodom v bazo podatkov.
- Po preverjanju odvečnosti funkcija "vstavljanje" preveri dolžino vnosa in uporabniški vnos bo okrnjen, če dolžina preseže.
Recimo, da razvijalec ustvari tabelo "uporabniki" z naslednjo poizvedbo:
ustvari uporabnike tabele (user_id INT NOT NULL AUTO_INCREMENT,
uporabniško ime VARCHAR (20) NOT NULL,
geslo VARCHAR (40) NOT NULL,
OSNOVNI KLJUČ (user_id)
);
Če razvijalec s pomočjo te sheme ustvari skrbniški račun z naslednjim:
user_name = 'admin'geslo = “secret_p4ssw0ord”
Očitno te poverilnice niso javne. V bazi podatkov je samo en skrbniški račun in če napadalec poskuša registrirati drug račun z uporabniškim imenom 'admin', napadalec ne bo uspel zaradi preverjanja odvečnosti baze podatkov. Napadalec lahko še vedno obide to preverjanje odvečnosti, da doda nov skrbniški račun z izkoriščanjem ranljivosti SQL Truncation. Recimo, da napadalec registrira drug račun z naslednjimi vnosi:
Uporabniško ime = 'adminxxxxxxxxxxxxxxxrandom'(x so presledki)
&
Geslo = "RandomUser"
Baza podatkov bo vzela ime uporabnika (26 znakov) in preverila, ali to že obstaja. Nato bo vnos uporabniško ime okrnjen in v bazo podatkov bo vnesen 'admin' ('admin' s presledkom), kar bo povzročilo dva podvojena uporabnika admin.
Nato lahko napadalec ustvari "skrbniškega" uporabnika z lastnim geslom. Zdaj ima baza podatkov dva skrbniška vnosa 'user_name', vendar z različnimi gesli. Napadalec se lahko prijavi z novo ustvarjenimi poverilnicami, da dobi skrbniško ploščo, ker sta obe uporabniški imeni "admin" in "admin" enaki za raven baze podatkov. Zdaj si bomo ogledali vzorec praktičnega napada.
Vzorčni napad
V tem primeru bomo s spletnega mesta prevzeli scenarij.org. Skupnost overthewire ponuja CTF-je za vojne igre, na katerih lahko izvajamo svoje varnostne koncepte. Scenarij okrnitve SQL se zgodi v igri natas, nivo 26-> 27. Do ravni lahko pridemo z naslednjim:
URL: http: // natas27.natas.laboratorijih.prevrniti.orgUporabniško ime: natas27
Geslo: 55TBjpPZUUJgVP5b3BnbG6ON9uDPVzCJ
Ta raven je na voljo na: https: // overthewire.org / wargames / natas / natas27.html. Prikazala se vam bo prijavna stran, ki je ranljiva za napad na okrnitev SQL.
Po pregledu izvorne kode boste videli, da je dolžina uporabniškega imena 64, kot je prikazano spodaj.
Uporabnik z imenom 'natas28' že obstaja. Naš cilj je z napadom SQL_truncation ustvariti drugega uporabnika z imenom 'natas28'. Vnesli bomo natas28, nato 57 presledkov in naključno abecedo (v našem primeru a), uporabniško ime in katero koli geslo. Črka 'a' ni vidna na posnetku zaslona zaradi 65-mestnega uporabniškega imena. Po ustvarjanju uporabniškega računa boste lahko videli 'a."
Če baza podatkov vsebuje ranljivost sql_truncation, mora imeti baza zdaj dve uporabniški imeni 'natas28'. Eno uporabniško ime bo vsebovalo naše geslo. Poskusimo vnesti poverilnice na prijavni strani.
Zdaj smo prijavljeni kot uporabnik 'natas28'.
Blažitev
Za ublažitev tega napada bomo morali upoštevati več dejavnikov.
- Ne smemo dovoliti podvajanja kritičnih identitet, kot je uporabniško ime. Te identitete bi morali narediti za primarne ključe.
- Funkcijo obrezovanja je treba implementirati za vsa polja obrazcev sočelja, pa tudi zaledno kodo, tako da bodo baze podatkov prejemale okrnjene vhode.
- Strogi način mora biti omogočen na ravni baze podatkov. Če ni omogočen strog način, zbirke podatkov opozarjajo le v zaledju, vendar podvojene podatke še vedno shranjujejo. V strogem načinu baze podatkov povzročajo napake v primeru podvajanja in preprečujejo shranjevanje podatkov.
Na primer, preverimo strog način z naslednjo poizvedbo:
mysql> izberite @@ sql_mode
Ustvarili bomo bazo podatkov in uporabnike tabele."
mysql> Ustvari test podatkovne bazePoizvedba v redu, prizadeta 1 vrstica (0.02 s)
mysql> Uporabi test
Baza podatkov spremenjena
mysql> USTVARI TABELO uporabniki (uporabniško ime VARCHAR (10), geslo VARCHAR (10));
Poizvedba je v redu, 0 vrstic je prizadetih (0.05 s)
Nato bomo z uporabo poizvedbe INSERT ustvarili skrbniškega uporabnika s poverilnicami.
mysql> VSTAVITE V VREDNOSTI uporabnikov ('admin', 'password1');Poizvedba v redu, prizadeta 1 vrstica (0.01 s)
Podatke v tabeli »uporabniki« si lahko ogledamo z možnostjo »izberite * od uporabnikov«.
Dolžina uporabniškega imena je 10 znakov. Zdaj bomo poskusili napad okrnitve SQL.
Ko poskušamo vnesti naslednje:
Uporabniško ime = 'adminxxxxxa'(x so presledki)
&
Geslo = 'pass2'
Dobili bomo napako, kar pomeni, da je strog način popolnoma učinkovit.
mysql> INSERT INTO uporabniške vrednosti ('admin a', 'pass2')NAPAKA 1406 (22001): Podatki so predolgi za stolpec 'uporabniško ime' v vrstici 1
Brez omogočenega strogega načina bo baza podatkov izdala opozorila, vendar bo podatke vseeno vstavila v tabelo.
Zaključek
Napadalci lahko dobijo dostop do visoko privilegiranih računov, če v vaši aplikaciji obstaja ranljivost sql_trunction. Napadalec lahko z uporabo kritičnih polj zlahka dobi informacije o uporabniškem imenu in dolžini njegove baze podatkov, nato pa ustvari isto uporabniško ime, čemur sledijo presledki in naključne abecede po najmanjši dolžini, kar ima za posledico ustvarjanje več računov z visokimi privilegiji. Ta ranljivost je kritična, vendar se ji je mogoče izogniti, če sprejmete nekatere varnostne ukrepe, na primer aktivirate strog način za vnose uporabnikov in občutljivo polje postavite kot primarni ključ v zbirki podatkov.