SQL injection
SQL injection
je technika napadení databázové vrstvy programu vsunutím (odtud „injection“)
kódu přes neošetřený vstup a vykonání vlastního, samozřejmě pozměněného, SQL
dotazu. Toto nechtěné chování vzniká při propojení aplikační vrstvy s
databázovou vrstvou (téměř vždy se totiž jedná o dva různé programy) a
zabraňuje se mu pomocí jednoduchého escapování potencionálně nebezpečných
znaků.
SQL injection a web
V klasickém případě
je útok na internetové stránky prováděn přes neošetřený formulář, manipulací s
URL nebo třeba i podstrčením zákeřně upravené cookie. Bohužel, na internetu je
stále velké množství webů, spravovaných převážně nezkušenými programátory,
kteří o této technice útoku prostě neví a tuto kritickou chybu opomíjejí.
Ukázka útoku
Mějme program
odesílající dotaz do databáze:
statement := "SELECT * FROM uzivatele WHERE jmeno = '" + zadaneJmeno + "';"
Pokud však uživatel
zadá jako jméno například:
a' or 'b'='b
aplikační program
dotaz doplní a odešle databázi ve formě
statement := "SELECT * FROM uzivatele WHERE jmeno = 'a' or 'b'='b';"
což může zapříčinit
přemostění autorizační procedury, protože 'b' = 'b' je vždy pravda.
Pro SQL injection se
samozřejmě dají použít všechny dostupné příkazy, pokud by tedy útočník v
předešlém příkladě jako jméno zadal
a';DROP TABLE uzivatele; --
vypadal by dotaz při
odeslání serveru jako
statement := "SELECT * FROM uzivatele WHERE jmeno = 'a';DROP TABLE uzivatele; --';"
čímž by smazal celou
tabulku uživatelů. Poslední apostrof se pomocí sekvence dvou pomlček stane
poznámkou a nemá žádný vliv.
Podobných průniků je
samozřejmě celá řada, díky klauzulím UNION a JOIN nejsme ani vázáni na tabulku
předepsanou v části FROM a můžeme vypisovat data odkudkoliv z databáze.
Obrana
Na straně aplikace
Nejjednodušší obrana
spočívá ve vhodné kontrole a úpravě vstupních dat. Prakticky každý skriptovací
program s podporou databáze má nějakou vestavěnou funkci pro převedení
potenciálně nebezpečných znaků na bezpečnou sekvenci. Tuto funkci je možné
použít před vytvořením dotazu.
Například pro Perl
$query = $sql->prepare(
"SELECT * FROM uzivatele WHERE jmeno = "
. $sql->quote($zadaneJmeno)
);
pro PHP (v příkladu
implementace MySQL):
$sql = "SELECT * FROM uzivatele WHERE jmeno = '"
. mysql_real_escape_string($zadaneJmeno)."'";
mysql_query($sql);
pro PHP Oracle:
$stmt = oci_parse($connOci, 'SELECT * FROM LOGIN WHERE jmeno = :login');
oci_bind_by_name($stmt, ':login', $_POST['login']);
oci_execute($stmt);
Obecně řečeno, spolu
s tímto je vhodné aplikaci otestovat pro všechny možnosti uživatelského
vstupu. Ve vývojové verzi se doporučuje mít nastavenu nízkou úroveň vypisování
chybových hlášek a varování (abychom si jich všimnuli a opravili je). V ostré
verzi je naopak zvykem vypisování chybových hlášek co nejvíc potlačit (mohly
by poskytnout útočníkovi dodatečné informace).
Na straně databáze
V databázi můžeme
útoku zabránit (nebo ho přinejmenším extrémně ztížit) vhodným nastavením práv
uživatele, se kterými bude program přistupovat. Málokdy je třeba přímo z
aplikační vrstvy mazat tabulky či dokonce databáze, proto stačí povolit jen
základní SQL příkazy.
Případy SQL injection
-
1. listopadu použil jistý student SQL injection, aby pronikl na stránky tchajvanského časopisu o počítačové bezpečnosti.
-
29. června 2007 hacker „znetvořil“ stránku britské pobočky firmy Microsoft. Její databázový systém se stal terčem útoku v lednu následujícího roku, kdy byl spuštěn hromadný útok zneužívající chyby v Microsoft SQL Server na SQL injection a byly nakaženy desítky tisíc počítačů, zejména v Číně. Další, ještě větší vlna útoků, zaměřující se na bezpečnostní díry Microsoft IIS a Microsoft SQL server, proběhla od dubna do srpna 2008 a odhadem zasáhla kolem půl milionu počítačů.
-
u případu krádeže informací se 130 miliony čísel platebních karet (který je uváděný jako největší krádež identity vůbec) padl rozsudek 17. srpna 2009 na Američana Alberta Gonzalese a dva nejmenované Rusy.
Mezi (poměrně úzkou)
komunitou programátorů, bezpečnostních analytiků a databázových návrhářů se v
posledních několika měsících dokonce rozšířil humor, narážející na některé
tyto útoky, mezi jinými i SQL injection.
Žádné komentáře:
Okomentovat