Eu enviei um relatório de bug para este problema e ele foi corrigido no modsecurity 2.7.2. link
Estou tentando fazer o ModSecurity 2.7.1 funcionar com um site da ASP.NET MVC 3.
A instalação foi executada sem erros e olhando para o log de eventos, o ModSecurity é
iniciando com sucesso.
Estou usando o arquivo modsecurity.conf-recommended
para definir as regras básicas.
O problema que estou tendo é que sempre que eu estou POSTando alguns dados de formulário, ele não passa pela ação do controlador (ou fichário do modelo).
Eu tenho SecRuleEngine
definido como DetectionOnly
.
Eu tenho SecRequestBodyAccess
definido como On
.
Com essas configurações, o corpo do POST nunca alcança a ação do controlador.
Se eu definir SecRequestBodyAccess
para Off
, isso é definitivamente algo a ver com como ModSecurity
encaminha os dados do corpo.
A% debug ModSecurity
mostra o seguinte (olha para mim como se todos passassem):
Second phase starting (dcfg 94b750).
Input filter: Reading request body.
Adding request argument (BODY): name "[0].IsSelected", value "on"
Adding request argument (BODY): name "[0].Quantity", value "1"
Adding request argument (BODY): name "[0].VariantSku", value "047861"
Adding request argument (BODY): name "[1].Quantity", value "0"
Adding request argument (BODY): name "[1].VariantSku", value "047862"
Input filter: Completed receiving request body (length 115).
Starting phase REQUEST_BODY.
Recipe: Invoking rule 94c620; [file "*********************"] [line "54"] [id "200001"].
Rule 94c620: SecRule "REQBODY_ERROR" "!@eq 0" "phase:2,auditlog,id:200001,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:%{reqbody_error_msg},severity:2"
Transformation completed in 0 usec.
Executing operator "!eq" with param "0" against REQBODY_ERROR.
Operator completed in 0 usec.
Rule returned 0.
Recipe: Invoking rule 5549c38; [file "*********************"] [line "75"] [id "200002"].
Rule 5549c38: SecRule "MULTIPART_STRICT_ERROR" "!@eq 0" "phase:2,auditlog,id:200002,t:none,log,deny,status:44,msg:'Multipart request body failed strict validation: PE %{REQBODY_PROCESSOR_ERROR}, BQ %{MULTIPART_BOUNDARY_QUOTED}, BW %{MULTIPART_BOUNDARY_WHITESPACE}, DB %{MULTIPART_DATA_BEFORE}, DA %{MULTIPART_DATA_AFTER}, HF %{MULTIPART_HEADER_FOLDING}, LF %{MULTIPART_LF_LINE}, SM %{MULTIPART_MISSING_SEMICOLON}, IQ %{MULTIPART_INVALID_QUOTING}, IP %{MULTIPART_INVALID_PART}, IH %{MULTIPART_INVALID_HEADER_FOLDING}, FL %{MULTIPART_FILE_LIMIT_EXCEEDED}'"
Transformation completed in 0 usec.
Executing operator "!eq" with param "0" against MULTIPART_STRICT_ERROR.
Operator completed in 0 usec.
Rule returned 0.
Recipe: Invoking rule 554bd70; [file "********************"] [line "80"] [id "200003"].
Rule 554bd70: SecRule "MULTIPART_UNMATCHED_BOUNDARY" "!@eq 0" "phase:2,auditlog,id:200003,t:none,log,deny,status:44,msg:'Multipart parser detected a possible unmatched boundary.'"
Transformation completed in 0 usec.
Executing operator "!eq" with param "0" against MULTIPART_UNMATCHED_BOUNDARY.
Operator completed in 0 usec.
Rule returned 0.
Recipe: Invoking rule 554cbe0; [file "*********************************"] [line "94"] [id "200004"].
Rule 554cbe0: SecRule "TX:/^MSC_/" "!@streq 0" "phase:2,log,auditlog,id:200004,t:none,deny,msg:'ModSecurity internal error flagged: %{MATCHED_VAR_NAME}'"
Rule returned 0.
Hook insert_filter: Adding input forwarding filter (r 5541fc0).
Hook insert_filter: Adding output filter (r 5541fc0).
Initialising logging.
Starting phase LOGGING.
Recording persistent data took 0 microseconds.
Audit log: Ignoring a non-relevant request.
Não consigo ver nada de anormal no Fiddler.
Estou usando um ViewModel
nos parâmetros da minha ação. Nenhum dado será vinculado se SecRequestBodyAccess
estiver definido como On
.
Estou até mesmo registrando todas as Request.Form.Keys e valores via log4net, mas também não estou recebendo nenhum valor.
Estou começando a me perguntar se o ModSecurity
realmente funciona com a ASP.NET MVC ou se há algum conflito com o módulo ModSecurity
http e com o fichário do modelo que está entrando em ação.
Alguém tem alguma sugestão ou alguém pode confirmar que tem ModSecurity trabalhando com um site da ASP.NET MVC?
Eu enviei um relatório de bug para este problema e ele foi corrigido no modsecurity 2.7.2. link
Então, estou alguns anos atrasado para a festa, mas estou trabalhando com problemas semelhantes e pensei em compartilhar o que encontrei.
Não é realmente um problema de MVC. pode ser um problema do IIS, embora algo parecido afete o NGINX (baseado nisso: link ) E ainda parece ser um problema na versão do ModSecurity que é instalado através do utilitário Web Platform Installer e a versão automaticamente disponível no AppService do Azure, portanto, se houver um patch disponível, ele provavelmente não será amplamente implantado .
Com base no ( link ), estou configurando:
SecStreamInBodyInspection On
.. que permite que corpos POST completamente, embora eu não encontrei qualquer indicação clara de por quê. Isso é um pouco inquietante, porque eu também não tenho certeza de quais, se houver, desvantagens lá pode ser, mas a magia parece funcionar.
Curiosamente, as regras do OWASP CRS para o ModSecurity definem o SecRequestBodyInspection, mas não o SecStreamInBodyInspection, o que sugere que esse bug não afeta todos os hosts, mas é definitivamente uma armadilha para usuários do IIS.
HTH
Tags asp.net-mvc mod-security