SQL injection múltiple

Vamos a abordar juntos otro par de párrafos sobre SQL injection. En esta ocasión te escribo sobre una variante de esta técnica que se basa en la posibilidad de ejecutar varias consultas, usando el estándar SQL, separadas entre sí con el signo de puntuación punto y coma (;).

Con una pequeña y rápida prueba, un hacker puede comprobar si nuestro formulario es vulnerable a SQL injection, y si debe  usar una comilla sencilla (‘) o comillas dobles (“). Una vez hecho esto únicamente ha de separar el valor legítimo del código malicioso usando dicha comilla, y con el punto y coma finalizar la consulta legítima para iniciar una nueva consulta con la función que el hacker desee realizar sobre la base de datos. Parece difícil, pero cuando veas un ejemplo verás que es realmente sencillo.

El valor led zeppelín daría lugar a una consulta del tipo que sigue.
SELECT * FROM discografía WHERE autor = ‘led zeppelin’

Ahora vamos a ver el resultado introduciendo el valor led zeppelin’; GRANT ALL ON *.* TO ‘hacker’@’%
SELECT * FROM discografía WHERE autor = ‘led zeppelin’;
GRANT ALL ON *.* TO ‘hacker’@’%’

La extensión de MySQL  para PHP no permite realizar múltiples consultas de modo predeterminado, pero la nueva extensión posee la función mysql_multi_query(). La recomendación obvia es que no hagas uso de esta función si deseas preservar tu aplicación de este tipo de ataques. Deberás ser más cuidadoso aún si usas SQLite que, por la facilidad que otorga para el manejo de bases de datos desde PHP, atrajo la atención de muchos desarrolladores en un momento dado. SQLite permite el uso de múltiples consultas, especialmente con comandos INSERT, aunque es más restrictivo con comandos SELECT. No dejes de consultar su documentación en lo relativo a estos aspectos en  http://sqlite.org o en http://es.php.net/sqlite.