it-swarm-es.com

¿Cómo aprovechar la vulnerabilidad "PHP_MAGIC_QUOTES ON" para causar el máximo daño?

Encontré una gran cantidad de exploits de inyección SQL en algunos sistemas que mantengo. Sé cómo prevenir la inyección, pero me gustaría demostrarle a mi CEO y CTO lo peligroso que es si no nos concentramos lo suficiente en mantener nuestras aplicaciones seguras.

Muchas veces necesitamos reaccionar en lugar de proactuar cuando se trata de seguridad, principalmente porque cuando se encuentra una vulnerabilidad no se prioriza su reparación porque es poco probable que sea explotada.

La siguiente consulta es uno de estos ejemplos. El servidor se está ejecutando con PHP_MAGIC_QUOTES ON (sí, sé que eso es realmente malo) y, por lo tanto, previene los exploits en varios lugares porque los programadores han agregado explícitamente '' alrededor de todos los valores de entrada utilizados en las consultas (por lo que no puede salir de él). Sin embargo, la consulta que encontré vulnerable ahora se trata como un número entero en lugar de una cadena, y no contiene "" alrededor.

Aquí está el ejemplo:

$sql = "select * from vulnerable_table where id = " . $_GET['id'] . " limit 1"; 
$result= mysql_query($sql); 

¿Cómo haría el daño máximo al sistema considerando que controla la variable de identificación?.

Algunos ejemplos que se me ocurrieron por mi cuenta:

id = 1;drop table mysql.user 
Only if semi colon is accepted

id = 1;SELECT '<?php exec($_get['cmd'])?>' INTO OUT_FILE('/var/www/backdoor.php')
Only if I could bypass the magic_quotes somehow
22
Chris Dale

En PHP no puede apilar consultas con un punto y coma. Sin embargo, puede anidar una consulta en otra con paréntesis (comúnmente llamadas subconsultas), por ejemplo:

SELECT * FROM vulnerable_table WHERE id = (SELECT number from other_table)

Usando esta técnica (sin tener en cuenta si genera su resultado SQL o no), un atacante entusiasta puede extraer todos los datos de su base de datos.

Ejemplo (con salida en la página web)

SELECT * FROM vulnerable_table WHERE id = (SELECT group_concat(table_name) from information_schema.tables WHERE version = 10)

Esta consulta dará como resultado una lista (como una cadena) de todas las tablas definidas por el usuario en su base de datos. Las consultas posteriores revelarán las columnas y permitirán al adversario obtener un conocimiento completo de la estructura de su tabla (por ejemplo: "tbl_accounts, tbl_passwords, tbl_guestbook").

Si no proporciona ningún resultado en su página web, un atacante aún podría inyectar una declaración condicional (piense: caso-cuándo) con su subconsulta SQL, lo que dará como resultado un error de SQL en un caso y ningún error en el otro caso. A partir de "ningún resultado" y su página web normal, puede recopilar 1 bit de información y realizar una búsqueda binaria a través de su base de datos.

Generar cadenas en una consulta SQL como la que sugirió para cargar un PHP-Backdoor (dependiendo de si el usuario actual de MySQL tiene el privilegio FILE, que no debería;)) tampoco es tan difícil de conseguir: Usando el ascii () , y ord (), puede crear sus cadenas con entradas enteras. Además, un valor como 0x414141 se convertirá automáticamente a 'AAA' en MySQL.

Con respecto a las técnicas de evasión de filtros y ataques muy avanzadas, también le recomiendo que lea el blog de Reiners sobre seguridad SQL: http://websec.wordpress.com/

En aras de la integridad: para corregir esta vulnerabilidad, puede realizar un encasillado y transformar $ _GET ['id'] en un número entero.

18
freddyb

Si su empresa es de alguna manera parte de las regulaciones que requieren seguridad (como SOX o HIPPA en los EE. UU.) O estándares comerciales (como PCI o varios estándares ISO), todo lo que tiene que hacer es decirles que:

  • ha encontrado agujeros que podrían permitir que cualquiera descargue toda la base de datos y la red (estire un poco la verdad si tiene que venderla, y recuérdeles la filtración de ACS: Law).
  • bríndeles cifras concretas sobre cuánto tiempo y dinero les costó a otras empresas que perdieron datos o fueron pirateadas.
  • que si alguna vez lo auditan, la empresa puede ser multada o despedida por no cumplir con los estándares.
  • que si alguna vez es demandado o procesado, y existe alguna evidencia de que ignoró un problema conocido o potencial importante, los daños punitivos podrían ser suficientes para llevar a la empresa a la bancarrota. (Vea la demanda de Ford Pinto).

Esto funcionará mejor si puede convencer al abogado de la empresa para que le dé las malas noticias. Si eso no funciona, no hay nada que pueda salvar a su empresa.

Hagas lo que hagas, olvídate de explotar el vuln tú mismo. Te expones a juicios y encarcelamiento si lo haces sin un permiso por escrito, aunque una pequeña evidencia que demuestre que funciona en una cuenta de prueba que configuraste específicamente para ese propósito podría funcionar.

11
SilverbackNet

Aquí es posible la extracción de información (como la lectura de archivos o la extracción de información del usuario de la base de datos) y el consumo de recursos del servidor. Primero se puede lograr utilizando la declaración UNION en la consulta. En segundo lugar, se utiliza la función BENCHMARK (). La extracción de datos también es posible mediante el uso de la función mencionada.

No quiero mostrar ejemplos aquí, están en Internet. Y supongo que, como mantenedor del sistema, puede reproducir casos. Si realmente los necesitas, comenta.

Por cierto, no necesita el punto y coma para poder escribir en archivos (aunque se necesita acceso para escribir en archivos).

4
anonymous

Creo que esta caricatura lo dice todo. Mesitas de Bobby

3
Dave

id =

0 OR id <> 0

omitiría el uso de ID por completo, y el hacker podría volcar toda la tabla.

2
Matthew Read

El daño máximo es relativo. Insertar discretamente pequeños datos difíciles de detectar de forma continua puede ser potencialmente mucho más devastador que destruir grandes cantidades de datos de una sola vez.

Una situación aún potencialmente peor puede ser simplemente leer los datos durante meses/años. ¿Cuántos números de tarjetas de crédito almacena en esa base de datos? Contraseñas

Nadie puede mostrarte la fórmula mágica de la inyección SQL. Depende de los datos que guarde, la habilidad del atacante, si tiene conocimiento interno, la arquitectura del esquema, etc.

2
bahamat

Si el sitio es Drupal, podrían alterar la contraseña del usuario 1 en la tabla de usuarios para proporcionarles acceso administrativo, y hacer un daño más específico más adelante, ya que ahora tienen la capacidad de explorar el sitio con privilegios de administrador.

0
Dave Keays