sql >> Databáze >  >> RDS >> Mysql

MySQL Injection - Použijte SELECT dotaz k UPDATE/DELETE

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 nebo INTO 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 v mysql 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é.



  1. SQL Server Vysoká dostupnost:Nainstalujte SQL Server cluster s podporou převzetí služeb při selhání, část 2

  2. Jak spojit dvě tabulky pomocí ssp.class.php

  3. Zdá se, že @Column(unique=true) nefunguje

  4. PostgreSQL:přetypovaný řetězec k datu DD/MM/RRRR