Než přímo odpovíte na otázku, stojí za zmínku, že i když útočník může udělat, je číst údaje, které by neměl mít, to je obvykle stále opravdu špatné. Zvažte to pomocí JOIN
s a SELECT
ing ze systémových tabulek (jako mysql.innodb_table_stats
), útočník, který začíná SELECT
injekci a žádné další znalosti o vaší databázi můžete mapovat vaše schéma a poté exfiltrovat všechna data, která máte v MySQL. U naprosté většiny databází a aplikací to již představuje katastrofální bezpečnostní díru.
Ale abych odpověděl přímo na otázku:existuje několik způsobů, o kterých vím, jak vložit do MySQL SELECT
lze použít k úpravě dat. Naštěstí všechny vyžadují přiměřeně aby byly možné neobvyklé okolnosti. Všechny příklady injekcí níže jsou uvedeny ve vztahu k příkladu injektovatelného dotazu z otázky:
SELECT id, name, message FROM messages WHERE id = $_GET['q']
1. „Skládané“ nebo „dávkové“ dotazy.
Klasická injekční technika spočívající v tom, že za tím, do kterého je vstřikován, vložíte celé další prohlášení. Jak je navrženo v další odpověď zde
, můžete nastavit $_GET['q']
to 1; DELETE FROM users; --
takže dotaz tvoří dva příkazy, které se provádějí za sebou, z nichž druhý smaže vše v users
tabulka.
Ve zmírnění dopadů
Většina konektorů MySQL – zejména včetně PHP (zastaralé) mysql_*
a (nezastaralé) mysqli_*
funkce - vůbec nepodporují skládané nebo dávkové dotazy, takže tento druh útoku prostě nefunguje. Někteří však dělají - zejména včetně konektoru PDO PHP (ačkoli podporu lze zakázat, aby se zvýšila bezpečnost
).
2. Využití uživatelsky definovaných funkcí
Funkce lze volat z SELECT
a může měnit data. Pokud byla v databázi vytvořena funkce pro změnu dat, můžete provést SELECT
zavolejte ji, například předáním 0 OR SOME_FUNCTION_NAME()
jako hodnotu $_GET['q']
.
Ve zmírnění dopadů
Většina databází neobsahuje žádné uživatelem definované funkce – natož ty upravující data – a nenabízejí tedy vůbec žádnou příležitost k provádění tohoto druhu zneužití.
3. Zápis do souborů
Jak je popsáno v článku Muhaimina Dzulfakara (poněkud troufale pojmenovaný) Pokročilé využití MySQL
, můžete použít INTO OUTFILE
nebo INTO DUMPFILE
klauzule na MySQL select k uložení výsledku do souboru. Protože pomocí UNION
, libovolný libovolný výsledek může být SELECT
ed, to umožňuje psát nové soubory s libovolným obsahem na libovolném místě, kde uživatel spouští mysqld
může přistupovat. Je možné, že to lze využít nejen k úpravě dat v databázi MySQL, ale také k získání shellového přístupu k serveru, na kterém běží – například napsáním PHP skriptu do webrootu a následným odesláním požadavku na něj, pokud Server MySQL je hostován společně se serverem PHP.
Ve zmírnění dopadů
Mnoho faktorů snižuje praktickou využitelnost tohoto jinak působivě znějícího útoku:
- MySQL nebude nikdy vám umožní použít
INTO OUTFILE
neboINTO DUMPFILE
přepsat existující soubor ani zapisovat do složky, která neexistuje. To zabraňuje útokům, jako je vytvoření.ssh
složka se soukromým klíčem vmysql
domovský adresář uživatele a poté SSH in nebo přepsánímysqld
sám binární se škodlivou verzí a čeká na restart serveru. - Jakýkoli slušný instalační balíček nastaví speciálního uživatele (obvykle pojmenovaný
mysql
) ke spuštěnímysqld
a dát tomuto uživateli pouze velmi omezená oprávnění. Jako takový by neměl být schopen zapisovat do většiny umístění v souborovém systému – a rozhodně by neměl být běžně schopen dělat věci, jako je zápis do webrootu webové aplikace. - Moderní instalace MySQL jsou dodávány s
--secure-file-priv
nastaveno ve výchozím nastavení, které zabraňuje MySQL zapisovat kamkoli jinam než do určeného adresáře pro import/export dat, a tím činí tento útok téměř zcela impotentním... pokud jej vlastník serveru úmyslně nezakázal. Naštěstí by nikdo nikdy jen tak úplně nevypnul bezpečnostní funkci, jako je tato, protože to by samozřejmě bylo - oh počkej nevadí .
4. Volání sys_exec()
funkce z lib_mysqludf_sys
spouštět libovolné příkazy shellu
Existuje rozšíření MySQL s názvem lib_mysqludf_sys
to – soudě podle jeho hvězd na GitHubu
a rychlé vyhledávání Stack Overflow
- má alespoň několik stovek uživatelů. Přidává funkci nazvanou sys_exec
který spouští příkazy shellu. Jak je uvedeno v #2, funkce lze volat z SELECT
; důsledky jsou snad zřejmé. Citace ze zdroje
, tato funkce "může představovat bezpečnostní riziko" .
Ve zmírnění dopadů
Většina systémů toto rozšíření nemá nainstalované.