0

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.

  • Me parece que lo que no tienes claro es [`¿Qué es la inyección SQL?`](https://es.stackoverflow.com/a/10519/16597), porque claramente `PDO` ha capturado el `string`... ¿o hay algo de tu pregunta que no entendí? – Marcos Aug 09 '17 at 20:27
  • ¿Cuál ha sido la inyección? Y cuándo dices que _llega el parámetro usuario alterado_ ¿a qué te refieres?. Habría sido útil que pongas ejemplos de lo que recuperas en `$usuario` para pasarlo a la BD. Cuando se usa PDO, **[hay que tener en cuenta esto](https://es.stackoverflow.com/a/53280/29967)** al configurar la conexión. – A. Cedano Aug 09 '17 at 21:26
  • La inyección consistió en que al parámetro de entrada se le agrego la operación matemática "/2", para el primer caso el dato que se envió fue el número 54, para el segundo y tercer caso fue el número 108. Ese /2 jamás lo puse yo fue el ZAP que lo hizo para probar la vulnerabilidad. Eso fue lo que puse como evidencia y fue sacado del LOG de Mysql. No entendí que quisiste decir con tener en cuenta cuando se configura la conexión. El parámetro que estoy pasando es un entero y por ello estoy declarando en el BIND que es un PARAM_INT, con eso debería ser suficiente. – Eduardo Ortiz Aug 09 '17 at 22:55

0 Answers0