Author: MDT | Added:16.5.2007 19:28 | Last update: 16.5.2007 19:28 | Readed: 3295x
Co to vlastně SQL Injection je? Jednodu?e řečeno je to zadání takových vstupních dat, aby jejich obsah pozměnit tvar SQL dotazu (a tak i jeho výsledek) v ná? prospěch. Například kdy? je po?adováno u?ivatelské jméno a heslo, tak aby podmínka pro heslo byla anulována a my tak mohli získat přístup i bez hesla apod. V tomto článku se budeme zabývat zadáváním SQL dotazů v jazyce PHP a jejich vyhodnocováním v rámci databáze MySQL. To je velmi důle?ité, proto?e různé databáze (MySQl, MSSQL, Postgre SQL atd.) nakládají s SQL dotazy a výsledky jinak, tudí? co platí pro jednu databázi nemusí platit pro druhou a naopak. Je tedy velmi důle?ité, abyste v?dy při sestavování účinné obrany proti SQL Injection věděli, jak va?e databáze zachazí například s danými klauzulemi (SELECT, INSERT. UNION ...).
Vezměme například, ?e máme takovýto formulář:
Po zadání u?ivatelského jména a hesla jste odeslání na stránku data.php kde pokud jsou údaje správně zadané, zobrazí se ve?keré info o u?ivateli (jméno, adresa, ...). Dejme tomu, ?e chceme tyto údaje zobrazit u u?ivatele, u něho? neznáme jeho heslo, ale známe jeho u?ivatelské jméno. U SQL Injection je důle?ité znát stavbu tabulky, ze které ony data vypisujeme. U MySQL databáze je to celkem problém, proto?e například nevypisuje podrobné chybové hlá?ení jako některé jiné databáze. Proto je asi nejjednodu?ím způsobem, jak zjistit stavbu tabulky, odhadnutí, popřípadě si tak různě domý?let a nebo pokud napřkald víte, jaky redakční systém daný server pou?ívá (pokud nepou?ívá svůj), tak si stahnout dokumentaci k danému RS, nebo? jsou často pou?ívány defaultní názvy sloupců v tabulce apod. (co? je velká chyba). My pro jednoduchost předpokládejme, ?e máme tabulku se sloupci username, password, name, address, number, occupation, také máme vypnutou direktivu magic_quotes_gpc() a po zadání správněho u?ivatelského jména a hesla chceme vypsat zbývající údaje.
Kód máme například tento:
Dejme tomu, ?e chceme zjistit údaje u?ivatele s username PavelN, ale samozřejmě neznáme heslo. Do pole s názvem username zadáme:
PavelN' -- '
A dotaz tak změníme na
Znaky -- maj v SQL význam počátku komentáře, tak?e zbytek dotazu je ignorován, tedy i dotaz na heslo. A nám se zobrazí data u?ivatele PavelN.
Dal?í mo?ností je pou?ítí OR:
PavelN' OR '
a dotaz se změní na
U OR (logické "nebo") stačí aby jen jedna podmínka byla splněna, co? je (správné u?ivatelské jméno), tak?e to také projde.
Co kdy? ale chceme zjistit heslo u?ivatele PavelN, které se normálně nevypisuje? S pou?itím klauzele UNION to nebude problém (pokud je heslo v nehashované formě), která nám umo?ňuje spojit dva příkazy SELECT do jednoho, ale u obou příkazů SELECT musíte mít stejný počet sloupců a stejný typ sloupců. v MySQL máme vyhodu tu, ?e typ sloupců se nemusí shodovat.
Například takto:
PavelN' UNION SELECT username, password, name, number FROM users -- '
Nový dotaz bude vypadat takto:
A zobrazí se nám heslo u?ivatele PavelN společně s ostatními údaji.
Způsobu existuji mnoho dal?ích, ale ty si rozebereme az v dal?ích díle...
-------------------------------------------------------------------------------------------------------------------------