Sql injection

  • Themenstarter Themenstarter starfoxfs
  • Beginndatum Beginndatum
S

starfoxfs

HI zusammen,

ich weiß nicht genau welches Forum ich nehmen sollte daher hab ich einfach mal PHP gewählt.

Ich hab momentan N-Stalker Web Application Security Scanner Free Edition am laufen und das zeigt mir etliche Sicherheitslücken in meinem Quellcode an.

unter anderem Battle.net Clan Script Sql injection, NuclearBB Sql Injection, etc...

Ich weiß nicht was ich an meinem Quellcode noch verbessern kann oder wo hier noch eine Möglichkeit für eine Sql Injection ist.

PHP:
<?php
error_reporting(E_ALL);
if(isset($_POST["knr"] && isset($_POST["passwort"]) {

// Session starten 
session_start (); 

/*
Die Verbindung zur Datenbank wird erstellt und die start Scripte werden geladen.
*/
include "./inc/config.inc.php";

$timestamp = time();
$remote_ip = htmlentities($_SERVER["REMOTE_ADDR"], ENT_QUOTES);

$db = new mysql();

$connection = $db->db_connect($db_host, $db_user, $db_pass, $db_name);

if(isset($_POST["knr"])) { $knr = stripslashes(htmlentities($_POST["knr"])); }

// Passwort Prüfung
if(isset($_POST["passwort"])) { $pass = stripslashes(htmlentities($_POST["passwort"])); }
if(strlen($pass) < 5 || strlen($pass) > 20) {
	
header ("Location: index.php?fehler=1");

}else{
$pwd = md5($pass);
}
// Passwort Prüfung

$num = $db->fetchnum($db->query("SELECT id FROM ".$sqltab6." WHERE Knr = '".$db->escape($knr)."'
AND Passwort = '".$db->escape($pwd)."'"));

if ($num > 0) {  

// Benutzerdaten in ein Array auslesen.  

$data = $db->fetcharray($db->query("SELECT id, Knr FROM ".$sqltab6." WHERE Knr = '".$db->escape($knr)."' AND Passwort = '".$db->escape($pwd)."'"));  

// Sessionvariablen erstellen und registrieren  
  $_SESSION["user_id"] =  $data["id"];  
  $_SESSION["user_knr"] = $data["Knr"]; 
  
  // IP Sperre leeren wenn richtig eingeloggt
$delip = "DELETE FROM ".$sqltab10." WHERE blockedIP = '".$db->escape($remote_ip)."'";
$db->query($delip);
// -->
  
  header ("Location: indexepc.php");  

}else{  

$ip = "INSERT INTO ".$sqltab10." (id, blockedIP, timestamp) VALUES ('', 
'".$db->escape($remote_ip)."',
'".$db->escape($timestamp)."')";
$db->query($ip);

header ("Location: index.php?fehler=1");

}
}else{
header ("Location: index.php?fehler=1");
}
?>
 
Nun, stripslashes hat eigentlich garnichts mit der Absicherung von übergebenen Daten zu tun und auch htmlentities bewirkt nicht viel bzw. läßt sich superleicht umgehen.
Ich verwende bei mir für alle Daten diese Routine, die aus einem Dr. Web Artikel stammt.
Die erste Zeile wird zusätzlich noch auf die Zeichen beschränkt, die in dem jeweiligen Feld vorkommen können. In einer PLZ z.B. hat außer Zahlen nichts anderes zu suchen.
Das trim() hat nicht direkt was damit zu tun, verhindert aber z.B. die Emails, die nur mit Leerzeichen gefüllt werden.
PHP:
$name = preg_replace( "/[^a-z0-9äöüß !?:;,.\/_\-=+@#$&\*\(\)]/im", "", $_POST['name'] );
$name = preg_replace( "/(content-type:|bcc:|cc:|to:|from:)/im", "", $name );
$name = strip_tags($name);
$name = trim($name);
 
hmm ok dann werde ich wohl auchmal meine strings etwas eingehender prüfen, wenn ihr sonst noch was findet im quellcode sagt bescheid.

@hot_wax

es wird nicht wirklich was angezeigt soweit ich das ersehen konnte war der Sql Inject jeweils über die URL da meistens irgendwelche Parameter an der URL hingen.
 
Zurück