Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
SQL-Injections zum Test ausführen,aber wie? [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
SQL-Injections zum Test ausführen,aber wie?


 
litterauspirna
11-06-2008, 17:24 
 
Hallo Leute!

Ich bin grad dabei meine Seite noch mal bevor sie online geht vollkommen zu checken ob sie auch vor Sql Injections sicher ist! Bei Formulareingaben sichere ich die Felder mit einem preg_match() ab so kann mir da meines Wissens ja keiner mehr Probleme machen. Das auslesen nach id sichere ich mit zum Beispiel so ob Where id="(int)$_GET['id']"!

Nun habe ich gesucht wie ich SQL Injections ausführen kann für verschiedene Fälle aber leider nicht gefunden was mir hilft ein Injection zu schreiben! Ich habe von Injections auch nicht so die Ahnung!

Könnt ihr mir da helfen wo ich was finde das Injections schreiben kann um meine Seite zu testen?

Vielen Dank mfg der Litter

 
bUTschy
11-06-2008, 19:01 
 
Hier findest du ein paar Beispiele:

http://de.wikipedia.org/wiki/SQL-Injektion

Wenn du eine "Ganzzahl" erwartest, bist du mit intval (http://de.php.net/intval) auf der sicheren Seite.

 
PHP-Desaster
11-06-2008, 19:42 
 
Bei Formulareingaben sichere ich die Felder mit einem preg_match() ab so kann mir da meines Wissens ja keiner mehr Probleme machen. Das auslesen nach id sichere ich mit zum Beispiel so ob Where id="(int)$_GET['id']"!mysql_real_escape_string für Zeichenketten, nicht nur per Regex überprüfen. Oder wie gehst du mit Strings um?

 
h3ll
11-06-2008, 19:45 
 
Original geschrieben von bUTschy
Wenn du eine "Ganzzahl" erwartest, bist du mit intval (http://de.php.net/intval) auf der sicheren Seite.

Er castet eh mit (int) auf Integer.

Bei Formulareingaben sichere ich die Felder mit einem preg_match() ab so kann mir da meines Wissens ja keiner mehr Probleme machen.

Ich bezweifle, dass du mit preg_match alleine immer auf der sicheren Seite bist. Verwende noch zusätzlich real_escape_string (http://de.php.net/manual/de/mysqli.real-escape-string.php) oder noch besser Prepared Statements (http://de.php.net/manual/de/mysqli.prepare.php).

 
litterauspirna
11-06-2008, 20:27 
 
Hallo!

Ich nutze natürlich mysql_real_escape_string

Hier mal ein Beispiel Script wenn ich was in eine DB eintrage!


if(isset($_POST['send']))
{
$link = "<a href=\"news_post.php\">Zurück</a>";
if(get_magic_quotes_gpc())
{
$poster = stripslashes($_POST['poster']);
$titel = stripslashes($_POST['titel']);
$email = stripslashes($_POST['email']);
$text = stripslashes($_POST['text']);
$cat = stripslashes($_POST['cat']);
$url = stripslashes($_POST['url']);
$allowkom = stripslashes($_POST['allowkom']);
}
$poster = mysql_real_escape_string($_POST['poster']);
if(empty($poster) && !preg_match("#^([0-9a-zäöü _-]+)$#i",$poster))
{
echo msgBoxAdmin("Der Poster fehlt oder hat verbotene Zeichen nur Zeichen a-z A-Z 0-9 _- und Leerzeichen erlaubt!<br>".$link);
exit();
}
$titel = mysql_real_escape_string($_POST['titel']);
if(empty($titel) && !preg_match("#^([0-9a-zäöü _-]+)$#i",$titel))
{
echo msgBoxAdmin("Der Titel fehlt oder hat verbotene Zeichen nur Zeichen a-z A-Z 0-9 _- und Leerzeichen erlaubt!<br>".$link);
exit();
}
$email = mysql_real_escape_string($_POST['email']);
if(empty($email) && !eregi("^[a-z0-9]+([_.-][a-z0-9]+)*@([a-z0-9]+([.-][a-z0-9]+)*)+\\.[a-z]{2,4}$",$email))
{
echo msgBoxAdmin("Das E-Mail Format ist nicht korrekt!<br>".$link);
exit();
}
$text = mysql_real_escape_string($_POST['text']);
if(empty($text) && strlen($text)<15)
{
echo msgBoxAdmin("Der Newstext fehlt oder hat weniger als 15 Zeichen!<br>".$link);
exit();
}
$cat = mysql_real_escape_string($_POST['cat']);
if(empty($cat) && !preg_match("#[0-9]#",$cat))
{
echo msgBoxAdmin("Die Kategorie ist nihct korrekt,keine Zahl!<br>".$link);
exit();
}
$allowkom = mysql_real_escape_string($_POST['allowkom']);
if(empty($allowkom) && !preg_match("#[0-9]#",$allowkom))
{
echo msgBoxAdmin("Die Kommentarerlaubnis ist nihct korrekt,keine Zahl!<br>".$link);
exit();
}
else
{
$url = mysql_real_escape_string($_POST['url']);
$datum = time();
$sqlbefehl ="
Insert Into $tab_news
(
catid,
titel,
poster,
email,
allowkom,
url,
text,
datum
)
VALUES
(
'$cat',
'$titel',
'$poster',
'$email',
'$allowkom',
'$url',
'$text',
'$datum'
)
";
$result = mysql_query($sqlbefehl)or die(mysql_error());
header("Location: modul_news.php");
}
}


So mache ich es wenn ich was eintrage in eine DB!

 
h3ll
11-06-2008, 20:33 
 
Deine Stripslashes sind sinnlos, weil du die Variablen danach erst wieder überschreibst.

 
TobiaZ
11-06-2008, 20:36 
 
und mysql_real_escape_string führst du zu früh aus.

strlen($text) würde z.B. die Escape-Zeichen mitzählen...
Außerdem ist das zuweisen in eine seperate Variable eigentlich auch überflüssig.

 
litterauspirna
11-06-2008, 21:01 
 
Wie müsste es denn zum Beispiel richtig aussehen?

Dankeschön

 
TobiaZ
11-06-2008, 21:13 
 
Auf was beziehst du dich? Kann unmöglich sein, dass du mit keinem unserer Hinweise etwas anfangen kannst.

Wenn du fälschlicherweise die Variablen überschreibst, wäre es richtig sie nicht zu überschreiben.

Wenn du mysql_real_escape_string zu früh ausführst, wäre es sinnvoll es später zu nutzen, am besten so spät wie möglich.

Wenn du eine extra Variable definierst, obwohl das eigentlich überflüssig ist, wäre es besser die Variable nicht zu definieren.

Jetzt bitte nochmal mit ein bisschen Eigeninitiative. :rolleyes:

 
litterauspirna
11-06-2008, 21:37 
 
Das einzige wo ich nur ins grübeln komme also es nicht so ganz verstehe ist das mit dem überschreiben.
Weil mit get_magic_quotes_gpc prüfe ich ja ob magic quotes on sind wenn ja reagieren ich mit einem stripslashes. Ich weis nicht wo ich die Variablen noch mal überschreibe da die Variablennamen ja nicht neu benenne!

Den Rest habe ich geschnallt,das mysql_real_escape_string werde ich erst direkt beim eintragen einsetzen.

 
TobiaZ
11-06-2008, 21:41 
 
Ähm,

$poster = mysql_real_escape_string($_POST['poster']);

 
litterauspirna
11-06-2008, 21:45 
 
Also wäre es richtiger so hier?


VALUES
(
'".mysql_real_escape_string($cat)."',
)



So würde ich sie ja nicht mehr überschreiben?

 
bUTschy
11-06-2008, 21:52 
 
".mysql_real_escape_string($_POST['cat'])."
Erwartest du in $_POST['cat'] eine Ganzzahl ?
".intval($_POST['cat']).":rolleyes:

 
TobiaZ
11-06-2008, 21:56 
 
Also wäre es richtiger so hier? Das eine hat doch mit dem anderen nichts zu tun! Du hast doch schon geschrieben, dass du erst später escapest. Aber die oben gepostete Stelle existiert vermutlich in ähnlicher Form immer noch. (ansonsten hättest du ein register globals problem). Folglich überschreibst du den wert auch immer noch.


Original geschrieben von bUTschy
".mysql_real_escape_string($_POST['cat'])."
Erwartest du in $_POST['cat'] eine Ganzzahl ?
".intval($_POST['cat']).":rolleyes: Laut der Prüfung wird ein String erwartet, der eine Zahl enthält. ;) preg_match("#[0-9]#",$cat))

 
litterauspirna
11-06-2008, 22:14 
 
Ich habe grad ein Brett vorm Kopf mit dem überschreiben,steinigt mich!

Wo müsste ich da richtiger Weise die Prüfung auf get_magic_quotes_gpc machen und das stripslashes richtig einsetzen so das das dann nicht mehr überschrieben wird?

 
bUTschy
11-06-2008, 22:16 
 
Original geschrieben von TobiaZ
Laut der Prüfung wird ein String erwartet, der eine Zahl enthält. ;) preg_match("#[0-9]#",$cat))
hmmm stimmt, z.b. Kategorie 0815 :D

 
h3ll
11-06-2008, 22:28 
 
