Apache RewriteCond 未按预期捕获 QUERY_STRING 的关键字

Apache RewriteCond 未按预期捕获 QUERY_STRING 的关键字

我正在尝试为 Apache 2.4 设置一个,RewriteRule当在 中发现任何关键字时,它允许我返回 403 代码QUERY_STRING

每当有人进行一些恶意攻击时我都会尝试返回 403,例如:

wget /etc/passwd
或者wp-login

在里面QUERY_STRING

以下是我试图阻止的几个通用示例:

"GET /wp-login.php HTTP/1.1"
"GET /setup.cgi?next_file=somefile HTTP/1.1"
"GET //public/html HTTP/1.1"
"GET /wget+http://192.168.1.1:8080/etc/passwd HTTP/1.1"
"POST /admin/Login.php?user=joe&passwd=77 HTTP/1.1"
"POST /httpdir/wp-login.php?user=bob&pw=12345 HTTP/1.1"

我不知道为什么它似乎不起作用。我尝试了几种方法让它工作,但到目前为止都没有成功,这就是我发布这篇文章的原因。我确信这是一些微妙或简单的事情。

RewriteCond %{QUERY_STRING} ^/.*(wget|/etc|admin|wp-login|setup|public).*$
RewriteRule .* - [F,NC]

[更新] 我添加了几个具体示例,并添加了我想捕获的 POST 条件。非常感谢您的帮助!

答案1

RewriteCond %{QUERY_STRING} ^/.*(wget|/etc|admin|wp-login).*$
RewriteRule .* - [F,NC]

向前斜线在开头条件模式,即^/.*在查询字符串开头的文字斜杠,因此这不太可能与您尝试阻止的 URL 类型匹配。

如果你只想匹配查询字符串中任意位置的一系列关键字中的任何一个,那么你不需要字符串开头和字符串结尾的锚点或包含匹配一切 .*正则表达式两端的模式。

请尝试以下操作:

RewriteCond %{QUERY_STRING} (wget|/etc|admin|wp-login) [NC]
RewriteRule ^ - [F]

您可能确实希望指令NC上的标志RewriteCond使查询字符串匹配不区分大小写,但NC上的标志RewriteRule是多余的。

您还可以优化RewriteRule 图案通过简单地断言字符串的开始(即^),而不是匹配一切(这不必要地强制遍历 URL 路径)。你只需要RewriteRule成功 - 你不是试图匹配这里的任何东西。

此外,这些指令的顺序也很重要。任何阻止指令都应位于任何现有 mod_rewrite 指令之前。

更新:如果您只想匹配整个单词而不是部分匹配。例如,为了避免匹配“ administrator”和“wo wgetter”等,请在正则表达式中包含单词边界。例如\b(wget|/etc|admin|wp-login)\b

相关内容