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?