RETURN_TO_BASE
LANG_SELECT:
Bug Bounty 2026-05-15 @reeshasx

WAF_EVASION_LOGS: Bypassing Enterprise Filters on High-Value Targets

WAF_EVASION_LOGS: Bypassing Enterprise Filters on High-Value Targets

WAF_EVASION_LOGS: Bypassing Enterprise Filters on High-Value Targets

[ 0x00 ] O MITO DA CAIXA INVIOLÁVEL

Todo mundo acha que empresas grandes têm defesas perfeitas. Quando você esbarra num WAF (Web Application Firewall) da Akamai, Cloudflare Enterprise ou Imperva num alvo gigante (como foi o caso da Coinbase que eu reportei), a tela de 403 Forbidden parece uma parede de concreto.

Mas o lance é o seguinte: WAFs não são mágicos. Eles são gigantescas coleções de Regex (expressões regulares) tentando entender tráfego web na força bruta. E se tem uma coisa que aprendi caçando bugs, é que onde tem parsing complexo, tem confusão.

[ 0x01 ] DESYNC: QUEM ESTÁ LENDO O QUÊ?

A chave para o bypass é causar uma dessincronização entre o que o WAF entende e o que o servidor Backend (a aplicação real) entende. O WAF bloqueia a palavra UNION SELECT. Mas e se você mandar U%6eION S%45LECT? - Se o WAF decodificar a URL apenas uma vez antes de validar, ele vê o texto com porcentagem e deixa passar. - Se a aplicação no backend decodificar uma segunda vez antes de executar no banco, o payload vira UNION SELECT novamente. - Boom. Bypass clássico de double-encoding.

[ 0x02 ] POLUIÇÃO DE PARÂMETROS (HPP)

Um dos meus favoritos. O que acontece se você enviar dois parâmetros com o mesmo nome na URL? GET /api/user?id=1&id=UNION SELECT...

  • A tecnologia A (ex: PHP) pega apenas o último valor.
  • A tecnologia B (ex: JSP/Tomcat) pega o primeiro valor.
  • A tecnologia C (ex: ASP.NET) concatena os dois.

Se o WAF for configurado para validar apenas o primeiro parâmetro, mas a aplicação em Node.js ler o último, o WAF vai validar o id=1 (que é seguro) e ignorar o payload venenoso no final. O backend, inocente, vai engolir o SQLi. É como passar com o contrabando por trás das costas do segurança.

[ 0x03 ] O CASO OPENRESTY

Num dos meus achados de recompensa (Bug Bounty), eu esbarrei num WAF bem parrudo. Toda tentativa direta de LFI ou XSS era sumariamente assassinada.

Comecei a fuzilar headers exóticos HTTP na requisição. X-Forwarded-Host, X-Rewrite-URL, Client-IP. A maioria dos WAFs são configurados para processar a URI original, mas os proxies reversos no meio do caminho podem alterar a requisição com base nesses headers se estiverem mal configurados.

Ao injetar um payload ofuscado num cabeçalho de proxy mal normalizado, consegui fazer o load balancer interno me cuspir não a página padrão de erro do WAF, mas sim uma página de debug do OpenResty. Eu expus a versão exata do proxy deles e as regras de roteamento internas simplesmente porque o filtro não cobria a combinação exata de caracteres unicode num header não-padrão.

[ 0x04 ] MINDSET DE CAÇADOR

Bypass de WAF raramente é usar ferramentas automatizadas como o sqlmap --tamper. Isso faz barulho e te dá um block de IP rápido.

Bypass é arte analítica. É bater na porta com uma letra minúscula, depois maiúscula, depois com espaço, depois com %00 (null byte), e ver como a resposta muda. É fazer o parser do WAF desistir por timeout ou confusão e deixar o pacote passar pro backend.

[ 0x05 ] TRANSFER-ENCODING: CHUNKED

Se você quer confundir WAFs antigos, essa é clássica. Quando enviamos dados HTTP via POST, geralmente dizemos o tamanho total no Content-Length. Mas o HTTP/1.1 permite enviar em "pedaços" usando o cabeçalho Transfer-Encoding: chunked. A mágica aqui é que muitos WAFs têm um limite de quantos "chunks" eles vão analisar antes de desistir (para economizar CPU).

Se você enviar:

POST /api/upload HTTP/1.1
Transfer-Encoding: chunked

1
<
1
s
1
c
1
r
... 

O backend vai montar a string <script>... pedaço por pedaço e executar o XSS no banco, enquanto o WAF corporativo talvez não tenha re-montado o payload corretamente, olhando para blocos isolados inofensivos.

[ 0x06 ] NORMALIZAÇÃO UNICODE

Outro vetor assustador são os caracteres unicode que "se parecem" visualmente com letras, mas têm códigos hexadecimais diferentes. No padrão Unicode, a letra K (Kelvin) não é a letra K maiúscula normal K.

O WAF olha para SELECKT e diz: "Isso não é um comando SQL, bloqueio não necessário." Mas quando isso entra no backend (um banco MySQL com charset utf8mb4 mal configurado, por exemplo), a engine do banco realiza a "normalização". Ela converte para o clássico K maiúsculo. De repente, seu pacote inofensivo vira um SELECT monstruoso extraindo senhas.

Dica de Ouro: Caçar falhas em filtros não é sobre encontrar o payload mais complexo do Github. É entender perfeitamente a cadeia de tecnologias (Load Balancer -> WAF -> Proxy -> Backend -> Database) e achar onde a conversão de dados difere. A defesa corporativa é focada em padrões conhecidos. Seja o padrão desconhecido e o WAF se tornará cego.

#waf #bug-bounty #evasion #openresty #headers
ID: waf-evasion-logs
RYSHA DATABASE CORE SYSTEM // STANDALONE_VIEWER_PROTOCOL_ACTIVATED