Evitar inyección sql en Prestashop
¿Qué pasó?
En la oficina aun resuenan los gritos de terror, de pánico, de nerviosismo, y es que hace unos días descubrimos un agujero de seguridad enorme en la tienda online de un cliente.
El agujero descubierto permitía (a quien supiera) editar y borrar cualquier registro en la base de datos. IMAGÍNATE, de la noche a la mañana alguien podría borrar todos tus pedidos, tus clientes, inutilizarte la tienda online o cualquier otra cosa.
¿Cómo?
La respuesta es muy sencilla: Inyección SQL permitido en el módulo de una “importante” empresa. Lo curioso es que en Prestashop es muy sencillo evitar este tipo de problemas, por ello solo podemos pensar que este agujero de seguridad no se corrigió por dejadez o por desconocimiento, pero claro, un trabajador experto como el que, supuestamente, trabaja en dicha empresa de “prestigio” no debería tener tal grado de desconocimiento…
Me vais a perdonar que hable tan duramente pero, me cabrea mucho que empresas serias cobren grandes cantidades por productos con agujeros de seguridad tan garrafales. Esto nos da al resto de profesionales una imagen horrible.
Precioso pero, ¿qué es eso de Inyección SQL?
Bueno, os explico un poco de qué va todo esto. La inyección SQL es un problema muy muy antiguo, tan antiguo como la primera página web con base de datos.
Se basa en la idea básica de conseguir hacerle llegar a la base de datos instrucciones desde la página web, algo que, si bien en un principio no te otorgaría el control total de la tienda online, te abriría las puertas para llegar a conseguirlo.
Realizando el primer análisis
Imaginemos que la tienda “Vendo pan online” ha comprado a “vendomodulosmaloscomochurroswpro” un módulos de puntos. Este módulo de puntos añade una sección a la tienda online desde la que el cliente puede consultar sus puntos. Pongamos que la url es:
http://www.vendopanonline.dom/puntos?ref=mireferencia
Para quien lo desconozca, ese texto que hay tras la interrogante son datos que se le pasan a la página web para que sean interpretados.
En este caso el valor de ref identifica internamente la línea en la que se guardan los puntos, como un marcador o un índice. Esta referencia se pasaba directamente a una consulta sql sin verificar, limpiar ni tratar:
SELECT * FROM ps_puntos WHERE ref = ‘mireferencia’ LIMIT 1.
Hasta ahí bien, la consulta devolverá toda la información sobre los puntos de esa referencia pero, ¿qué pasa si queremos ser curiosos? ¿qué pasa si, como clientes, cambiamos la url y ejecutamos lo siguiente?
De la curiosidad a un ataque grave
http://www.vendopanonline.dom/puntos?ref=1′;remove from ps_product; select from ps_product where name = ‘
La respuesta es bien sencilla, el módulo cogerá el valor de ref y lo pegará SIN LIMPIAR en la consulta de la base de datos:
SELECT * FROM ps_puntos WHERE ref = ‘1’;remove from ps_product; select from ps_product where name = ” LIMIT 1.
De esa forma tan sencilla habríamos limpiado todos los productos de la tienda.
Ostras, ¿cómo puedo evitarlo?
Esa cara se nos quedó a nosotros al descubrirlo. Había que darle solución cuanto antes:
pSQL
Nos tocó leer y modificar todos los archivos del módulo, algo que si se hubiera hecho desde un principio no habría supuesto mucho trabajo.
Por favor amigos programadores, usad la función pSQL de Prestashop en TODAS las variables que se vayan a pasar a una consulta sql. Esta función limpiará el dato y evitará que la inyección sql sea posible.
Si no eres programador, me temo que no existe una solución directa que puedas aplicar. Te recomiendo que exijas siempre la mayor calidad en los productos que compres y que te asegures de que, en caso de problemas de este tipo, puedas recuperar tu dinero.
Un saludo, sed buenos, programad con cabeza, exige siempre una calidad mínima y no te dejes engañar.