it-swarm-es.com

PHP vulnerabilidad file_get_contents

Estoy evaluando la seguridad de un portal web para un cliente y encontré una vulnerabilidad.

Este es el código PHP código:

echo(file_get_contents("template/data/" $_GET['id']));

Pude leer con éxito ../../../index.php, config.php, etc.

Pero solo quiero poder demostrar que este error es más crítico que leer configuraciones. Leí el usuario/pase de MySQL, pero no puedo conectarme a él ya que solo está escuchando en localhost. Todos los demás códigos que leí no condujeron a nada. Básicamente, todo lo que obtuve fue solo un código fuente que no era un secreto.

No puedo hacer cosas de filtro php porque tiene "template/data /" al comienzo de la cadena.

¿Qué más se puede hacer con este código vulnerable? ¿Algunas ideas?

7
GMX Rider

¿La base de datos MySQL está en la misma máquina? Si es así, ¿puede extraer los archivos de la base de datos y reconstruir la base de datos en su máquina?

Como otros han dicho, puede extraer/etc/passwd que contiene mucha información sobre el diseño del usuario. Si puede acceder a/etc/shadow, puede intentar desconectar las contraseñas de crack.

Si la aplicación web tiene un portal de inicio de sesión, intente las credenciales de mysql, así como "admin", "root", etc. con la contraseña.

¿El código fuente o los archivos de configuración contienen otras credenciales de acceso/claves API? ¿Es legible el certificado SSL de los sitios? Si es así, ¿puede hacer conexiones Man In the Middle?

También puede obtener detalles de/proc/version,/etc/issue, etc. y las versiones del servidor web para buscar otras vulnerabilidades conocidas.

Finalmente, ¿se supone que la fuente es pública? Si no, el código fuente a menudo se considera valioso. Y puede inspeccionar eso para detectar vulnerabilidades adicionales.

5
Hector

La respuesta de Héctor tiene algunos ejemplos excelentes, pero me gustaría enfatizar otro punto muy importante:

Esto no es una vulnerabilidad pequeña

Parece que tiene la impresión de que si "todo" lo que puede hacer es leer archivos arbitrarios en su sistema, entonces la vulnerabilidad no es realmente una vulnerabilidad. Yo diría exactamente lo contrario. Debe darse cuenta de que la seguridad se aborda mejor desde la perspectiva de la defensa en profundidad. Puede ser prácticamente imposible tener un sistema libre de vulnerabilidades, por lo que el objetivo es tener tantas capas de defensa como sea posible en tantas áreas como sea posible, de modo que si un actor malicioso encuentra una debilidad en un área, las defensas en todo el sistema evitará que causen daños reales. Suceden muchas infracciones en el mundo real, no porque haya una vulnerabilidad de la que alguien se aprovechó, sino porque hubo una vulnerabilidad que les permitió aprovechar otra vulnerabilidad, que les permitió hacer otra cosa, hasta que encontraron algo realmente = peligroso.

