SQL injection (pruebas)

Iniciado por ars1993, 28 Enero 2014, 12:27 PM

0 Miembros y 1 Visitante están viendo este tema.

ars1993

Buenas, estoy haciendo un código para probar "cosas" de SQL injection. Estoy trabajando con PostgreSQL.

Básicamente estoy probando vulnerabilidades con el paso de variables por la URL (blablabla?id="algo")
La estructura de la web vulnerable que estoy haciendo es basicamente dos ficheros. Uno de login, que una vez logeado se pasa a otro fichero que muestra productos, que los puedes buscar (ahí está la vulnerabilidad, la búsqueda por la URL con un "id=")

El problema es que estoy haciendo algo mal y no funciona la cosa. La vulnerabilidad que quiero probar es causar un error en la query (por la URL) para que me devuelva pues por ejemplo la versión de la base de datos.

Si yo hago:

http://localhost/pruebas/producto.php?id='

Ésto peta que ya es lo que interesa y da el error siguiente:

pg_exec(): Query failed: ERROR: unterminated quoted string at or near "'''" LINE 1: select * from productos where referencia = ''' ^ in C:\...etc etc


El problema es cuando intento meter en el id ésto:

http://localhost/pruebas/producto.php?id= cast(version() as int)


Ésto en teoria también tendria que petar y darme un error que por ahí enmedio del error me diria la version de postgreSQL, el sistema operativo (en éste caso el mío porque lo hago todo en local, etc etc).
Pero no es el caso, no me peta y no sé por qué motivo.

Adjunto los códigos de éstos dos ficheros aver si alguien se le ocurre algo.


LOGIN.PHP

<?php
session_start
();

include 
'pg.inc.php';

//Si se ha rellenado anteriormente el formulario, comprobar los datos
if(isset($_POST["nombre"])){

//Sentencia SQL a ejecutar
$sql "SELECT * FROM usuarios WHERE nombre = '".$_POST["nombre"]."' AND contrasena = '".$_POST["pwd"]."'";
echo $sql;
$resultado ejecutar_SQL($conexion,$sql);

//Si hay filas, los datos de acceso eran correctos
if(numero_filas($resultado) != 0){

//Obtener los datos del usuario loggeado
$fila fila($resultado,0);

//Almacenar su ID en los datos de la sesión
$_SESSION["usuario"] = $fila["id"];

//Dar la bienvenida
echo "<h3>Login OK</h3> Bienvenid@ ".$fila["desc"]."<br> Pulse <a href='producto.php'>aqui;</a> para continuar.";
}
else{
echo "<h3>Login fallido</h3>";
}
}

//Si no se ha iniciado la sesión, mostrar un formulario de logon
if(!isset($_SESSION["usuario"])){
print  '<form method="POST" action="login.php">
<table border="1">
<tr>
<td colspan="2"> Introduzca sus datos de acceso</td>
</tr>
<tr>
<td>Nombre:&nbsp;</td>
<td><input type="text" name="nombre" id="nombre"></td>
</tr>
<tr>
<td>Clave:&nbsp:</td>
<td><input type="password" name="pwd" id="pwd"></td>
</tr>
</table>
<input type="submit" value="Enviar">
</form>'
;
}

?>





PRODUCTO.PHP

<?php
//-----------------------Encabezado donde se muestra el nombre de usuario-----------
session_start();

include 
'pg.inc.php'//Funciones de operaciones con la base de datos

if (isset($_SESSION["usuario"])){
//Obtener el nombre del usuario
$sql "select * from usuarios where id=".$_SESSION["usuario"];
$resultado ejecutar_SQL($conexion,$sql);
$fila fila($resultado,0);
$usuario $fila["desc"];

//Mostrar un indicador del usuario logado
echo '<table border="1" width="100%">
<tr width="100%"><td>
HA INICIADO SESSION COMO: '
.$usuario.'</td></tr></table><br>';
}
else{
//Si no está logado, redirigir a logon
header('Location: login.php');
}
//-----------------------------------------------------------------------------------


//----------------------Sección para la búsqueda de productos------------------------

//Si se indicó el producto, buscarlo
if(isset($_GET["id"])){
$sql "select * from productos where referencia = '".$_GET["id"]."'";
$resultado ejecutar_SQL($conexion,$sql);

if(numero_filas($resultado) == 0){
echo "Referencia no encontrada";
}
else{
$fila fila($resultado,0);
echo "<h3>Datos sobre el producto:</h3>";
echo "<table border=1>";
echo "<tr><td>Referencia</td><td>Nombre</td><td>Precio</td></tr>";
echo "<tr><td>".$fila["referencia"].'</td><td>'.$fila["nombre"].'</td><td>'.$fila["precio"].'</td></tr>';
echo "</table>";
}
}

//Mostrar formulario "Buscar"
echo '<h3>Buscar Producto</h3>
<form method="GET" action="producto.php">
Buscar: <input type="text" id="id" name="id">
<input type="submit" value="Buscar">
</form>'
;
?>





Muchas gracias! Saludos
640k deberian ser suficientes para todo el mundo..

Shell Root

Para un ejemplo más clado de lo que estás haciendo, solo printea la query despúes de enviar la inyección. Ahora entra en el motor de base de datos y ejecuta la query y ve que devuelve. -con sólo ver la query te darás cuenta de tu fallo-
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.