V databázích MySQL obvykle existuje chyba zabezpečení týkající se zkrácení jazyka SQL. Tato chyba zabezpečení byla poprvé popsána v CVE-2008-4106, která se týkala WordPress CMS.
Jak fungují zkrácené útoky SQL
Tento útok funguje kvůli zkrácení vstupu uživatele v databázích pomocí funkcí „výběr“ a „vložení“.
- Když je zadán vstup do pole formuláře, funkce 'vybrat' zkontroluje redundanci odpovídající vstupům v databázi.
- Po kontrole redundance zkontroluje funkce „vložení“ délku vstupu a uživatelský vstup se zkracuje, pokud délka přesáhne.
Předpokládejme, že vývojář vytvoří tabulku „uživatelé“ pomocí následujícího dotazu:
vytvořit uživatele tabulky (user_id INT NOT NULL AUTO_INCREMENT,
user_name VARCHAR (20) NOT NULL,
heslo VARCHAR (40) NENÍ NULL,
PRIMÁRNÍ KLÍČ (user_id)
);
Pomocí tohoto schématu, pokud vývojář vytvoří účet správce s následujícím:
user_name = 'admin'heslo = “secret_p4ssw0ord”
Je zřejmé, že tyto pověření nejsou veřejné. V databázi je pouze jeden účet správce a pokud se útočník pokusí zaregistrovat jiný účet s uživatelským jménem „správce“, útočník selže kvůli kontrolám redundance databáze. Útočník může tuto kontrolu nadbytečnosti obejít a přidat další účet správce využitím chyby zabezpečení Zkrácení SQL. Předpokládejme, že útočník zaregistruje jiný účet s následujícím vstupem:
User_name = 'adminxxxxxxxxxxxxxxxxxrandom'(x jsou mezery)
&
Heslo = „RandomUser“
Databáze vezme „uživatelské_jméno“ (26 znaků) a zkontroluje, zda již existuje. Poté bude zkrácen vstup user_name a do databáze bude vložen 'admin' ('admin' s mezerou), což povede ke dvěma duplicitním uživatelům admin.
Útočník je poté schopen vytvořit uživatele „správce“ s vlastním heslem. Nyní má databáze dvě položky admin 'user_name', ale s různými hesly. Útočník se může přihlásit pomocí nově vytvořených pověření, aby získal panel správce, protože uživatelská jména „admin“ i „admin“ jsou pro úroveň databáze stejná. Nyní se podíváme na ukázkový praktický útok.
Ukázkový útok
V tomto příkladu si vezmeme scénář z overthewire webu.org. Komunita overthewire poskytuje bojové CTF, na kterých můžeme procvičovat naše bezpečnostní koncepty. Scénář zkrácení SQL nastává ve hře natas úroveň 26-> 27. Úroveň můžeme zpřístupnit pomocí následujících možností:
URL: http: // natas27.natas.laboratoře.overthewire.orgUživatelské jméno: natas27
Heslo: 55TBjpPZUUJgVP5b3BnbG6ON9uDPVzCJ
Tato úroveň je k dispozici na adrese: https: // overthewire.org / wargames / natas / natas27.html. Zobrazí se přihlašovací stránka, která je zranitelná vůči útoku Truncation SQL.
Po kontrole zdrojového kódu uvidíte, že délka uživatelského jména je 64, jak je znázorněno níže.
Uživatel s názvem 'natas28' již existuje. Naším cílem je vytvořit dalšího uživatele s názvem 'natas28' pomocí útoku SQL_truncation. Takže zadáme natas28, následovaný 57 mezerami a náhodnou abecedou (v našem případě a), uživatelským jménem a jakýmkoli heslem. Písmeno „a“ není na snímku obrazovky viditelné kvůli uživatelskému jménu o délce 65 znaků. Po vytvoření uživatelského účtu uvidíte 'A.''
Pokud databáze obsahuje chybu zabezpečení sql_truncation, měla by mít databáze nyní dvě uživatelská jména „natas28“. Jedno uživatelské jméno bude obsahovat naše heslo. Pokusme se zadat přihlašovací údaje na přihlašovací stránce.
Nyní jsme přihlášeni jako uživatel 'natas28'.
Zmírnění
Abychom tento útok zmírnili, budeme muset vzít v úvahu několik faktorů.
- Neměli bychom připustit duplikaci kritických identit, jako je uživatelské jméno. Měli bychom vytvořit tyto identity Primární klíče.
- Funkce zkrácení by měla být implementována pro všechna pole formulářů frontendu i pro kód back-endu, aby databáze přijímaly zkrácené vstupy.
- Na úrovni databáze by měl být povolen přísný režim. Bez povoleného přísného režimu poskytují databáze pouze varování v back-endu, ale stále ukládají duplicitní data. V přísném režimu poskytují databáze chyby v případě duplikace a vyhýbají se ukládání dat.
Podívejme se například na přísný režim pomocí následujícího dotazu:
mysql> vyberte @@ sql_mode
Vytvoříme databázi a uživatele tabulky.''
mysql> VYTVOŘIT test DATABÁZEDotaz v pořádku, ovlivněn 1 řádek (0.02 s)
mysql> Použít test
Databáze změněna
mysql> CREATE TABLE uživatelé (uživatelské jméno VARCHAR (10), heslo VARCHAR (10));
Dotaz v pořádku, ovlivněno 0 řádků (0.05 s)
Dále vytvoříme uživatele správce s přihlašovacími údaji pomocí dotazu INSERT.
mysql> INSERT INTO users VALUES ('admin', 'password1');Dotaz v pořádku, ovlivněn 1 řádek (0.01 s)
Informace tabulky „uživatelé“ můžeme zobrazit pomocí možnosti „vybrat * od uživatelů“.
Délka uživatelského jména je 10 znaků. Nyní zkusíme útok zkrácení SQL.
Když se pokusíme zadat následující:
Uživatelské jméno = 'adminxxxxxa'(x jsou mezery)
&
Heslo = 'pass2'
Dostaneme chybu, což znamená, že přísný režim je naprosto efektivní.
mysql> INSERT INTO users values ('admin a', 'pass2')ERROR 1406 (22001): Data too long for column 'username' at row 1
Bez povoleného přísného režimu bude databáze generovat varování, ale bude stále vkládat data do tabulky.
Závěr
Útočníci mohou získat přístup k účtům s vysokými oprávněními, pokud ve vaší aplikaci existuje chyba zabezpečení sql_trunction. Útočník může snadno získat informace o uživatelském jménu a jeho délce databáze pomocí kritických polí, poté vytvořit stejné uživatelské jméno, následované mezerami a náhodnou abecedou po minimální délce, což povede k vytvoření více účtů s vysokými oprávněními. Tato chyba zabezpečení je zásadní, ale lze jí zabránit, pokud provedete některá bezpečnostní opatření, například aktivujete přísný režim pro vstupy uživatele a nastavíte citlivé pole jako primární klíč v databázi.