Esta pequeña vulnerabilidad está dando a los actores maliciosos acceso de lectura total a su sistema. Esto se ve agravado por el hecho de que este fue un error de seguridad bastante obvio. Si la compañía en cuestión tenía desarrolladores bien entrenados y realizaba revisiones periódicas del código, es muy poco probable (IMO) que dicho código llegue a un sistema de producción. La importancia de este hecho es que sugiere que esta no será la única vulnerabilidad de seguridad presente. El hecho de que ahora tenga una manera de ver directamente el código fuente del sistema significa que encontrar más vulnerabilidades de seguridad es sustancialmente más fácil. Muy posiblemente el juego haya terminado. Si fuera un actor malicioso y encontré esto, haría lo siguiente:

  1. Descargue el código fuente de todo el sistema (puede llevar un día, pero es casi seguro que sea posible)
  2. Busque cualquier vulnerabilidad de SQLi (probablemente haya muchas) y úselas para descargar toda su base de datos. Diría que hay buenas probabilidades de que no estén utilizando la seguridad de contraseña adecuada. Sería obvio por su código fuente, lo que significa que si no están protegiendo adecuadamente sus contraseñas, una vulnerabilidad SQLi me permitirá:
  3. Fuerza bruta las contraseñas de administrador. Ahora estoy en tu portal web. ¿Pero adivina que? No he terminado
  4. La mayoría de los usuarios comerciales reutilizan las contraseñas todo el tiempo. Así que ahora voy a tomar la contraseña de administrador y ver si puedo iniciar sesión en su propia cuenta de correo electrónico. A partir de ahí, con un poco de suerte, podría entrar en la administración de su cuenta de hosting. O tal vez nómina o cuentas bancarias. El cielo es el límite una vez que tengo su contraseña de correo electrónico, especialmente para una cuenta de administrador. Es aún mejor si el correo electrónico de la empresa está alojado por un proveedor de alojamiento en la nube (Office 365 o similar), y la contraseña de administrador que descifré me dio acceso al proveedor de alojamiento de correo electrónico. Eso me da acceso a todas las direcciones de correo electrónico de la empresa.
  5. Tal vez aunque encontré una vulnerabilidad SQLi y descargué la base de datos, pero tenían una buena seguridad de contraseña y no pude descifrar nada. Ahora empiezo a buscar vulnerabilidades XSS en su código fuente. Algunos correos electrónicos fáciles de ingeniería social y uso XSS para obtener acceso a una cuenta de administrador en el sistema sin saber su contraseña. ¿Ahora que?
  6. Apuesto a que hay áreas del sistema que un administrador puede usar para actualizar el sistema. ¿Tienen un CMS? ¿Tiene capacidades como WordPress, etc., que permiten a los administradores editar plantillas desde el portal web? Porque si es así, lo he usado para instalar una puerta trasera en la máquina para acceder directamente al sistema subyacente. Estaré atascado con los permisos de quien sea que esté ejecutando el servidor web. Esperemos que el servidor no se ejecute como root. Por lo menos, instalaré un bot de minería Monero que no comenzará durante un par de meses, una puerta trasera bien escondida, y luego comenzaré a gastar el tiempo y el dinero de su CPU para ganar dinero. A menos que tengan una copia limpia del sistema fuera del servidor en vivo (muchas compañías pequeñas no la tienen), nunca me sacarán. Quemarán innumerables cantidades de tiempo y dinero tratando de sacar este virus misterioso de su sistema que sigue regresando sin importar la frecuencia con la que comienzan a limpiarse.
  7. Mientras lo hago, instalaré un código que automáticamente me enviará las direcciones de correo electrónico y las contraseñas de todos los que inicien sesión en el portal web. Regrese al paso 4 anterior.
  8. Que el cielo los ayude si tienen algo valioso en sí mismo dentro del sistema. Números de seguridad social? ¿Tarjetas de crédito? Si guardan dicha información para sus empleados o clientes, ahora es mía.

Este no es un problema de seguridad aislado. Tales cosas nunca existen en la práctica.

5
Conor Mancone

Mucha información buena en las otras respuestas que incluyen mucha podría suceder realidad y debería tomarse en serio.

No estoy seguro de su configuración de alojamiento, pero supongamos que está en un servidor WHM con otras cuentas y la función se utiliza para obtener el contenido de /etc/passwd que incluye líneas como esta para los usuarios del sistema:

username:x:123:654::/home/username:/usr/local/cpanel/bin/noshell
username:x:123:654::/home/username:/usr/local/cpanel/bin/noshell
username:x:123:654::/home/username:/usr/local/cpanel/bin/noshell
etc...

Entonces podría para cada pase de nombre de usuario:

/home/username/public_html/wp-config.php 

Y termine con el archivo de configuración de cada sitio wp. Esto es solo un ejemplo ... en última instancia, debe hacer todo lo posible para asegurar las cosas más arriba que el código, como otra capa.

Qué debería suceder si se proporciona una ruta local como/etc/passwd a la función:

<br />
<b>Warning</b>:  file_get_contents(): open_basedir restriction in effect. File(/etc/passwd) is not within the allowed path(s): (/home/uservalue/public_html) in <b>/home/uservalue/public_html/test.php</b> on line <b>2</b><br />
<br />
<b>Warning</b>:  file_get_contents(/etc/passwd): failed to open stream: Operation not permitted in <b>/home/uservalue/public_html/test.php</b> on line <b>2</b><br />

"restricción de open_basedir vigente"

2
Chris