ModSecurity SecRule 基于原始浏览器 URL,而不是内部重写(index.php、app.php 等)

ModSecurity SecRule 基于原始浏览器 URL,而不是内部重写(index.php、app.php 等)

我正在开发一个 Symfony 2 网站,并尝试创建一个 ModSecurity 规则来匹配特定的浏览器 URL。IE example.com/results

Symfony 2 使用 .htaccess 中的规则在内部重写对 app.php 的所有请求,因此当我在 ModSecurity 规则中检查 REQUEST_URI 时,它被设置为 app.php。我尝试了任何其他看似相关的服务器参数,但都是 app.php 或空白。

有没有办法在配置文件中创建基于浏览器请求的 URL 而不是内部重写的结果的 ModSecurity 规则?

CMS(如 wordpress)似乎也存在同样的问题:所有内容都被重写为 index.php,因此我找不到任何方法将 modsec 规则应用于特定路由。(我想,由于 WP 非常常见,我可能能够通过在那里搜索相同的问题来找到答案。)

答案1

看起来我可以使用服务器变量THE_REQUEST,按照这个答案:https://stackoverflow.com/a/27968463/160565

我正在使用 mod_rewrite 将其转储THE_REQUEST到 mod_security 规则上方的环境变量中,然后对其进行匹配。

如上所述,THE_REQUEST是 mod_rewrite 使用的 Apache 服务器变量,而不是 mod_security 变量。mod_security 中直接等效的变量是REQUEST_LINE,即请求的第一行。它采用如下字符串形式:

GET /foo/bar HTTP/1.1

THE_REQUEST当 URL 重写时,(mod_rewrite) 变量不会改变,而REQUEST_URI(mod_rewrite) 会改变。

然而,我有点惊讶的是REQUEST_URI(mod_security)变量返回的是重写的 URL(这可能与指令的顺序或使用 mod_security 有关嵌入?),而不是最初请求的 URL,除非您实际上REQUEST_URI在 mod_security 规则中使用了(mod_rewrite)变量(将其分配给环境变量?)?

就在 mod_security 规则之上......

mod_security 规则可能应该位于文件顶部(如果尚未位于顶部),位于任何 mod_rewrite 指令之前。(虽然我不确定顺序是否真的很重要。)

请注意,尽管名称相同,但REQUEST_URI(mod_security) 变量与 (mod_rewrite) 变量并不相同。值得注意的是, (mod_security) 包含查询字符串,而(mod_rewrite) 不包含。REQUEST_URIREQUEST_URIREQUEST_URI

参考:


更新:

... REQUEST_URI(mod_security) 变量正在返回重写的 URL

您可能在请求中运行 mod_security 规则太晚了,即在错误的phase?要处理请求您应该比较的 URLREQUEST_URI阶段1 或 2(请求)。后续阶段(即 3 - 5)将根据响应进行处理,这也许可以解释为什么您看到的是重写的 URL,而不是请求的 URL。

设置phase行动参数或SetDefaultAction指令。例如:

SecDefaultAction "log,pass,phase:2,id:4"
SecRule REQUEST_URI "attack" "phase:1,id:52,t:none,t:urlDecode,t:lowercase,t:normalizePath"

这五个阶段是:

  1. 请求标头(REQUEST_HEADERS)
  2. 请求正文(REQUEST_BODY)
  3. 响应标头(RESPONSE_HEADERS)
  4. 响应主体(RESPONSE_BODY)
  5. 日志记录 (LOGGING)

从 ModSecurity 版本 v2.7 开始,一些阶段编号有别名:

2 - 请求
4 - 响应
5 - 记录

例子:

SecRule REQUEST_HEADERS:User-Agent "Test" "phase:request,log,deny,id:127"

参考:

答案2

看起来我可以使用服务器变量 THE_REQUEST,按照这个答案:https://stackoverflow.com/a/27968463/160565

相关内容