Tengo una aplicación en PHP 5.3.29
y MySQL 5.6.35
la cual usaba SQLQUERY
para ejecutar las instrucciones SQL
, las cambié utilizando PDO
e instrucciones preparadas.
El problema es que analizo la aplicación utilizando ZAP 2.6.0
y pude comprobar que igual se pueden alterar los parámetros de entrada.
Lo que hice fue habilitar el log
general de MySQL
y revisar todas las consultas que se ejecutan en la base de datos, así pude revisar que llegaba a la base de datos.
El código es:
'function cerrar_sesion($usuario) {
$pdo = new PDO("mysql:"."host=".DB_SERVIDOR.";"."dbname=".DB_BASEDATOS,DB_USUARIO, DB_CLAVE);
$query = $pdo->prepare('UPDATE ADMIN_USUARIO SET USERID=\' \' WHERE C_USUARIO= :usuario');
$query->bindParam(':usuario',$usuario,PDO::PARAM_INT);
$query->execute();
$pdo = null;'
Al revisar el log
de MySQL
llega el parámetro $usuario alterado (Ejemplo: 54/2, yo solo envié el 54 y ZAP le añadió el /2 y esto fue lo que llegó a la base de datos).
Si lo notan la inyección consistió en agregar el "/2" al parametro enviado al campo "C_USUARIO" a continuación 3 lineas recuperadas del log de MySQL:
227726 Query UPDATE ADMIN_USUARIO SET USERID=' ' WHERE C_USUARIO= '54/2' 227730 Query UPDATE ADMIN_USUARIO SET USERID=' ' WHERE C_USUARIO= '108/2' 227732 Query UPDATE ADMIN_USUARIO SET USERID=' ' WHERE C_USUARIO= '108/2'
Todo esto a pesar de usar PDO
y prepare y aún así llega la inyección.