Mi az SQL injection lényege?
A lényege, hogy lefuttatsz olyan kódot is az adatbázis szerveren, amit nem lenne szabad.
(Módosítod a bementet.)
Példát nem írok, mivel a netes kismillió példa kód és leírás van hozzá.
Van egy formod:
<input name=user/>
<input name=password/>
És php-ben így ellenőrzöd:
SELECT * FROM `users` WHERE `user`=\'$_POST['user']\' AND `pass`=\'$_POST['pass']\'
Tegyük föl ezt írod be jelszónak:
' OR 1=1 OR ''='
Így az sql ez lesz:
SELECT * FROM `users` WHERE `user`='józsi' AND `pass`='' OR 1=1 OR ''=''
És ezzel a jelszót el fogja fogadni
A sql injection lényege az, hogy a bemeneti mezőben egy sql kekérdezést hozunk létre úgy, hogy az eredeti lekérdezést lezárjuk és olyan feltételt hozunk létre amig mindig teljesül.
A fenti példa csak egy kis töredéke annak amit alkalmaznak a próbálkozók
A próbálkozást azért említettem mert mára már nagyon egyszerűen ki lehet titlatni az ilyesmit php-ből
mysql_real_escape függvénnyel vagy PDO-s lekérdezéssel ezek mind kivédhetők, bár sok weboldal van még ma is ami támadható ilyennel,
Mutatok egy php kódot ami tényleg támadható így:
<form name="form1" method="GET" action=control.php">
<input type=text name="username" id="username">
<br><input type="password" id="password">
<input type="submit" value="Belépés">
a control.php legyen ez:
<?php
$host="localhost"; // mysql szerver neve
$username=""; // Mysql felhasználónév
password=""; // mysql jelszó
$db_name="test"; // adatbázis név
$tbl_name="members"; // adatbázis jelszó
// csatlakozunk a szerverhez
mysql_connect("$host", "$username", "$password")or die("NEM sikerül csatlakozni az adatbázishoz");
mysql_select_db("$db_name")or die("Nem létező tábla");
// felhasználónév és jelszó beolvasása a formból
$myusername=$_GET['username'];
$mypassword=$_GET['password'];
$sql="SELECT * FROM $tbl_name WHERE username='$myusername' and password='$mypassword'";
$result=mysql_query($sql);
?>
Na akkor támadjuk ezt a lekérdezést sql injekcióval.
Írjuk be a felhasználónévbe ezt:
admin
a jelszó helyére pedig ezt
'or '1'='1'
Mi lesz a lekérdezésben:
$sql="SELECT * FROM $tbl_name WHERE username='admin' and password=''or '1'='1''";
Tehát ha kiértékeljük ezt a kifejezést:
akkor látható, hogy ha ismerjük az admin jelszavát, akkor be tudunk lépni ugyanis, az első ' aposztroffal lezártuk a lekérést ezután pedig sqlban beírtunk egy olyan kifejezést ami mindig teljesül.
De legyünk egy kicsit kö..ögök a szerver tulajával és csináljunk egy elég durva lekérdezést.
A felhasználónév legyen megint admin.
A jelszó helyére pedig írjuk ezt:
' DROP TABLE \$tbl_name or '1'='1'
Ezt gyak törölte az adatbázist
Mutatok jobbat amikor a full adatbázist lelophatjuk egy lekérdezéssel:
Felhasználónév legyen most ez:
' or '1'='1' and SHOW tables --
Az -- a kommentezés jelölésére szolgál magyarán ez akkor is jó ha nem ismerjük az adatbázist.
Innentől kezdve bármilyen lekérdezést meg lehet csinálni.
Persze az kommentezésnél nem mindegy a sql szerver típusa mindehol más a komment jelölése.
Vannak helyzetek ahol a szerver nem ad vissza táblát, sőt sniffer nélkül még csak észre sem veszed, hogy ad vissza eredményt egy lekérdezés( konkrétan csak egy bool típusú adatot tudzs kiszedni belőle 1. szerepel az adatot karakter vagy nem), ilyenkor más egyéb programnyelven is kell tudni, hogy le lehessen kérdezni adatot, mert itt valamilyen keresés alkalmazásával lehet megtudni az adott user jelszavát.
Meg aztán ha hash-elve van a jelszó, akkor meg kell próbálnui visszafejteni. Erre sokféle adatbázis van.
Ha akarsz kísérletezni ezzel, akkor rakj fel magadnak egy WAMP szervert( vagy ha linuxos vagy akkor LAMP szervert), készíts egy login scriptet és próbáld ki őket. A Bool típusúhoz pedig az echozásnál ha jó egy lekérdezés akkor nem irsz ki semmit, ha rossz akkor pedig egy Access dineidot.
A jelszó kiszedésére pedig jó egy logaritmikus keresés is.
Az lehet ( szokták javascripte is védeni az oldalt. Vagy vannak rá pluginok is)
De nem csak böngészőből lehet inputboxnak adatot küldeni.
Vannak erre szakosodott proxy-k is.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!