DB támadó webhely

Speciális: Hacker, szoba # 052, p 052-084-1.

Mit tud a támadók SQL befecskendezéses

Napról-napra, egyre több scriptek segítségével az adatbázis, több megbízható tárhely jelszavakat ügyfelei SQL-adatbázisokat, népszerűbb helyek megy nyilvános fórumokon és motorok dolgoznak MySQL. De nem mindenki világosan elképzelni, hogy milyen veszélyes lehet elhibázott alkalmazása MySQL szkripteket.

Anélkül alap nyelvtudás SQL nehéz megérteni semmit. Először is, mi kell érteni, mi a lényege, hogy milyen típusú SQL injekciós támadás. Például a cél kiszolgáló érdemes a következő egy PHP script, amely alapján a területen category_id előveszi a cikk címeket cikkek asztal és megjeleníti őket a felhasználónak:

// kapcsolódni a MySQL

mysql_connect ($ dbhost, $ dbuname, $ dbpass) or die (mysql_error ());

mysql_select_db ($ adatbázisnévre) or die (mysql_error ());

$ Eredmeny = mysql_query ( "SELECT article_id, ARTICLE_TITLE cikkektől ahol category_id = $ cid"); // <- уязвимый запрос

while ($ out = mysql_fetch_array ($ eredmeny)):

// Az eredmény megjelenítéséhez egy listában

Miért hiba? Lássuk, mit kért PHP MySQL. A változó $ cid # 1”, akkor a kérelmet vesz egy rossz a szempontból MySQL: SELECT article_id, ARTICLE_TITLE cikkektől ahol category_id = # 1' . Ha egy szintaktikai hiba MySQL query string válaszol: „ERROR 1064: Van egy hiba az SQL szintaxis.”. PHP nem ismeri a választ és a jelentések a hibát, amely egy hacker meg tudja ítélni a jelenléte a típusú SQL Injection réseket. Nyilvánvaló, hogy a támadó képes lesz beállítani a változó $ cid bármilyen értéket ($ cid = $ _ GET [CID]), és ezért módosítják a lekérdezést a MySQL. Például, ha $ cid egyenlő „1 vagy 1” (idézőjelek nélkül elején és a végén), akkor a MySQL visszaadja az összes bejegyzés függetlenül CATEGORY_ID, mivel a kérés lesz a forma (..) ha category_id = 1 OR 1. hogy az vagy category_id = 1 (csak megfelelő rögzítési category_id, értéke 1) vagy 1 (illeszkedik az összes rekordot, mert a szám nagyobb, mint nulla - mindig igaz).

Csak ezeket a lépéseket csak úgynevezett SQL Injection - SQL-injekciók kódot a script kérést MySQL. a támadó hozzáférhet az adatokhoz keresztül SQL Injection, hozzáfér a veszélyeztetett script: jelszavak korlátozott részein az oldal, hitelkártya információkat, a jelszó az admin, stb A hacker egy sikeres neki körülmények képes lesz futtatni parancsokat a szerver.

A klasszikus példája a biztonsági rés a típusú SQL Injection - a következő lekérdezést: SELECT * FROM WHERE adminok login = # '$ login #' AND password = MD5 (# '$ password #').

Unió és a MySQL 4-es verzió

Térjünk vissza a forgatókönyvet átvevő címei cikkeket. Sőt, ez lehetővé teszi, hogy a támadó sokkal több, mint egy listát az összes cikket. A tény az, hogy a MySQL 4-es verzió egészíti ki egy új szereplő - UNION, mellyel össze az eredményeket több SELECT utasítás egyetlen eredmény meg. Például: SELECT article_id, ARTICLE_TITLE cikkektől UNION SELECT id, cím FROM közvélemény-kutatások. Ennek eredményeként, a MySQL visszaadja az N bejegyzést, ahol N - rekordok száma egy lekérdezés a bal oldalon, valamint a bejegyzések száma az eredmény a jobb lekérdezés. És mindez abban a sorrendben, amelyben kéri, különválasztják a UNION.

De van néhány használatának korlátozását a UNION:

1. A számok azt mutatják, az oszlop minden lekérdezést meg kell egyeznie: nedoputimo választani az első kérés, például, nevet, címet, a második csak ARTICLE_TITLE;

2. A típusú oszlopok egyikét jelöli kérelmet kell felelnie többi oszlopban típusú kérések, ha ugyanaz a lekérdezés típusa kiválasztott oszlopok INT, szöveg, szöveg, TINYTEXT, majd kéri a többi oszlop kell kiválasztani az azonos típusú és azonos sorrendben;

3. UNION nem megy, miután a kezelő LIMIT és a rend.

Tehát hogyan válhat egy cinkosa az UNION a támadó? A script van jelen kérelem "SELECT article_id, ARTICLE_TITLE cikkektől ahol category_id = $ cid". Mi akadályozza egy hacker segítségével SQL injection, helyezzen be egy másik SELECT lekérdezés, és válassza ki a kívánt adatokat, hogy ez? Ez így van: semmi!

