¿Cómo explotar esta vulnerabilidad include_once en PHP?

1

Estoy realizando un análisis estático en un código PHP y encontré esta situación:

include_once SYSTEM_PATH . 'languages/content-' . $_COOKIE ['lang'] . '.php';

Si intento piratear con esta solicitud HTTP:

GET /en-us HTTP/1.1
Host: xxxx.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Cookie: xxx=eng.php/../../../anotherfile
Connection: keep-alive

La respuesta es esta:

ErrorException: 
include_once(/export/htdocs/xxxx.com/base/languages/content-eng.php/../../../anotherfile.php): failed to open stream: No such file or directory

El archivo languages/content-eng.php existe en el servidor.
El archivo languages/../../../anotherfile.php también existe en el servidor (tengo acceso al sistema de archivos).

¿Hay alguna forma de explotar esta vulnerabilidad a través de lang cookie?

    
pregunta jyz 22.10.2014 - 16:09
fuente

3 respuestas

2

Suspiro. Aquí está el razonamiento para que yo publique un enlace en lugar de una respuesta larga. La publicación original quiere inyectar / desafectar / explotar a través de la variable lang en la cookie:

GET /en-us HTTP/1.1
Cookie: xxx=eng.php/../../../anotherfile

Luego dice que lo intentó y falló:

ErrorException: 
include_once(/export/htdocs/xxxx.com/base/languages/content-eng.php/../../../anotherfile.php): failed to open stream: No such file or directory

"No hay tal archivo o directorio" para mí significa una de algunas cosas:

1) Su recorrido del directorio está desactivado:

/export/htdocs/xxxx.com/base/languages/content-eng.php
/export/htdocs/xxxx.com/base/languages/**option1/option2/option3**/anotherfile.php

Si la estructura es exactamente igual a la anterior, no hay un período de vulnerabilidad de cruce de directorios.

2) eng.php no está lo suficientemente detallado para saber qué hace. Este tendría que ser el eslabón débil vulnerable en la cadena

Está confiando en un error, pensando: "Bueno, tengo un error, me dirijo al camino correcto"

OP: Podrías jugar un poco más con los directorios. Le dice que "no puedo encontrar este archivo", el problema se convierte en "¿qué está encontrando"? Si declara que tiene acceso a la máquina, la solución que usaría sería colocar fichas en las carpetas para determinar dónde está aterrizando :

/export/htdocs/xxxx.com/base/languages/**option1**/token1
/export/htdocs/xxxx.com/base/languages/**option1/option2**/token2
/export/htdocs/xxxx.com/base/languages/**option1/option2/option3**/token3

Luego pruebe con otro POST / GET tal vez:

Cookie: xxx=eng.php/token1
Cookie: xxx=eng.php/token2
Cookie: xxx=eng.php/token3

Cookie: xxx=eng.php/../token1
Cookie: xxx=eng.php/../token2
Cookie: xxx=eng.php/../token3

Cookie: xxx=eng.php/../../token1
Cookie: xxx=eng.php/../../token2
Cookie: xxx=eng.php/../../token3

El hecho de que haya recibido un error no significa que esté presente el recorrido del directorio. Por lo que usted sabe, es un error global que está recibiendo. El enlace inicial que envié fue para guiarlo en un idioma conocido (variable que usted controla).

EDICIÓN PARA RESTRICCIONES DE ESPACIO:

OP: " La base es /export/htdocs/yyy.com/base/. El otro archivo.php está en /export/htdocs/xxx.com/anotherfile.php"

A menos que esté malinterpretando esto:

/ export / htdocs / yyy.com / base /

/ export / htdocs / xxx.com /anotherfile.php

¿Están estos en sitios separados? Si xxx.com es su propio servidor / máquina de prueba, tengo la impresión de que está intentando explotar un LFI:

you --> modify cookie (hey, take this anotherfile.php from my machine) --> yyy.com

Nuevamente, el razonamiento de mi publicación inicial de un enlace en lugar de una respuesta. Si te referías al revés (error tipográfico):

/ export / htdocs / yyy.com / base /

/ export / htdocs / yyy .com / anotherfile.php

Luego necesitas modificar tu inserción a ../../anotherfile o mover otro archivo a:

/ export / htdocs / yyy.com / base /

    
respondido por el munkeyoto 22.10.2014 - 16:43
fuente
2

No puede leer el código PHP con un include() o require() porque estas funciones evalúan el código PHP dentro de un archivo. Si puede controlar la parte inicial de la cadena que se pasa a include () o require (), puede usar un

Para obtener un shell con esta vulnerabilidad de LFI, necesita tener una puerta trasera en el destino con una extensión .php . Idealmente, esto se haría usando otra vulnerabilidad como la carga de archivos. La inyección de bytes NULL no funciona en las versiones modernas de las funciones de archivo de PHP, por lo que está atascado con la extensión .php.

Otro patrón de ataque es incluir archivos .php existentes para exponer la funcionalidad de la aplicación existente de forma no intencionada.

    
respondido por el rook 22.10.2014 - 17:36
fuente
1

Funciona perfectamente bien para mí con eng.php/../../../anotherfile (estoy usando PHP 5.5.6-1).

  • ¿Estás seguro de que anotherfile.php está en el directorio correcto? Intente colocarlo en el mismo directorio que los archivos lang php e incluirlo allí (solo para pruebas).
  • es legible por el servidor web? (para las pruebas, puede simplemente chmod 777 file.php ).

También tenga en cuenta que, aunque la inclusión de archivos PHP debería funcionar, incluyendo otros archivos (por ejemplo, mediante el uso de un byte nulo) no funciona en las versiones más recientes de PHP .

    
respondido por el tim 22.10.2014 - 16:43
fuente

Lea otras preguntas en las etiquetas