Enfoques que no funcionan (consulta múltiple, insertar / eliminar / actualizar)
mysql_query
no admite consultas múltiples:
multiple queries are not supported
Esto significa que añadir una consulta a través de ;
para eliminar, editar o insertar datos no funcionará. Estás atascado con la consulta de selección que tienes.
También podemos ver que los datos seleccionados no se muestran, por lo que realmente tiene una inyección ciega.
Enfoque poco probable: escriba un archivo de shell
Teóricamente, podría intentar escribir datos en un archivo, por ejemplo, para obtener un shell de PHP. Podría verse algo como esto:
' UNION SELECT '<?php passthru($_GET['x']);' INTO OUTFILE '/var/www/404.php' -- -
Sin embargo, es poco probable que tengas suficientes permisos para esto. No solo necesitaría un usuario de SQL que tenga permiso para escribir en un archivo y un directorio en el que el usuario de mysql pueda escribir, sino que también el servidor mysql debería estar ejecutándose sin la opción --secure-file-priv
, que no es El caso por defecto en los sistemas modernos.
Lectura de datos a ciegas: basado en errores
Lo anterior significa que el único vector de ataque es leer datos de la base de datos. Si tienes suerte, se te mostrarán los errores.
Si se muestran errores, simplemente deberá crear un error que contenga la información que desea leer. Una forma es usar extractvalue
:
' or extractvalue(1,version()) -- -
En lugar de simplemente pedir la versión, puede seleccionar nombres de tablas y columnas de INFORMATION_SCHEMA
. Una vez que encuentre tablas interesantes, lea los datos.
Leer datos a ciegas: basado en el contenido
Tal vez tuviste mala suerte, y los errores no se muestran. Aún puede extraer datos haciendo preguntas de sí / no:
' AND substring(version(),1,1)='5
Como puede ver, toda la consulta, incluida la inyección, se volverá verdadera si la versión de MySQL es 5 y, de lo contrario, es falsa. Entonces, dependiendo de lo que suceda, el script muere o no, ya sabes qué versión de MySQL es.
En lugar de solicitar la versión, puede solicitar otros datos, por ejemplo, el primer carácter del hash de contraseña del primer usuario en la tabla de usuarios de mysql.
Puede optimizar el enfoque utilizando ascii y preguntando si el valor es mayor o menor que un cierto número, y luego reducir la ventana de posible carácter.
Es probable que desees utilizar una herramienta o script personalizado para una explotación real, ya que necesitarás muchas solicitudes.
Lectura de datos a ciegas: basado en el tiempo
Solo por razones de integridad: en caso de que no reciba ninguna respuesta (ningún mensaje prohibido), aún podría explotar las inyecciones en select basándose en el tiempo que tarda en completarse una solicitud.
La idea es la misma que la explotación basada en contenido, pero en lugar de obtener una respuesta diferente, realizarás una tarea lenta o no:
' AND IF(SUBSTRING(version(), 1, 1)='5',BENCHMARK(50000000,ENCODE('MSG','by 5 seconds')),null) %23