Original geschrieben von litterauspirna
Ich habe grad ein Brett vorm Kopf mit dem überschreiben,steinigt mich!

Wo müsste ich da richtiger Weise die Prüfung auf get_magic_quotes_gpc machen und das stripslashes richtig einsetzen so das das dann nicht mehr überschrieben wird?

Statt
$poster = stripslashes($_POST['poster']);
machst du
$_POST['poster'] = stripslashes($_POST['poster']);

 
bUTschy
11-06-2008, 22:43 
 
Oder ersetzte gleich die ganze Liste
$poster = stripslashes($_POST['poster']);
$titel = stripslashes($_POST['titel']);
$email = stripslashes($_POST['email']);
$text = stripslashes($_POST['text']);
$cat = stripslashes($_POST['cat']);
$url = stripslashes($_POST['url']);
$allowkom = stripslashes($_POST['allowkom']);durch nur diese eine Zeile$_POST = array_map('stripslashes', $_POST);

 
litterauspirna
12-06-2008, 10:29 
 
Guten Morgen!

Ich habe ein Kategorie Post mal so geändert.


if(isset($_POST['send']))
{
$link = "<a href=\"newscat_post.php\">Zurück</a>";
if(get_magic_quotes_gpc())
{
$_POST['ncat'] = stripslashes($_POST['ncat']);
$_POST['stat'] = stripslashes($_POST['stat']);
}
if(empty($_POST['ncat']) && !preg_match("#^([0-9a-zäöü _-]+)$#i",$_POST['ncat']))
{
echo msgBoxAdmin("Der Catname fehlt oder hat verbotene Zeichen nur Zeichen a-z A-Z 0-9 _- und Leerzeichen erlaubt<br>!".$link);
exit();
}
else
{
$sqlbefehl ="
Insert Into $tab_ncats
(
ncat,
nstatus
)
VALUES
(
'".mysql_real_escape_string($_POST['ncat'])."',
'".mysql_real_escape_string((int)$_POST['stat'])."'
)
";
$result = mysql_query($sqlbefehl)or die(mysql_error());
header("Location: newscat_post.php");
}
}



