![使用 ModSecurity 和 lua 脚本阻止请求](https://linux22.com/image/687608/%E4%BD%BF%E7%94%A8%20ModSecurity%20%E5%92%8C%20lua%20%E8%84%9A%E6%9C%AC%E9%98%BB%E6%AD%A2%E8%AF%B7%E6%B1%82.png)
我有通过 ModSecurity 流动的网络流量。
在 ModSecurity 配置中,我调用了一个 Lua 脚本,该脚本对请求字符串的参数进行一些简单的分析。具体来说,它会检查跨站点脚本的证据,如果有证据,它将阻止传入流量。
ModSecurity规则引擎配置如下:
SecRuleEngine On
SecRuleScript "/path/to/lua/script/detectXSS.lua" "block"
lua脚本示例如下:
function main()
-- Retrieve script parameters
local d = m.getvars("ARGS", { "lowercase", "htmlEntityDecode" } );
-- Loop through the parameters
for i = 1, #d do
-- Examine parameter value.
if (string.find(d[i].value, "<script")) then
return ("Suspected XSS in variable " .. d[i].name .. ".");
end
end
-- Nothing wrong found.
return nil;
end
虽然可以检测并返回 XSS,但阻止功能并未发生。是否明显缺少了某些内容?任何帮助都将不胜感激。
干杯
答案1
尽管你可能认为它block
实际上并没有阻止请求。你需要使用deny
它。
原因是,这block
是一个特殊定义的操作,您可以定义如何处理它。当规则被阻止时,您可以拒绝、仅记录或重定向到错误页面。这是使用 SecDefaultAction 设置的,默认是通过规则,如下所示:https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#SecDefaultAction。虽然这似乎没有什么意义,但它也允许你做类似的事情在 OWASP CRS 中轻松打开或关闭异常评分。
因此,请将您的 SecRuleScipt 更改deny
为block
:
SecRuleEngine On
SecRuleScript "/path/to/lua/script/detectXSS.lua" "deny"
或者将默认block
操作设置为拒绝:
SecRuleEngine On
SecDefaultAction "phase:2,deny"
SecRuleScript "/path/to/lua/script/detectXSS.lua" "block"
请参阅此处了解更多详细信息block
:
https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#block