SQL saīsināšanas ievainojamība parasti pastāv MySQL datu bāzēs. Šī ievainojamība pirmo reizi tika aprakstīta CVE-2008-4106, kas bija saistīta ar WordPress CMS.
Kā darbojas SQL saīsināšanas uzbrukumi
Šis uzbrukums darbojas tāpēc, ka tiek saīsināts lietotāju ievads datubāzēs, izmantojot funkcijas “izvēle” un “ievietošana”.
- Kad veidlapas laukā tiek ievadīta ievade, funkcija “select” pārbauda, vai datu bāzē esošajiem datiem atbilst redundance.
- Pēc atlaišanas pārbaudes funkcija “ievietošana” pārbauda ievades garumu, un lietotāja ievade saīsinās, ja garums pārsniedz.
Pieņemsim, ka izstrādātājs izveido tabulu “lietotāji”, izmantojot šādu vaicājumu:
izveidot tabulas lietotājus (user_id INT NAV NULL AUTO_INCREMENT,
user_name VARCHAR (20) NAV NULL,
parole VARCHAR (40) NAV NULL,
GALVENĀ ATSLĒGA (user_id)
);
Izmantojot šo shēmu, ja izstrādātājs izveido administratora kontu ar tālāk norādīto:
user_name = 'administrators'parole = “secret_p4ssw0ord”
Acīmredzot šie akreditācijas dati nav publiski pieejami. Datu bāzē ir tikai viens administratora konts, un, ja uzbrucējs mēģina reģistrēt citu kontu ar “admin” lietotājvārdu, uzbrucējs neizdosies datu bāzes atlaišanas pārbaudes dēļ. Uzbrucējs joprojām var apiet šo atlaišanas pārbaudi, lai pievienotu citu administratora kontu, izmantojot ievainojamību SQL saīsināšana. Pieņemsim, ka uzbrucējs reģistrē citu kontu ar šādu ievadi:
Lietotājvārds = 'adminxxxxxxxxxxxxxxxxandomand'(x ir atstarpes)
&
Parole = ”RandomUser”
Datu bāzē tiks ierakstīts “user_name” (26 rakstzīmes) un pārbaudīts, vai tas jau pastāv. Pēc tam ievads user_name tiks saīsināts un datu bāzē tiks ievadīts 'admin' ('admin' ar atstarpi), kā rezultātā tiks izveidoti divi administratora lietotāju dublikāti.
Pēc tam uzbrucējs var izveidot administratora lietotāju ar savu paroli. Tagad datu bāzē ir divi admin 'user_name' ieraksti, bet ar dažādām parolēm. Uzbrucējs var pieteikties, izmantojot jaunizveidotos akreditācijas datus, lai iegūtu administratora paneli, jo gan lietotāju_vārdi “admin”, gan “admin” ir vienādi datu bāzes līmenī. Tagad mēs aplūkosim praktiskā uzbrukuma paraugu.
Uzbrukuma paraugs
Šajā piemērā mēs ņemsim scenāriju no vietnes overthewire.org. Overthewire kopiena nodrošina karakuļļu CTF, uz kuriem mēs varam praktizēt savas drošības koncepcijas. SQL saīsināšanas scenārijs notiek natas spēlē 26. līmenis -> 27. Mēs varam piekļūt līmenim, izmantojot:
URL: http: // natas27.natas.laboratorijas.pārvilkt.orgLietotājvārds: natas27
Parole: 55TBjpPZUUJgVP5b3BnbG6ON9uDPVzCJ
Šis līmenis ir pieejams vietnē https: // overthewire.org / wargames / natas / natas27.html. Jums tiks parādīta pieteikšanās lapa, kas ir neaizsargāta pret SQL saīsināšanas uzbrukumu.
Pārbaudot pirmkodu, jūs redzēsiet, ka lietotājvārda garums ir 64, kā parādīts zemāk.
Lietotājs ar nosaukumu “natas28” jau pastāv. Mūsu mērķis ir izveidot citu lietotāju ar nosaukumu “natas28”, izmantojot uzbrukumu SQL_truncation. Tātad, mēs ievadīsim natas28, kam sekos 57 atstarpes un izlases alfabēts (mūsu gadījumā a), lietotājvārds un jebkura parole. Burts “a” ekrānuzņēmumā nav redzams 65 rakstzīmju garuma lietotājvārda dēļ. Pēc lietotāja konta izveides jūs varēsit redzēt 'a."
Ja datu bāzē ir ievainojamība sql_truncation, tad datubāzei tagad vajadzētu būt diviem “natas28” lietotājvārdiem. Vienā lietotājvārdā būs mūsu parole. Mēģināsim ievadīt akreditācijas datus pieteikšanās lapā.
Tagad mēs esam pieteikušies kā “natas28” lietotājs.
Mīkstināšana
Lai mazinātu šo uzbrukumu, mums būs jāņem vērā vairāki faktori.
- Mums nevajadzētu pieļaut kritisko identitāšu, piemēram, lietotājvārda, dublēšanos. Mums šīs identitātes būtu jāpadara par primārajām atslēgām.
- Saīsinātā funkcija jāievieš visiem priekšējās veidlapas laukiem, kā arī aizmugures koda laukiem, lai datu bāzes saņemtu saīsinātus ievadus.
- Stingrais režīms ir jāiespējo datu bāzes līmenī. Ja nav iespējots stingrais režīms, datubāzes aizmugurē sniedz tikai brīdinājumus, taču joprojām saglabā dublētos datus. Izmantojot stingru režīmu, datu bāzes rada kļūdas dublēšanās gadījumā un izvairās no datu saglabāšanas.
Piemēram, pārbaudīsim stingro režīmu, izmantojot šādu vaicājumu:
mysql> atlasiet @@ sql_mode
Mēs izveidosim datu bāzi un tabulas lietotājus."
mysql> IZVEIDOT DATU BĀZES testuVaicājums OK, ietekmēta 1 rinda (0.02 sek.)
mysql> Izmantot testu
Datu bāze mainīta
mysql> CREATE TABLE lietotāji (lietotājvārds VARCHAR (10), parole VARCHAR (10));
Vaicājums OK, ietekmētas 0 rindas (0.05 sek.)
Pēc tam mēs izveidosim administratora lietotāju ar akreditācijas datiem, izmantojot INSERT vaicājumu.
mysql> INSERT INTO users VALUES ('admin', 'password1');Vaicājums OK, ietekmēta 1 rinda (0.01 sek.)
Informāciju par lietotāju tabulu mēs varam redzēt, izmantojot opciju “izvēlēties * no lietotājiem”.
Lietotājvārda garums ir 10 rakstzīmes. Tagad mēs izmēģināsim SQL saīsināšanas uzbrukumu.
Mēģinot ievadīt sekojošo:
Lietotājvārds = 'adminxxxxxa'(x ir atstarpes)
&
Parole = 'pass2'
Mēs saņemsim kļūdu, kas nozīmē, ka stingrais režīms ir pilnīgi efektīvs.
mysql> INSERT INTO lietotāju vērtības ('admin a', 'pass2')KĻŪDA 1406 (22001): 1. rindā slejas “lietotājvārds” dati ir pārāk gari
Ja nav iespējots stingrais režīms, datu bāze izdos brīdinājumus, taču dati joprojām tiks ievietoti tabulā.
Secinājums
Uzbrucēji var iegūt piekļuvi augstas privilēģijas kontiem, ja jūsu lietojumprogrammā pastāv ievainojamība sql_trunction. Uzbrucējs var viegli iegūt informāciju par lietotājvārdu un tā datu bāzes garumu, izmantojot kritiskos laukus, pēc tam izveidot to pašu lietotājvārdu, pēc minimālā garuma atstarpes un nejaušus alfabētus, kā rezultātā tiek izveidoti vairāki augstas privilēģijas konti. Šī ievainojamība ir kritiska, taču no tās var izvairīties, ja veicat dažus drošības pasākumus, piemēram, aktivizējat stingru režīmu lietotāja ievadei un sensitīvo lauku padarot par primāro atslēgu datu bāzē.