Turvalisus

SQL-i kärpimise rünnak

SQL-i kärpimise rünnak
SQL Truncationi haavatavus tekib siis, kui andmebaas kärpib kasutaja sisendit pikkuse piirangu tõttu. Ründajad saavad koguda teavet kriitilise välja pikkuse kohta (näiteks kasutajanimi) ja kasutada seda teavet volitamata juurdepääsu saamiseks. Ründajad saavad oma registreeritud parooliga sisse logida mõne muu kasutajana, näiteks administraatorina.

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".

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.org
Kasutajanimi: 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.

Näiteks kontrollime ranget režiimi, kasutades järgmist päringut:

mysql> vali @@ sql_mode

Loome andmebaasi ja tabeli kasutajad."

mysql> LOO ANDMEBAASI test
Pä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.

Viis parimat mängu püüdmise kaarti
Me kõik oleme YouTube'is voogesituse mänge näinud ja armastanud. PewDiePie, Jakesepticye ja Markiplier on vaid mõned tipptasemel mängijatest, kes on t...
Kuidas mängu Linuxis arendada
Kümme aastat tagasi ei osanud paljud Linuxi kasutajad ennustada, et nende lemmikoperatsioonisüsteem on ühel päeval populaarne kommertsvideomängude män...
Kommertsmängumootorite avatud lähtekoodiga sadamad
Tasuta, avatud lähtekoodiga ja platvormidevaheliste mängumootorite puhkusereise saab kasutada nii vanade kui ka mõnede üsna hiljutiste mängude pealkir...