SQL-i kärpimise haavatavus on tavaliselt olemas MySQL-i andmebaasides. Seda haavatavust kirjeldati esmakordselt dokumendis CVE-2008-4106, mis oli seotud WordPressi CMS-iga.
Kuidas SQL-i kärpimisrünnakud toimivad
See rünnak töötab tänu kasutaja sisendi kärpimisele andmebaasides, kasutades funktsioone "valik" ja "sisestamine".
- Kui vormiväljale sisestatakse sisend, kontrollib funktsioon 'select' andmebaasi sisenditele vastavat koondamist.
- Pärast üleliigsuse kontrollimist kontrollib funktsioon „sisestamine” sisendi pikkust ja kasutaja sisend kärbub, kui pikkus ületab.
Oletame, et arendaja loob tabeli „kasutajad” järgmise päringu kaudu:
tabeli kasutajate loomine (user_id INT EI TÄIELIK AUTO_INCREMENT,
kasutajanimi VARCHAR (20) EI NULL,
parool VARCHAR (40) EI NULL,
PÕHIVÕTI (kasutaja ID)
);
Selle skeemi kasutamisel, kui arendaja loob administraatori konto järgmisega:
kasutajanimi = 'admin'parool = “secret_p4ssw0ord”
Ilmselt pole need volikirjad avalikud. Andmebaasis on ainult üks administraatori konto ja kui ründaja üritab registreerida teist kontot administraatori kasutajanimega, nurjub ründaja andmebaasi koondamiskontrollide tõttu. Ründaja saab sellest koondamiskontrollist siiski mööda minna, et lisada veel üks administraatori konto, kasutades ära SQL Truncationi haavatavust. Oletame, et ründaja registreerib teise konto järgmise sisendiga:
Kasutajanimi = 'adminxxxxxxxxxxxxxxxrandom'(x on tühikud)
&
Parool = "RandomUser"
Andmebaas võtab kasutajanime (26 tähemärki) ja kontrollib, kas see on juba olemas. Seejärel kärbitakse sisend user_name ja andmebaasi sisestatakse 'admin' (tühikuga 'admin'), mille tulemuseks on kaks administraatori duplikaati.
Seejärel saab ründaja luua oma parooliga administraatori. Nüüd on andmebaasis kaks administraatori "user_name" kirjet, kuid erinevate paroolidega. Ründaja saab administraatori paneeli saamiseks sisse logida vastloodud mandaatidega, kuna nii kasutajanimed "admin" kui "admin" on andmebaasi tasemel võrdsed. Nüüd vaatame praktilise rünnaku näidist.
Rünnaku näidis
Selles näites võtame stsenaariumi veebisaidilt üle traadita.org. Overthewire'i kogukond pakub sõjalisi CTF-e, millel saame oma turvakontseptsioone harjutada. SQL-i kärpimise stsenaarium ilmneb natas mängus Level 26-> 27. Me pääseme tasemele järgmiselt:
URL: http: // natas27.natas.laborid.üle traadi.orgKasutajanimi: natas27
Parool: 55TBjpPZUUJgVP5b3BnbG6ON9uDPVzCJ
See tase on saadaval aadressil: https: // overthewire.org / wargames / natas / natas27.HTML. Teile kuvatakse sisselogimisleht, mis on SQL-i kärpimise rünnaku suhtes haavatav.
Lähtekoodi kontrollimisel näete, et kasutajanime pikkus on 64, nagu allpool näidatud.
Kasutaja nimega 'natas28' on juba olemas. Meie eesmärk on luua järgmine kasutaja nimega 'natas28', kasutades rünnakut SQL_truncation. Niisiis sisestame natas28, millele järgneb 57 tühikut ja juhuslik tähestik (meie puhul a), kasutajanimi ja mis tahes parool. A-täht pole ekraanipildil nähtav 65-tähemärgise kasutajanime tõttu. Pärast kasutajakonto loomist näete 'a."
Kui andmebaas sisaldab haavatavust sql_truncation, peaks andmebaasil olema nüüd kaks „natas28” kasutajanime. Üks kasutajanimi sisaldab meie parooli. Proovime sisestada mandaadid sisselogimislehele.
Nüüd oleme sisse logitud 'natas28' kasutajana.
Leevendamine
Selle rünnaku leevendamiseks peame arvestama mitme teguriga.
- Me ei tohiks lubada kriitiliste identiteetide, nagu kasutajanimi, dubleerimist. Peaksime neist identiteetidest tegema Esmased Võtmed.
- Kärbimisfunktsioon tuleks rakendada kõigi eesseadevormide väljade ja ka taustaprogrammi väljade jaoks, nii et andmebaasid saaksid kärbitud sisendeid.
- Range režiim peaks olema lubatud andmebaasi tasandil. Kui range režiim pole lubatud, annavad andmebaasid taustaprogrammis ainult hoiatusi, kuid salvestavad siiski dubleeritud andmed. Range režiimi korral annavad andmebaasid dubleerimise korral vigu ja väldivad andmete salvestamist.
Näiteks kontrollime ranget režiimi, kasutades järgmist päringut:
mysql> vali @@ sql_mode
Loome andmebaasi ja tabeli kasutajad."
mysql> LOO ANDMEBAASI testPäring OK, mõjutatud on 1 rida (0.02 sek)
mysql> Kasuta testi
Andmebaas muudetud
mysql> CREATE TABLE kasutajad (kasutajanimi VARCHAR (10), parool VARCHAR (10));
Päring OK, 0 rida on mõjutatud (0.05 sek)
Järgmisena loome päringu INSERT abil mandaatidega administraatori kasutaja.
mysql> INSERT INTO users VALUES ('admin', 'parool1');Päring OK, mõjutatud on 1 rida (0.01 sek)
Kasutajate tabeli teavet näeme, kasutades valikut „vali kasutajatelt *”.
Kasutajanime pikkus on 10 tähemärki. Nüüd proovime SQL-i kärpimisrünnakut.
Kui proovime sisestada järgmist:
Kasutajanimi = 'adminxxxxxa'(x on tühikud)
&
Parool = 'pass2'
Saame vea, mis tähendab, et range režiim on täiesti tõhus.
mysql> INSERT INTO kasutajate väärtused ('admin a', 'pass2')VIGA 1406 (22001): 1. rea veeru „kasutajanimi” jaoks on andmed liiga pikad
Kui range režiim pole lubatud, väljastab andmebaas hoiatusi, kuid sisestab andmed siiski tabelisse.
Järeldus
Ründajad saavad juurdepääsu kõrge privileegiga kontodele, kui teie rakenduses on haavatavus sql_trunction. Ründaja saab kriitiliste väljade abil hõlpsasti teavet kasutajanime ja selle andmebaasi pikkuse kohta, seejärel loob sama kasutajanime, millele järgnevad tühikud ja juhuslik tähestik pärast minimaalset pikkust, mille tulemusel luuakse mitu suure privileegiga kontot. See haavatavus on kriitiline, kuid seda saab vältida, kui võtate teatud turvameetmeid, näiteks aktiveerite kasutaja sisendite jaoks range režiimi ja muudate tundliku välja andmebaasi primaarvõtmeks.