Bezpečnostní

SQL Truncation Attack

SQL Truncation Attack
Chyba zabezpečení Truncation SQL nastane, když databáze zkrátí vstup uživatele z důvodu omezení délky. Útočníci mohou shromažďovat informace o délce kritického pole (například uživatelské jméno) a využívat tyto informace k získání neoprávněného přístupu. Útočníci se mohou přihlásit jako někteří další uživatelé, například jako administrátoři, pomocí vlastního registrovaného hesla.

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í“.

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.org
Už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ů.

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ÁZE
Dotaz 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.

Hry Jak používat AutoKey k automatizaci linuxových her
Jak používat AutoKey k automatizaci linuxových her
AutoKey je nástroj pro automatizaci stolních počítačů pro systémy Linux a X11, programovaný v programech Python 3, GTK a Qt. Pomocí jeho funkcí skript...
Hry Jak zobrazit počítadlo FPS v linuxových hrách
Jak zobrazit počítadlo FPS v linuxových hrách
Hraní na Linuxu získalo velký tlak, když společnost Valve v roce 2012 oznámila podporu systému Linux pro klienta Steam a jejich hry. Od té doby se mno...
Hry Jak stáhnout a přehrát Sid Meier's Civilization VI v systému Linux
Jak stáhnout a přehrát Sid Meier's Civilization VI v systému Linux
Úvod do hry Civilization 6 je moderní pojetí klasického konceptu představeného v sérii her Age of Empires. Myšlenka byla docela jednoduchá; začali bys...