Antes de responder directamente a la pregunta, vale la pena señalar que incluso si todo lo que un atacante puede hacer es leer datos que no debería poder, eso es generalmente todavía muy mal. Considere que al usar JOIN
s y SELECT
ing desde las tablas del sistema (como mysql.innodb_table_stats
), un atacante que comienza con SELECT
inyección y ningún otro conocimiento de su base de datos puede mapear su esquema y luego filtrar la totalidad de los datos que tiene en MySQL. Para la gran mayoría de bases de datos y aplicaciones, eso ya representa un agujero de seguridad catastrófico.
Pero para responder a la pregunta directamente:hay algunas formas que conozco mediante las cuales la inyección en MySQL SELECT
se puede utilizar para modificar datos. Afortunadamente, todos requieren razonablemente circunstancias inusuales para ser posible. Todas las inyecciones de ejemplo a continuación se proporcionan en relación con la consulta inyectable de ejemplo de la pregunta:
SELECT id, name, message FROM messages WHERE id = $_GET['q']
1. Consultas "apiladas" o "por lotes".
La clásica técnica de inyección de simplemente poner una declaración completamente diferente después de la que se está inyectando. Como se sugiere en otra respuesta aquí
, podría configurar $_GET['q']
a 1; DELETE FROM users; --
para que la consulta forme dos declaraciones que se ejecutan consecutivamente, la segunda de las cuales elimina todo en los users
mesa.
En mitigación
La mayoría de los conectores MySQL, en particular, incluido el mysql_*
de PHP (obsoleto) y (no en desuso) mysqli_*
funciones:no admite consultas apiladas o por lotes en absoluto, por lo que este tipo de ataque simplemente no funciona. Sin embargo, algunos lo hacen - en particular, incluye el conector PDO de PHP (aunque el soporte se puede desactivar para aumentar la seguridad
).
2. Explotación de funciones definidas por el usuario
Las funciones se pueden llamar desde un SELECT
y puede alterar los datos. Si se ha creado una función de modificación de datos en la base de datos, puede hacer que SELECT
llámelo, por ejemplo, pasando 0 OR SOME_FUNCTION_NAME()
como el valor de $_GET['q']
.
En mitigación
La mayoría de las bases de datos no contienen ninguna función definida por el usuario, y mucho menos las que alteran los datos, por lo que no ofrecen ninguna oportunidad para realizar este tipo de explotación.
3. Escribir en archivos
Como se describe en el artículo de Muhaimin Dzulfakar (un nombre algo presuntuoso) Explotación avanzada de MySQL
, puede usar INTO OUTFILE
o INTO DUMPFILE
cláusulas en una selección de MySQL para volcar el resultado en un archivo. Ya que, usando un UNION
, cualquier resultado arbitrario puede ser SELECT
ed, esto permite escribir nuevos archivos con contenido arbitrario en cualquier ubicación que el usuario ejecute mysqld
puede acceder. Es posible que esto se pueda explotar no solo para modificar datos en la base de datos MySQL, sino también para obtener acceso de shell al servidor en el que se está ejecutando, por ejemplo, escribiendo un script PHP en la webroot y luego haciéndole una solicitud, si el El servidor MySQL está cohospedado con un servidor PHP.
En mitigación
Muchos factores reducen la explotabilidad práctica de este ataque que, por lo demás, suena impresionante:
- MySQL nunca te permite usar
INTO OUTFILE
oINTO DUMPFILE
para sobrescribir un archivo existente, ni escribir en una carpeta que no existe. Esto previene ataques como crear un.ssh
carpeta con una clave privada en elmysql
directorio de inicio del usuario y luego SSH o sobrescribiendo elmysqld
binario en sí mismo con una versión maliciosa y esperando un reinicio del servidor. - Cualquier paquete de instalación medianamente decente configurará un usuario especial (normalmente llamado
mysql
) para ejecutarmysqld
, y otorgar a ese usuario solo permisos muy limitados. Como tal, no debería poder escribir en la mayoría de las ubicaciones en el sistema de archivos y, ciertamente, normalmente no debería poder hacer cosas como escribir en la raíz web de una aplicación web. - Las instalaciones modernas de MySQL vienen con
--secure-file-priv
configurado de forma predeterminada, evitando que MySQL escriba en cualquier lugar que no sea un directorio de importación/exportación de datos designado y, por lo tanto, hace que este ataque sea casi completamente impotente ... a menos que el propietario del servidor lo haya desactivado deliberadamente. Afortunadamente, nadie deshabilitaría por completo una función de seguridad como esa, ya que obviamente sería:oh espera no importa .
4. Llamando al sys_exec()
función de lib_mysqludf_sys
para ejecutar comandos de shell arbitrarios
Hay una extensión de MySQL llamada lib_mysqludf_sys
eso, a juzgar por sus estrellas en GitHub
y una búsqueda rápida de Stack Overflow
- tiene al menos unos pocos cientos de usuarios. Agrega una función llamada sys_exec
que ejecuta comandos de shell. Como se señaló en el n. ° 2, las funciones se pueden llamar desde dentro de un SELECT
; las implicaciones son con suerte obvias. Para citar de la fuente
, esta función "puede ser un peligro para la seguridad" .
En mitigación
La mayoría de los sistemas no tienen instalada esta extensión.