úterý 6. března 2012

SQL injection


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