Mod安全性阻止对URI路径的GET请求

时间:2016-10-14 14:16:07

标签: http get apache2 mod-security mod-security2

我需要阻止某个URI路径的GET请求。 我正在使用异常模式,但我使用直接阻止规则,我无法使规则正常工作

示例GET /secure/test/bla/bla/ 示例https://bla.bla.com/secure/test/bla/bla?www.test.com

SecRule REQUEST_URI "@streq \/secure\/test\/bla\/bla\?.+" \
 "phase:1,id:92,t:none,t:urlDecode,t:lowercase,t:normalizePath,deny,status:403,msg:'403 Access Denied',chain"
SecRule REQUEST_METHOD "@streq post" "t:none,t:lowercase"

我能用这样的reg表达式写这个吗?

SecRule REQUEST_URI "!@rx ^(:?\/secure\/test\/bla\/bla\?.+)$" \
 "phase:1,id:91,t:none,t:urlDecode,t:lowercase,t:normalizePath,deny,status:403,msg:'403 Access Denied',chain"
SecRule REQUEST_METHOD "@streq post" "t:none,t:lowercase"

这些不起作用,我无法弄清楚为什么,我是否需要以不同的方式编写正则表达式?

在secound规则中,我是否需要添加"@rx?什么是"!@rx and @rx

之间的差异

1 个答案:

答案 0 :(得分:2)

所以这是这个问题的延续:modsecurity create rule disable GET request

example GET /secure/test/bla/bla/ example
https://bla.bla.com/secure/test/bla/bla?www.test.com

我不知道这意味着什么。你能改写它更有意义吗?您是说该URL将包含其他域名?

你给出的例子有几个问题。例如这部分:

"@streq \/secure\/test\/bla\/bla\?.+"

@streq表示这是一个直字符串比较。所以你不能使用?.+部分 - 我猜这看起来是正则表达式的一部分?如果你想要一个正则表达式,那么这是默认值,所以不要包含@streq位:

"\/secure\/test\/bla\/bla\?.+"

我也不认为你需要逃避正斜线,但这样做应该没有坏处。

你也有这个:

SecRule REQUEST_METHOD "@streq post" "t:none,t:lowercase"

当您想阻止获取请求时,为什么要检查发布

  

在secound规则中,我是否需要添加" @rx?有什么不同   在"!@ rx和@rx

之间

@rx表示以下是正则表达式。正如我所说它是默认值所以并不需要包括在内,因为除非提供另一个@命令,否则将假设@rx。

!@ rx表示正则表达式应匹配 - 即将此规则应用于与此正则表达式不匹配的任何请求。

  

我能用这样的reg表达式写这个吗?

SecRule REQUEST_URI "!@rx ^(:?\/secure\/test\/bla\/bla\?.+)$" \
 "phase:1,id:91,t:none,t:urlDecode,t:lowercase,t:normalizePath,deny,status:403,msg:'403
     

Access Denied',chain"       SecRule REQUEST_METHOD" @streq post" " T:无,T:小写"

没有。这表示与第一个正则表达式匹配的任何内容都应该被阻止。

因此,阻止对/ what的POST请求。 并且GET请求/任何内容都不会被阻止。 这似乎与你想要的完全相反! 虽然仍然允许对/ secure / test / bla / bla /进行POST,因为它与第一个规则不匹配,因此允许通过。

我真的认为你需要学习ModSecurity的基础知识,因为你显然很难理解这一点。

ModSecurity规则的基本语法是:

SecRule \
  VARIABLE_TO_CHECK \
  VALUE_TO_CHECK_FOR \
  ACTION_TO_TAKE_IF_MATCHED \

使用\允许您将规则分成几个Iines以便于阅读。

例如:

SecRule \
  REQUEST_URI \
  "^/secure/test/bla/bla/.*" \
  "id:1234,deny"

将拒绝任何对/ secure / test / bla / bla /(GET和POST)的请求。

如果你想检查两个变量,那么你需要将两个不同的规则链接在一起,在这种情况下,只有当所有规则的完整链匹配时才会发生任何破坏性操作(例如拒绝) - 但令人困惑的是,第一个规则必须说明采取最终行动。

SecRule \
  REQUEST_URI \
  "^/secure/test/bla/bla/.*" \
  "id:1234,deny,chain"
 SecRule \
    REQUEST_METHOD \
    "GET"

因此,此规则将拒绝任何以/ secure / test / bla / bla /开头的任何位置的请求,这也是一个GET请求。

在构建链式规则时,它可能会很快变得混乱,因此建议您首先测试每个单独的规则以确认它是否适当阻塞,然后将它们链接在一起。

正如我之前建议的那样,我强烈建议您购买并阅读ModSecurity handbook,以教您ModSecurity的工作原理。