regex ModSecurity正则表达式模式中反斜杠的混淆

r1wp621o  于 2023-10-22  发布在  其他
关注(0)|答案(1)|浏览(145)

我想匹配ModSecurity中名为usr/bin/的参数。
我测试了下面的规则,并确认它匹配(假设参数的值是abc):
SecRule ARGS:/usr\\\/bin\\\// "@streq abc" "id:123,status:400,deny"
据我所知,这是可行的,因为在模式被输入正则表达式引擎之前,\\\被简化为\\(我认为这只是C/C++的一个特性,PHP的行为也是如此)。然后,正则表达式引擎将\\解释为单个\,这反过来又会转义后面的/,因此不会发生未转义的错误。
如果是这样的话,我希望下面的规则也能匹配:
SecRule ARGS:/usr\\\\/bin\\\\// "@streq abc" "id:123,status:400,deny"
但我的测试结论是它没有。为什么第二条规则不匹配?我对反斜杠的理解是正确的吗?

k7fdbhmy

k7fdbhmy1#

据我所知,这是可行的,因为在模式被输入到正则表达式引擎之前,\被简化为\(我认为这只是C/C++的一个特性,PHP的行为也是如此)。
不,这是一个引擎(ModSecurity)功能。请查看文档:

  • 有时你需要查看一个参数数组,每个参数的名称略有不同。在这种情况下,您可以在选择运算符本身中指定正则表达式。下面的规则将查找所有名称开始以id开头的参数:*

SecRule ARGS:/^id_/ dirty "id:11"
因此,/.../表示法用于表示集合中的正则表达式。
如果是这样的话,我希望下面的规则也能匹配:
SecRule ARGS:/usr\\/bin\\// "@streq abc" "id:123,status:400,deny"
但我的测试结论是它没有。为什么第二条规则不匹配?我对反斜杠的理解是正确的吗?
请再次检查您的结果和其他设置。这条规则对我有效。我在测试环境中设置了这个规则,并尝试了一下:

$ curl -v -X POST -d "usr/bin/=abc" "http://localhost"
...
< HTTP/1.1 400 Bad Request
< Date: Mon, 16 Oct 2023 07:38:17 GMT
< Server: Apache/2.4.56 (Debian)
< Content-Length: 301
< Connection: close
< Content-Type: text/html; charset=iso-8859-1
< 
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
...

在我的日志中有这样几行:
error.log:

[client ::1:40376] [client ::1] ModSecurity: Access denied with code 400 (phase 2). String match "abc" at ARGS:usr/bin/....

在debug.log中:

Rule 7f9f36829440: SecRule "ARGS:/usr\\/bin\\//" "@streq abc" "phase:2,log,auditlog,id:123,status:400,deny"
Transformation completed in 0 usec.
Executing operator "streq" with param "abc" against ARGS:usr/bin/.
Target value: "abc"
Operator completed in 0 usec.
Rule returned 1.

所以我认为你的规则是你所期望的。
我也尝试了这个请求的规则:

curl -v -X POST -d "usr/bin/less=abc" "http://localhost"

这也同样有效。

相关问题