PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Vorbeugung von SQL Lücken (Authentication Bypass vermeiden!)



kalachnikov
29.08.2009, 20:52
Ich habe dieses Tutorial als Reaktion, auf dem von jOkR gestarteten Thread (http://free-hack.com/showthread.php?t=46573), zur schließung von SQL Lücken geschrieben

Ich sehe vom Threadstarter keinen erkennbaren Hinweis auf eine SQL Lücke
geschweige denn eine Methode zur Vorbeugung von Sicherheitslücken (SQL).
Ich hab mir mal kurz die Mühe gemacht und einen kleinen Code geschrieben und zwar einen (1) der SQL Lücken enthält und der
andere (2), wie man diesen mittels Filters schließen kann.(Ein sehr praktisches Beispiel, wie ich finde ;))
Ich habe mal auf die "//" verzichtet und werde daher den Code nicht kommentieren, denn ich finde,
dass dieser Code für Anfänger bzw. für Menschen die mit PHP nix zu tun haben, nicht geeignet ist!
Wer dennoch Interesse daran hat, und den Code nicht versteht, sollte PHP lernen!

-->http://tut.php-quake.net/de/



<?
//login.php
//Attacke und Vorbeugung von Lücken (SQL)
//by kalachnikov
$user = $_POST['user'];
$pass = $_POST['pass'];
$link = mysql_connect('localohst', 'root', 'pass') or die ('Error: '.mysql_e
rror());
mysql_select_db("sql_inj", $link);
$query = mysql_query (SELECT * FROM sql_inj WHERE user ='".$user."' AND pass
='" .$pass. "'",$link);
if (mysl_num_rows($query) == 0) {
echo"<scripttype=\"text/javasceipt\">window.location.href='index.html' ;</script>";
exit;
}
$logged = 1;
?>


Ein Attacker sendet die Variablen $_POST['user'] , $_POST['pass'] zu login.php, die direkt in die SQL Query gelagert werden.
" " könnte somit folgendes machen:
$user = 1'OR'1'='1
$pass = 1'OR'1'='1
(Authentication Bypass)

Vorbeugung:


<?
//Hier ist ein Beispiel für einen benutzerdefinierte SQL-Filter
$title = $_POST['title'];
$description = $_POST['description'];
// Cleaner wird definiert
$dirtystuff = array("\"", "\\", "/", "*", "'", "=", "-
"; "#", ";", "<", ">", "+", "%");
// Cleaner includieren
$title = str_replace($dirtystuff, "suchts euch aus", $title);
$description = str_replace($dirtystuff, "suchts euch aus", $description);
//zur Verdeutlichung
//rein: a';DROP TABLE users; SELECT * FROM datei '%
//raus: aDROP TABLE users SELECT FROM datei
?>


[kann sein, dass ich statt bla, bal geschrieben habe(passiert mir öfters) habe nur kein Bock und keine Zeit das alles nochmal durchzuschauen..
Es sollte dennoch verständlich sein]

cTPu1bjo
29.08.2009, 21:30
Solche Filter bieten kaum Schutz... Benutzt lieber Funktionen wie mysql_real_escape_string() bzw intval() (je nach Dateityp) (am besten global durch GET POST COOKIE usw. laufen lassen) oder verwendet prepared Statements.

kalachnikov
29.08.2009, 21:38
ja! die Datenbank string encoding Funktion (mysql_real_escape_string()) benutz ich persönlich auch, habs vergessen zu erwähnen, ist natürlich korrekt!