SQL injection
Přehled
SQL injection je typ útoku, který používá zranitelnosti při ověřování vstupu aplikace nebo zadávání dat pro dotazy SQL.
Když je útok úspěšný, umožňuje útočníkovi vložit data do existujícího SQL dotazu. Útočník pak může být schopen získat soukromá data, způsobit odmítnutí služby nebo způsobit jiné nezamýšlené reakce. V nejhorším případě by vložený kód útočníkovi umožnil získat plnou kontrolu nad systémem zneužitím několika zranitelností v databázovém serveru, systémových nástrojích a operačním systému.
Přehled útoků SQL injection najdete na stránce SQL Injection na Wikipedii.
Příklad
Následující úryvek kódu by útočníkovi umožnil spouštět vlastní příkazy SQL (a jedná se o chybu syntaxe v Oracle).
$limit = $wgRequest->getVal( 'limit' );
$res = $db->query( "SELECT * from kitties LIMIT $limit" );
Před MW 1.35 by preferovaný způsob spuštění výše uvedeného dotazu byl:
$limit = $wgRequest->getVal( 'limit' );
$limit = intval( $limit ); // OPTIONAL validation
$res = $db->select( 'kitties',
'*',
false,
__METHOD__,
array( 'LIMIT' => $limit ) // REQUIRED automatic escaping
);
See Manual:Database access for more recent approaches to building SQL queries using the SelectQueryBuilder class.
K zneužití této chyby zabezpečení a načtení e-mailových adres registrovaných uživatelů wiki by útočník použil řetězec GET:
?limit=%201%20union%20select%20user_email%20from%20user;
SQL Injection a MediaWiki
MediaWiki má vlastní rozhraní pro generování SQL, které se ukázalo jako efektivní pro eliminaci zranitelností vkládání SQL. Rozhraní pro generování SQL také poskytuje abstrakci DBMS a funkce, jako jsou předpony tabulek.
Aby byla MediaWiki v bezpečí před SQL injection:
- Vyhněte se používání přímých SQL dotazů za každou cenu
- Zkontrolujte Příručka:Přístup k databázi a použijte funkce poskytované v Database.php
- Přečtěte si stránku Projekt zabezpečení otevřených webových aplikací o SQL injection (http://www.owasp.org/index.php/SQL_Injection)
- SQL Injection Wiki: http://www.sqlinjectionwiki.com/