
Laboratório baseado em Docker demonstrando a vulnerabilidade de parsing de URI no Nginx CVE-2013-4547 com exploração passo a passo para bypass de privilégios e execução de código.
Versões afetadas: Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7
Links de referência:
Esta vulnerabilidade não está realmente relacionada à execução de código; sua principal causa é a análise incorreta do URI da solicitação, obtendo erroneamente o nome do arquivo solicitado pelo usuário, resultando em consequências como bypass de permissões e execução de código.
Por exemplo, quando o Nginx corresponde a uma solicitação que termina em .php, ele a envia para o fastcgi para análise. A configuração comum é a seguinte:
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;
}
Em circunstâncias normais (com pathinfo desabilitado), apenas arquivos com extensão .php são enviados para o fastcgi.
Na presença do CVE-2013-4547, quando solicitamos 1.gif[0x20][0x00].php, este URI corresponde à expressão regular \.php$ e pode entrar no bloco Location; porém, após entrar, o Nginx erroneamente considera que o arquivo solicitado é 1.gif[0x20] e define seu valor como SCRIPT_FILENAME para enviar ao fastcgi.
O fastcgi analisa de acordo com o valor de SCRIPT_FILENAME, resultando em uma vulnerabilidade de parsing.
Portanto, basta fazer upload de um arquivo com um espaço no final para que o PHP o analise.
Outro exemplo: muitos sites restringem o acesso ao backend por IP:
location /admin/ {
allow 127.0.0.1;
deny all;
}
Podemos solicitar o seguinte URI: /test[0x20]/../admin/index.php. Este URI não corresponde ao /admin/ no location, contornando a verificação de IP; mas no final o arquivo solicitado é /test[0x20]/../admin/index.php, ou seja, /admin/index.php, conseguindo acessar o backend com sucesso. (Isso requer que exista um diretório chamado test : é uma característica do Linux; se o diretório não existir, mesmo com o redirecionamento para o nível acima, ocorrerá um erro de arquivo inexistente. No Windows, essa restrição não existe.)
Inicie o ambiente vulnerável:
docker-compose build
docker-compose up -d
Após iniciar o ambiente, acesse http://your-ip:8080/ para ver uma página de upload.
Este ambiente utiliza validação de lista negra; não podemos fazer upload de arquivos com extensão .php, precisamos explorar o CVE-2013-4547. Faça upload de um arquivo 1.gif , observe o espaço no final:

Acesse http://your-ip:8080/uploadfiles/1.gif[0x20][0x00].php e você verá que o PHP foi interpretado:

Nota: [0x20] é um espaço, [0x00] é \0. Esses caracteres não precisam ser codificados.