Nézzük meg a módosított kérelmét PHP MySQL: SELECT article_id, ARTICLE_TITLE cikkektől ahol category_id = 1 UNION SELECT 1,2. Válaszul MySQL visszaadja az eredményt az első SELECT (lista elem) és az eredményt a második SELECT - „1” szám az első oszlopban, és a „2” a második oszlopban (SELECT + 1,2). Más szóval, most ebben az esetben # '# ​​1' és # „# 2” igazi nevét az oszlopok minden asztalra, az lesz, hogy az értéküket.

Miért nem a támadó, hogy helyezze be az oszlop nevét a készülék helyett? Szüksége van egy szöveges információk (felhasználónév, jelszó), és a mi esetünkben a bal SELECT lekérdezés az első helyen az article_id, INT típusú. Következésképpen a jogot, hogy a hacker nem hozott az első oszlop nevét szöveges információk (szabályok UNION).

Most nézzük meg bizonyos helyzetekben, amelyekben a használata a UNION nehéz ilyen vagy olyan okból.

Ez nem történhet meg, hogy a PHP-kódot egymás után több SQL-lekérdezéseket hajlamos Injection. És mindannyian egy változót, amelyre a támadó beszúr egy SQL-kódot. Például (elhagyásával PHP):

$ Eredmeny = mysql_query ( "SELECT article_id, ARTICLE_TITLE cikkektől ahol category_id = $ cid");

$ Eredmeny = mysql_query ( "SELECT article_name cikkektől ahol category_id = $ cid");

// Itt az eredménye a következtetésre

Ez elég kellemetlen a hacker, mert az első SQL Injection lekérdezés rendben lesz, és a második UNION - nem, mert a száma kért oszlopok eltérő. És ha a programozó, aki írta a kódot, állítsa le a script feltéve esetén a hiba típusát. „Or die (” Adatbázis hiba! »)«, A művelet a hagyományos módszerekkel nem lehet, mert a script leáll, mielőtt vezet eredményre.

A szkript kimenete nem a teljes eredményt a lekérdezés, és például csak az első bejegyzést. És ha egy hacker közvetlenül használni az Unió, a szkript kimenete csak az első rekord a MySQL választ, és dobja el a többiek, beleértve az eredmény SQL Injection. Annak érdekében, hogy legyőzni minden akadályt, és ezen a ponton, hogy egy hacker hagyott kérés paraméter a WHERE, hogy válaszul a MySQL nem tért vissza üres.

Például itt van ez a lekérdezés: SELECT név FROM WHERE id = szerzők $ id. Miután SQL Injection, ő lesz a következő: (..) id = 1 UNION SELECT jelszót szerzők. De egy PHP-script meg csak az első rekord, így a kódot kell módosítani: (..) id = -12.345 UNION SELECT (..). Most, válaszul a bal MySQL lekérdezés nem ad vissza semmit, és válaszul a jogot - örvendetes, hogy a hacker adatokat.

Tekintsük a következő lekérdezést: SELECT id FROM szerzők ahol category_id = -1 UNION SELECT 1,2 szerzőktől származó WHERE id = 1 és az ASCII (töredékszó (jelszó, 1,1))> 109. A lekérdezés eredménye lesz egy bejegyzést, ha az ASCII-kódját az első karakter a jelszó több mint 109, és a nulla nyilvántartást, ha nagyobb vagy egyenlő. Így a módszer bináris keresés könnyen megtalálja a kívánt karaktert. Miért egy hacker használja a jeleket „több / kevesebb” helyett „egyenlő”? Ha a támadó meg kell szereznie a 32 karakteres hash a jelszó, akkor kell, hogy körülbelül 32 * 25 kérések! bináris keresés a módszer lehetővé teszi, hogy csökkentsék ezt a számot a felére. Természetesen a hacker kell tennie nem lesz kézzel, egy script, hogy automatizálja a keresést.

Szabály №1. Szűrő bemenet. Idézet helyébe egy ferde vonallal idézet (#), slash - slash-slash. A PHP, ez úgy történik, beleértve, vagy magic_quotes_gpc a php.ini, vagy addslashes () függvény. Perl: $ id =

s / ([# „\]) / \ $ 1 / g;. És csak abban az esetben: $ id =

s / [a-zA-Z] // g; - numerikus paramétereket.

Szabály №2. Ne hagyd, hogy bárki, nem kell végrehajtani az SQL-kódot! Jelölni kell az összes változót a lekérdezésben. Például SELECT * FROM felhasználók WHERE id = # '$ id #'.

Szabály №3. Elhagyja hibaüzenetek. Egyes programozók, éppen ellenkezőleg, teszi, hogy amikor a script egy hibaüzenetet jelenít meg a MySQL-t, vagy ami még rosszabb - a teljes SQL-lekérdezés. Ez további információt a gazember alapszerkezet és nagyban megkönnyíti a műveletet.

Szabály №4. Soha ne engedje szkriptek futtatásához a MySQL a gyökér. Semmi jó jön ki, ha egy hacker hozzáférést nyer a teljes adatbázis.

Szabály №5. Indított nyilvános szkripteket egy felhasználó egy külön adatbázisban. Ez kellemetlen lehet, ha gyerekeket használ 0day-lyuk a fórumon, akkor kap hozzáférést az adatbázishoz egy felmosórongyot az ügyfelek.

Szabály №6. Kapcsolja ki a MySQL-felhasználói jogosultság FILE - ne hagyd, hogy a támadó a fájlba valami ilyesmit