更新 Apache Mod 安全核心规则 OWASP 规则 950120 以允许在一个特定输入中使用 URL

Updating Apache Mod Security Core Rule OWASP Rule 950120 to allow URLs in one specific input

我的表单中有一个输入字段,用户可以在其中输入 url 个地址。我知道如何更新目标规则以防止误报:

SecRuleRemoveById 950120 !ARGS:urlField

但这不适用于规则 950120Possible Remote File Inclusion (RFI) Attack: Off-Domain Reference/Link。该错误没有指出违反规则的参数。它只是给出消息:

Message: Access denied with code 403 (phase 2). 
Match of "beginsWith %{request_headers.host}" against "TX:1" required. 
[file "/etc/httpd/crs-tecmint/owasp-modsecurity-crs/base_rules/modsecurity_crs_40_generic_attacks.conf"] 
[line "163"] [id "950120"] [rev "3"] 
[msg "Possible Remote File Inclusion (RFI) Attack: Off-Domain Reference/Link"] 
[data "Matched Data: http://asite.com.hk/live found within TX:1: asite.com.hk/live"] 
[severity "CRITICAL"] [ver "OWASP_CRS/2.2.9"] 
[maturity "9"] [accuracy "9"] 
[tag "OWASP_CRS/WEB_ATTACK/RFI"]
Action: Intercepted (phase 2)

如果消息中没有违规参数,是否意味着 SecRuleRemoveById 不适用于此规则?如何在不完全删除此规则的情况下更新它?

规则可以在这里看到: https://raw.githubusercontent.com/SpiderLabs/owasp-modsecurity-crs/master/base_rules/modsecurity_crs_40_generic_attacks.conf 我也复制了下面:

SecRule ARGS "^(?:ht|f)tps?://(.*)$" \
    "chain,phase:2,rev:'3',ver:'OWASP_CRS/2.2.9',maturity:'9',accuracy:'9',t:none,capture,ctl:auditLogParts=+E,block,msg:'Possible Remote File Inclusion (RFI) Attack: Off-Domain Reference/Link',logdata:'Matched Data: %{TX.0} found within %{MATCHED_VAR_NAME}: %{MATCHED_VAR}',id:'950120',severity:'2',tag:'OWASP_CRS/WEB_ATTACK/RFI'"
   SecRule TX:1 "!@beginsWith %{request_headers.host}" "setvar:'tx.msg=%{rule.msg}',setvar:tx.anomaly_score=+%{tx.critical_anomaly_score},setvar:tx.%{rule.id}-OWASP_CRS/WEB_ATTACK/RFI-%{matched_var_name}=%{tx.1}"

所以这是一个链式规则,分为两部分。第一条规则检查参数是否以 http:// 或 https:// 或 ftp:// 或 ftps:// 开头。由于它在 regexpr 模式匹配中使用括号,因此它还设置了 TX 变量。 TX:0设置为ht或ft,TX:1设置为协议后的地址。

链中的下一条规则,检查 TX:1 是否不以请求中给定的主机 header 开头(应该是该服务器的主机)。如果是这样,它就是异地 URL 并且会阻塞。

所以你的修复:

SecRuleRemoveById 950120 !ARGS:urlField

将不起作用,因为 1) 如果您认为您打算更新规则而不是将其删除,那么您使用了错误的命令,并且 2) urlField 可能是 ARG_NAME 而不是 ARG 值。所以请尝试以下操作:

SecRuleUpdateTargetByID 950120 !ARG_NAMES:urlField

或者您可以使用另一条规则有选择地删除此规则,例如仅关闭 /post/location URL 的规则,使用以下内容:

SecRule REQUEST_URI /post/location/ "id:1000,phase:2,log,ctrl:ruleRemoveByID=950120"

现在,老实说,我认为规则 950120 有点限制,对大多数网站来说有点矫枉过正,可能会导致很多误报,所以您可以完全关闭它:

SecRuleRemoveById 950120

巴里,你的回答有一点错误。该行:

SecRule REQUEST_URI /post/location/ "id:1000,phase:2,log,ctrl:ruleRemoveByID=950120"

产生以下内容:错误解析操作:未知操作:ctrl

正确的行是

SecRule REQUEST_URI /post/location/ "id:1000,phase:2,log,ctl:ruleRemoveByID=950120"

除此之外:太好了,谢谢!帮了我大忙。我会评论但没有足够的声誉。我想给你发消息,但你似乎不接受消息。