Kann ich das so lassen?

mfg der litter

 
asp2php
12-06-2008, 10:42 
 
Nö, die Reihenfolge deiner Abarbeitung von Eingabe ist immer noch verkehrt. Warum zuerst


if(get_magic_quotes_gpc())
{
$_POST['ncat'] = stripslashes($_POST['ncat']);
$_POST['stat'] = stripslashes($_POST['stat']);
}


dann

if(empty($_POST['ncat']) ...

besser umgekehrt, denn sonst bekommst du eventuell Notice vom Parser.

Und was soll denn das hier:

mysql_real_escape_string((int)$_POST['stat'])

Eine Zahl kann ja unmöglich Zeichen enthalten, also warum mysql_real_escape_string anwenden? Wenn du aber Ganzzahl haben willst, dann besser inval nehmen.

BTW.: Warum denn dei Zahlen in ' bei deiner INSERT einpacken?

 
litterauspirna
12-06-2008, 11:00 
 
Da ich das error_reporting(E_ALL) eingeschalten habe kann ich sagen ich bekomme keine Notice Meldung und auch keine sonstige Fehlermeldung. Ich habe das error_reporting in meiner config.inc.php die ich immer einbinde!

Wie meinst du das mit umgekehrt? Also auf das stripslashes und empty bezogen?

mfg der litter

 
asp2php
12-06-2008, 11:02 
 
Original geschrieben von litterauspirna

Wie meinst du das mit umgekehrt? Also auf das stripslashes und empty bezogen?


Ja, zuerst auf empty prüfen, dann ggf. das andere.

 
litterauspirna
12-06-2008, 11:15 
 
Sozusagen muss ich erst die if Abfrage ausführen wo das empty enthalten ist und nach der Feldvalidierung dann erst die if anweisung wo ich auf magic_quotes prüfe und gegebenfalls das stripslashes ausgeführt wird!

So müsste ja dann die Abrabeitungsreihenfolge richtig ausgeführt?

Aslo so hier?


if(isset($_POST['send']))
{
$link = "<a href=\"newscat_post.php\">Zurück</a>";
if(empty($_POST['ncat']) && !preg_match("#^([0-9a-zäöü _-]+)$#i",$_POST['ncat']))
{
echo msgBoxAdmin("Der Catname fehlt oder hat verbotene Zeichen nur Zeichen a-z A-Z 0-9 _- und Leerzeichen erlaubt<br>!".$link);
exit();
}
if(get_magic_quotes_gpc())
{
$_POST['ncat'] = stripslashes($_POST['ncat']);
}
else
{
$sqlbefehl ="
Insert Into $tab_ncats
(
ncat,
nstatus
)
VALUES
(
'".mysql_real_escape_string($_POST['ncat'])."',
'".(int)$_POST['stat']."'
)
";
$result = mysql_query($sqlbefehl)or die(mysql_error());
header("Location: newscat_post.php");
}
}


Da ich einen int Wert mit schicke kann ich mir auf diesen ja die Prüfung sparen oder?

 
jahlives
12-06-2008, 11:22 
 
So wie die Reihenfolge jetzt ist wirst du imho bei aktivierten Magic Quotes Probleme bekommen. Denn wenn Magic Quotes zuschlägt dann schlägt deine Prüfung (preg_match) sicherlich fehl
Ich würde das eher so probieren

if(isset($_POST['send']) && !empty($_POST['ncat']))
{
if(get_magic_quotes_gpc())
{
$_POST['ncat'] = stripslashes($_POST['ncat']);
}
$link = "<a href=\"newscat_post.php\">Zurück</a>";
if(!preg_match("#^([0-9a-zäöü _-]+)$#i",$_POST['ncat']))
{
echo msgBoxAdmin("Der Catname fehlt oder hat verbotene Zeichen nur Zeichen a-z A-Z 0-9 _- und Leerzeichen erlaubt<br>!".$link);
exit();
}

Gruss

tobi


Alle Zeitangaben in WEZ +2. Es ist jetzt 21:05 Uhr.