.png)
Estou trabalhando em um site Symfony 2 e tentando criar uma regra ModSecurity para corresponder a um URL de navegador específico. IE exemplo.com/resultados
O Symfony 2 reescreve internamente todas as solicitações para app.php usando regras em .htaccess, portanto, quando eu verifico REQUEST_URI na regra ModSecurity, ele está definido como app.php. Eu tentei qualquer outro parâmetro de servidor que parecesse relevante, mas todos são app.php ou em branco.
Existe alguma maneira de criar uma regra ModSecurity em um arquivo de configuração baseado na URL solicitada pelo navegador, e não no resultado de uma reescrita interna?
O mesmo problema parece existir com CMS como o wordpress: tudo é reescrito em index.php, então não consigo encontrar nenhuma maneira de aplicar regras modsec a uma rota específica. (Achei que, como o WP é tão comum, talvez eu consiga encontrar uma resposta procurando o mesmo problema lá.)
Responder1
Parece que posso usar a variável do servidor
THE_REQUEST
, conforme esta resposta:https://stackoverflow.com/a/27968463/160565:
Estou usando o mod_rewrite para despejar
THE_REQUEST
em uma variável de ambiente logo acima das regras do mod_security e, em seguida, combinar isso.
Conforme observado, THE_REQUEST
é uma variável do servidor Apache usada pelo mod_rewrite, não uma variável mod_security. A variável diretamente equivalente em mod_security é REQUEST_LINE
, ou seja. a primeira linha da solicitação. Isso assume a forma de uma string como:
GET /foo/bar HTTP/1.1
THE_REQUEST
A variável (mod_rewrite) não muda quando o URL é reescrito, enquanto REQUEST_URI
(mod_rewrite) muda.
No entanto, estou um pouco surpreso que a REQUEST_URI
variável (mod_security) esteja retornando a URL reescrita (talvez isso tenha a ver com a ordem das diretivas ou com o uso do mod_securityintegrado?), em vez do URL solicitado originalmente, a menos que você esteja realmente usando a REQUEST_URI
variável (mod_rewrite) (atribuindo isso a um env var?) em sua regra mod_security?
logo acima das regras mod_security...
As regras mod_security provavelmente devem estar no topo do seu arquivo, se ainda não estiverem, antes de qualquer diretiva mod_rewrite. (Embora não tenha certeza se a ordem realmente importa.)
Observe que a REQUEST_URI
variável (mod_security) não é igual à REQUEST_URI
variável (mod_rewrite), apesar de ter o mesmo nome. Notavelmente, REQUEST_URI
(mod_security) contém a string de consulta, enquanto REQUEST_URI
(mod_rewrite) não.
Referência:
ATUALIZAR:
... a
REQUEST_URI
variável (mod_security) está retornando a URL reescrita
Você pode estar executando a regra mod_security muito tarde na solicitação, ou seja. no erro phase
? Para processar oRequeridosREQUEST_URI
URL com o qual você deve compararEstágio1 ou 2 (o pedido). As fases posteriores (ou seja, 3 a 5) serão processadas em relação à resposta, o que pode explicar por que você está vendo o URL reescrito e não o URL solicitado.
O phase
está definido noAçãoargumento ou SetDefaultAction
diretriz. Por exemplo:
SecDefaultAction "log,pass,phase:2,id:4"
SecRule REQUEST_URI "attack" "phase:1,id:52,t:none,t:urlDecode,t:lowercase,t:normalizePath"
As cinco fases são:
- Cabeçalhos de solicitação (REQUEST_HEADERS)
- Corpo da solicitação (REQUEST_BODY)
- Cabeçalhos de resposta (RESPONSE_HEADERS)
- Corpo da resposta (RESPONSE_BODY)
- Registro (LOGGING)
A partir do ModSecurity versão v2.7, existem aliases para alguns números de fase:
2 - solicitação
4 - resposta
5 - registroExemplo:
SecRule REQUEST_HEADERS:User-Agent "Test" "phase:request,log,deny,id:127"
Referência:
Responder2
Parece que posso usar a variável de servidor THE_REQUEST, conforme esta resposta:https://stackoverflow.com/a/27968463/160565