V databázach MySQL zvyčajne existuje chyba skrátenia SQL. Táto chyba bola prvýkrát popísaná v CVE-2008-4106, ktorá sa týkala WordPress CMS.
Ako fungujú skrátené útoky SQL
Tento útok funguje z dôvodu oklieštenia vstupu používateľa v databázach pomocou funkcií „výber“ a „vloženie“.
- Keď je vstup zadaný do poľa formulára, funkcia 'select' skontroluje redundanciu zodpovedajúcu vstupom v databáze.
- Po skontrolovaní redundancie funkcia „vloženia“ skontroluje dĺžku vstupu a vstup používateľa sa skráti, ak dĺžka presiahne.
Predpokladajme, že vývojár vytvorí tabuľku „používatelia“ pomocou nasledujúceho dotazu:
vytvoriť používateľov tabuľky (user_id INT NIE JE NULL AUTO_INCREMENT,
meno_pouzivatela VARCHAR (20) NIE NULL,
heslo VARCHAR (40) NIE NULL,
PRIMÁRNY KLÍČ (user_id)
);
Ak pomocou tejto schémy vytvorí vývojár účet správcu s týmto:
user_name = 'admin'heslo = “secret_p4ssw0ord”
Je zrejmé, že tieto poverovacie listiny nie sú verejné. V databáze je iba jeden účet správcu. Ak sa útočník pokúsi zaregistrovať iný účet pomocou používateľského mena „správca“, útočník zlyhá z dôvodu kontroly nadbytočnosti databázy. Útočník môže túto kontrolu nadbytočnosti obísť a pridať ďalší účet správcu využitím chyby zabezpečenia Truncation SQL. Predpokladajme, že útočník zaregistruje iný účet s týmto vstupom:
User_name = 'adminxxxxxxxxxxxxxxxxxrandom'(x sú medzery)
&
Heslo = „RandomUser“
Databáza prevezme meno_uživateľa (26 znakov) a skontroluje, či už existuje. Potom bude vstup user_name skrátený a do databázy bude vložený 'admin' ('admin' s medzerou), čo povedie k dvom duplicitným užívateľom admin.
Útočník je potom schopný vytvoriť používateľa „admin“ s vlastným heslom. Databáza má teraz dva položky správcu „user_name“, ale s rôznymi heslami. Útočník sa môže prihlásiť pomocou novovytvorených prihlasovacích údajov, aby získal panel správcu, pretože obe používateľské mená „admin“ a „admin“ sú na úrovni databázy rovnaké. Teraz sa pozrieme na ukážkový praktický útok.
Ukážka útoku
V tomto príklade si vezmeme scenár z overthewire webu.org. Komunita overthewire poskytuje bojové CTF, na ktorých si môžeme precvičiť naše bezpečnostné koncepty. Scenár skrátenia SQL nastáva v hre natas úroveň 26-> 27. Na úroveň môžeme získať prístup pomocou nasledujúcich nástrojov:
URL: http: // natas27.natas.laboratóriá.overthewire.orgPoužívateľské meno: natas27
Heslo: 55TBjpPZUUJgVP5b3BnbG6ON9uDPVzCJ
Táto úroveň je k dispozícii na adrese: https: // overthewire.org / wargames / natas / natas27.html. Zobrazí sa prihlasovacia stránka, ktorá je zraniteľná voči útoku Truncation SQL.
Po kontrole zdrojového kódu uvidíte, že dĺžka používateľského mena je 64, ako je uvedené nižšie.
Používateľ s menom „natas28“ už existuje. Naším cieľom je vytvoriť iného používateľa s menom 'natas28' pomocou útoku SQL_truncation. Zadáme teda natas28, po ktorom bude nasledovať 57 medzier a náhodná abeceda (v našom prípade a), používateľské meno a akékoľvek heslo. Písmeno „a“ nie je na snímke obrazovky viditeľné kvôli používateľskému menu s dĺžkou 65 znakov. Po vytvorení používateľského účtu uvidíte 'a.„
Ak databáza obsahuje chybu zabezpečenia sql_truncation, potom by mala mať táto databáza dve používateľské mená „natas28“. Jedno užívateľské meno bude obsahovať naše heslo. Skúsme zadať poverenia na prihlasovacej stránke.
Teraz sme prihlásení ako používateľ „natas28“.
Zmiernenie
Aby sme tento útok zmiernili, budeme musieť zvážiť viac faktorov.
- Nemali by sme pripustiť duplikáciu kritických identít, napríklad používateľského mena. Mali by sme vytvoriť tieto identity Primárne kľúče.
- Funkcia skrátenia by mala byť implementovaná pre všetky polia frontendových formulárov, ako aj pre backendový kód, aby databázy dostávali skrátené vstupy.
- Na úrovni databázy by mal byť povolený prísny režim. Bez povoleného prísneho režimu poskytujú databázy iba výstrahy v serverovom rozhraní, stále však ukladajú duplicitné údaje. V prísnom režime poskytujú databázy chyby v prípade duplikácie a vyhýbajú sa ukladaniu údajov.
Skontrolujme napríklad prísny režim pomocou nasledujúceho dotazu:
mysql> vyberte @@ sql_mode
Vytvoríme databázu a používateľov tabuľky.„
mysql> VYTVORIŤ test DATABÁZYDotaz v poriadku, ovplyvnený 1 riadok (0.02 s)
mysql> Použiť test
Databáza sa zmenila
mysql> CREATE TABLE používatelia (užívateľské meno VARCHAR (10), heslo VARCHAR (10));
Dopyt v poriadku, ovplyvnených 0 riadkov (0.05 s)
Ďalej pomocou dotazu INSERT vytvoríme správcovského používateľa s povereniami.
mysql> VLOŽIŤ HODNOTY používateľov ('admin', 'heslo1');Dotaz v poriadku, ovplyvnený 1 riadok (0.01 s)
Informácie v tabuľke „používatelia“ môžeme zobraziť pomocou možnosti „vybrať * od používateľov“.
Dĺžka používateľského mena je 10 znakov. Teraz vyskúšame útok skrátenia SQL.
Keď sa pokúsime zadať nasledujúce:
Užívateľské meno = 'adminxxxxxa'(x sú medzery)
&
Heslo = 'pass2'
Dostaneme chybu, čo znamená, že prísny režim je úplne efektívny.
mysql> VLOŽIŤ do užívateľských hodnôt ('admin a', 'pass2')CHYBA 1406 (22001): Údaje príliš dlhé pre stĺpec „používateľské meno“ v riadku 1
Bez povoleného prísneho režimu bude databáza odosielať varovania, ale bude stále vkladať údaje do tabuľky.
Záver
Útočníci môžu získať prístup k účtom s vysokými oprávneniami, ak vo vašej aplikácii existuje chyba zabezpečenia sql_trunction. Útočník môže ľahko získať informácie o používateľskom mene a jeho dĺžke databázy pomocou kritických polí, potom vytvoriť rovnaké používateľské meno, po ktorom nasledujú medzery a náhodná abeceda po minimálnej dĺžke, čo vedie k vytvoreniu viacerých účtov s vysokými právami. Táto zraniteľnosť je kritická, ale je možné sa jej vyhnúť, ak urobíte nejaké bezpečnostné opatrenia, napríklad aktivujete prísny režim pre vstupy používateľov a nastavíte citlivé pole ako hlavný kľúč v databáze.