jueves, 19 de febrero de 2015

Escapando de SQL Injection

Una vulnerabilidad que preocupa a los programadores Web es la inyección de código SQL en las variables de un formulario.

Vamos directos a un ejemplo, la web ficticia de una tienda de deportes con un listado de productos en la que aparece un campo para filtrar por código del producto.


¿En qué consiste la vulnerabilidad?

El código PHP hace una consulta al servidor de bases de datos MySQL para obtener los productos. Cuando utilizamos el cuadro de texto de filtrar, ese valor debe pasarse a la consulta sobre la base de datos para filtrar por el código deseado, bien, pues ahí es donde vamos a inyectar código SQL.

¿Con qué objeto hace esto un atacante?

Muy fácil, con el objetivo de obtener otra o toda la información de la base de datos (usuarios, contraseñas, etc).

¿Cuál es nuestra labor como hacker ético?

Aprender a explotar esta vulnerabilidad para concienciar de la importancia del tema. Y el siguiente paso, aprender a evitarlo.

Un ejemplo de inyección

Vamos a filtrar para ver el producto con código “1”, y luego a inyectar código para ver todos los productos.


En el código de la página hemos puesto un “echo” para visualizar la consulta y comprobar lo que se está enviando al servidor MySQL.


Veamos ahora el ejemplo de inyección de código para obtener todos los productos.


Se obtienen todos los productos diciendo que saque las filas que cumplan la condición “código=1” o las que cumplan la condición de “1=1” (que siempre se va a cumplir).

El código PHP de la Web en la que se envía la consulta es el siguiente:


¿Cómo lo evitamos?

Hay que escapar toda variable en la que se almacene un campo de entrada del formulario en el que puede escribir un usuario (en el que podría inyectar código).

Usaremos la función mysqli_real_escape_string para solucionarlo.


Ya tenemos el código con las variables escapadas. Vamos a probarlo.
Si filtramos para ver el código “1”.


Funciona… ¿Y si inyectamos la consulta anterior?



¡Et voilà! El código escapado evita la inyección de código.

Anexo: filter_input

También podemos utilizar la función filter_input:


No hay comentarios: