¿Es vulnerable a SQL Injection este código?

Iniciado por romerixo, 25 Septiembre 2014, 22:46 PM

0 Miembros y 2 Visitantes están viendo este tema.

romerixo


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 ^^

Código (php) [Seleccionar]
<?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>");
}
}
}
?>

engel lex

si no tienes magic quotes montado, si...


Código (php) [Seleccionar]
$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á
Código (sql) [Seleccionar]
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
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

MinusFour

Cita de: engel lex en 25 Septiembre 2014, 22:54 PM
si no tienes magic quotes montado, si...


Código (php) [Seleccionar]
$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á
Código (sql) [Seleccionar]
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.

engel lex

rayos ando medio dormido hoy!

MinusFour tienes razon, es que vi la linea

Código (php) [Seleccionar]
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
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

romerixo

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/, tienen carta blanca para defacear o sacar el listado de usuarios. Saludos y de nuevo, Gracias por las respuestas...excelente foro!


Yaldabaot

Prueba con expresiones regulares en PHP, lo harás más seguro ;)
Nunca me contestan -_-