Proxy / WAF Protections Bypass
Bypass de Regras ACL do Nginx com Manipulação de Nomes de Caminho
Técnicas desta pesquisa.
Exemplo de regra do Nginx:
Para evitar bypasses, o Nginx realiza a normalização de caminho antes de verificá-lo. No entanto, se o servidor backend realizar uma normalização diferente (removendo caracteres que o nginx não remove), pode ser possível contornar essa defesa.
NodeJS - Express
Versão do Nginx | Caracteres de Bypass do Node.js |
1.22.0 |
|
1.21.6 |
|
1.20.2 |
|
1.18.0 |
|
1.16.1 |
|
Flask
Versão do Nginx | Caracteres de Bypass do Flask |
1.22.0 |
|
1.21.6 |
|
1.20.2 |
|
1.18.0 |
|
1.16.1 |
|
Spring Boot
Versão do Nginx | Caracteres de Bypass do Spring Boot |
1.22.0 |
|
1.21.6 |
|
1.20.2 |
|
1.18.0 |
|
1.16.1 |
|
PHP-FPM
Configuração do Nginx FPM:
Nginx está configurado para bloquear o acesso a /admin.php
, mas é possível contornar isso acessando /admin.php/index.php
.
Como prevenir
Bypassar Regras do Mod Security
Confusão de Caminho
Neste post é explicado que o ModSecurity v3 (até 3.0.12), implementou de forma inadequada a variável REQUEST_FILENAME
que deveria conter o caminho acessado (até o início dos parâmetros). Isso ocorreu porque ele realizava um decode de URL para obter o caminho.
Portanto, uma solicitação como http://example.com/foo%3f';alert(1);foo=
no mod security suporá que o caminho é apenas /foo
porque %3f
é transformado em ?
terminando o caminho do URL, mas na realidade o caminho que o servidor receberá será /foo%3f';alert(1);foo=
.
As variáveis REQUEST_BASENAME
e PATH_INFO
também foram afetadas por esse bug.
Algo semelhante ocorreu na versão 2 do Mod Security que permitia contornar uma proteção que impedia o usuário de acessar arquivos com extensões específicas relacionadas a arquivos de backup (como .bak
) simplesmente enviando o ponto codificado em URL em %2e
, por exemplo: https://example.com/backup%2ebak
.
Bypassar AWS WAF ACL
Cabeçalho Malformado
Esta pesquisa menciona que era possível contornar as regras do AWS WAF aplicadas nos cabeçalhos HTTP enviando um cabeçalho "malformado" que não era corretamente analisado pela AWS, mas sim pelo servidor backend.
Por exemplo, enviando a seguinte solicitação com uma injeção de SQL no cabeçalho X-Query:
Foi possível contornar o AWS WAF porque ele não entendia que a próxima linha fazia parte do valor do cabeçalho, enquanto o servidor NODEJS entendia (isso foi corrigido).
Referências
Last updated