Explotación manual de inyección ciega de SQL en la instrucción SELECT en el encabezado X-Forwarded-For

3

Tengo dificultades para explotar esta vulnerabilidad en el siguiente código:

<?php
ini_set('display_errors', 0);

define("INDEX", 1);
include '../db.php';

if(isset($_SERVER['HTTP_X_FORWARDED_FOR']) && !empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
  $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
  $query = "SELECT * FROM banned_ip WHERE ip='$ip'";

  $res = mysql_query($query);

  if(mysql_num_rows($res) > 0) {
      die('<h2>Banned!</h2>');
  }
}
?>

Hay una inyección de sql ciego en el encabezado X-Forwarded-For en el código anterior. Probé diferentes cargas útiles de OWASP Testing Guide y leí este curso en Pentesterlab pero todavía me resulta imposible explotar esto.

Mis suposiciones:

  • La tabla banned_ip está vacía, por lo que esta comprobación: if(mysql_num_rows($res) > 0) devuelve false. Debe haber una forma de insertar en esta tabla o realizar una selección desde otra tabla para devolver una respuesta distinta de cero.
  • La base de datos de back-end parece ser MySQL $res = mysql_query($query); , por lo que puede haber algunos comandos que desconozco que son específicos de MySql que pueden ayudar
pregunta jpiechowka 26.05.2017 - 10:52
fuente

2 respuestas

2

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
    
respondido por el tim 26.05.2017 - 14:20
fuente
0

¿Qué esperas que te devuelva la consulta? Es ciego, así que probablemente no puedas ver nada.

Si lo ha implementado en su entorno de prueba, puede verificar si puede manipular registros en la base de datos. Por lo que puedo verte definitivamente puedes.

En este caso, puede, por ejemplo, hacer:

X-Forwarded-For: '; DELETE * FROM banned_ip; '

durante la próxima solicitud, la IP no se prohibirá más si se permite SUPRIMIR al usuario que conecta la base de datos.

Es difícil hacer otra cosa si no conoce la estructura de la tabla / base de datos. Si lo sabrías, puedes insertar la IP allí y luego verificar si está prohibido.

Puede usar algún tipo de herramienta automatizada que intentará probar varias tablas y columnas para el valor que se insertará (por supuesto, ataque de fuerza bruta) y luego verificar si la IP ha sido prohibida.

Además, al utilizar esta vulnerabilidad, tendrá acceso a toda la base de datos. Si hay una tabla con nombre de usuarios (lo que es 99,9% de los casos) con columnas de nombre de usuario y contraseña, puede intentar insertar un usuario allí con el pase hash con MD5, luego SHA, luego SHA2 ... Hay tantas oportunidades. ..

Pero no esperes que puedas ver nada. Es por eso que se llama "ciego".

Editar: Por cierto, puedo ver en el ejemplo lo que tienes que lograr. Es exactamente escrito allí. Y también, está escrito exactamente cómo lograrlo. Básicamente, debes obtener acceso a la tabla de administradores y obtener un hash de contraseña desde allí. En consecuencia, tienes que atacar la aplicación usando credenciales de administrador.

    
respondido por el Fis 26.05.2017 - 13:42
fuente

Lea otras preguntas en las etiquetas