
Laboratorio basado en Docker que demuestra la vulnerabilidad de análisis de URI de Nginx CVE-2013-4547 con explotación paso a paso para elusión de privilegios y ejecución de código.
Versiones afectadas: Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7
Enlaces de referencia:
Esta vulnerabilidad no está directamente relacionada con la ejecución de código; su causa principal es el análisis incorrecto del URI de la solicitud, lo que lleva a obtener erróneamente el nombre del archivo solicitado por el usuario, provocando consecuencias como la omisión de permisos o la ejecución de código.
Por ejemplo, cuando Nginx coincide con una solicitud que termina en .php, la envía a fastcgi para su análisis. Una configuración típica sería:
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT /var/www/html;
}
En condiciones normales (con pathinfo desactivado), solo los archivos con extensión .php se envían a fastcgi para su análisis.
Sin embargo, con CVE-2013-4547, si solicitamos 1.gif[0x20][0x00].php, este URI coincide con la expresión regular \.php$ y puede entrar en este bloque de location; pero una vez dentro, Nginx interpreta erróneamente que el archivo solicitado es 1.gif[0x20], y lo establece como el valor de SCRIPT_FILENAME para enviarlo a fastcgi.
fastcgi analiza según el valor de SCRIPT_FILENAME, lo que finalmente provoca una vulnerabilidad de análisis.
Por lo tanto, solo necesitamos subir un archivo cuyo nombre termine en espacio para que PHP lo analice.
Otro ejemplo: muchos sitios restringen las IP que pueden acceder al panel de administración:
location /admin/ {
allow 127.0.0.1;
deny all;
}
Podemos solicitar el siguiente URI: /test[0x20]/../admin/index.php. Este URI no coincide con /admin/ en la directiva location, por lo que se omite la verificación de IP; pero finalmente se solicita el archivo /test[0x20]/../admin/index.php, es decir, /admin/index.php, logrando acceder al panel de administración. (Esto requiere que exista un directorio llamado test : es una característica de Linux. Si el directorio no existe, incluso al saltar al directorio padre, se producirá un error de archivo inexistente; en Windows no existe esta restricción.)
Iniciar el entorno vulnerable:
docker-compose build
docker-compose up -d
Una vez iniciado el entorno, visite http://your-ip:8080/ para ver una página de subida de archivos.
Este entorno utiliza una lista negra de validación: no podemos subir archivos con extensión .php, por lo que debemos aprovechar CVE-2013-4547. Subimos un archivo llamado 1.gif (observe el espacio al final):

Acceda a http://your-ip:8080/uploadfiles/1.gif[0x20][0x00].php y verá que PHP ha sido analizado:

Tenga en cuenta que [0x20] es un espacio y [0x00] es \0. Estos dos caracteres no necesitan codificación.