Buenas, me gustaría saber si este simple código en el que se validan los datos de un formulario de login sería vulnerable a SQL Injection, y en tal caso, cual serian las sentencias, gracias ^^
<?php
$dbhost='xxx';
$dbusername='xxx';
$dbuserpass='xxx';
$dbname='xxx';
// Conectar a la base de datos
mysql_connect ($dbhost, $dbusername, $dbuserpass);
mysql_select_db($dbname) or die('No se puede seleccionar la base de datos');
if ($_POST['username']==null){
echo "No introdujo usuario";
}
if ($_POST['username']) {
//Comprobacion del envio del nombre de usuario y password
$username=$_POST['username'];
$password=$_POST['password'];
if ($password==NULL) {
echo "La password no fue enviada";
}else{
$query = mysql_query("SELECT username,password FROM usuarios WHERE username = '$username'") or die(mysql_error());
$data = mysql_fetch_array($query);
if($data['password']!=$password) {
echo "$password\n";
echo "Login incorrecto";
}else{
$query = mysql_query("SELECT username,password FROM usuarios WHERE username = '$username'") or die(mysql_error());
$row = mysql_fetch_array($query);
session_start();
$_SESSION["k_username"] = $username;
echo ("Bienvenido <strong>".$_POST['username']." </strong> ya puedes acceder a las siguientes secciones:<br><center>".'<a href="2684268413971397/addatabase.php">Registrar datos</a>'."");
echo ("<br><br><center><a href='2684268413971397/visualization.php'>Buscador</a>." );
echo ("<br><br><center><a href='2684268413971397/tablasasignacion.php' target='auto_blank'>((TABLAS DE ASIGNACIÓN))</a>");
}
}
}
?>
si no tienes magic quotes montado, si...
$username=$_POST['username'];
$password=$_POST['password'];
if ($password==NULL) {
echo "La password no fue enviada";
}else{
$query = mysql_query("SELECT username,password FROM usuarios WHERE username = '$username'") or die(mysql_error());
si yo por username paso en el input algo tipo
Citar' OR '1'='1
la consulta quedará
SELECT username,password FROM usuarios WHERE username = '' OR '1'='1'
lo que retornará todo...
y tienes
Citarecho "$password\n";
así que no puedes ver el username, pero puedes usar LIMIT para sacar todas las contraseñas
por cierto, las contraseñas no se guardan en crudo, eso es pecado :-X se guardan MINIMO en MD5 u otro algoritmo de hash
Cita de: engel lex en 25 Septiembre 2014, 22:54 PM
si no tienes magic quotes montado, si...
$username=$_POST['username'];
$password=$_POST['password'];
if ($password==NULL) {
echo "La password no fue enviada";
}else{
$query = mysql_query("SELECT username,password FROM usuarios WHERE username = '$username'") or die(mysql_error());
si yo por username paso en el input algo tipo
la consulta quedará
SELECT username,password FROM usuarios WHERE username = '' OR '1'='1'
lo que retornará todo...
y tienes
así que no puedes ver el username, pero puedes usar LIMIT para sacar todas las contraseñas
por cierto, las contraseñas no se guardan en crudo, eso es pecado :-X se guardan MINIMO en MD5 u otro algoritmo de hash
$password no es la contraseña de la base de datos. Pero es cierto que puedes modificar la query.
rayos ando medio dormido hoy!
MinusFour tienes razon, es que vi la linea
if($data['password']!=$password) {
echo "$password\n";
y vi como si fuera una asignación
pero igual retornará un error de mysql, lo que da una pista al hecho que hay una asignacion directa y sospecho que se puede inyectar algo indebido...
y no me retracto de las contraseñas en crudo
Wow..rápidas respuestas, ¡Muchas gracias por responder!, Esta web es un pequeño proyectito que me hice hace bastantes años, y ya obsoleto, el código anterior es el que hay para la validación, he intentado algunas sentencias de inyection pero sin éxito, les propongo un pequeño reto si se aburren mucho para confirmar que el código es vulnerable, la url de la web es http://galaxyview.comuf.com/ (http://galaxyview.comuf.com/), tienen carta blanca para defacear o sacar el listado de usuarios. Saludos y de nuevo, Gracias por las respuestas...excelente foro!
mmm...¿Nadie se anima?
Prueba con expresiones regulares en PHP, lo harás más seguro ;)