我正在尝试为 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 指令之前。
更新:如果您只想匹配整个单词而不是部分匹配。例如,为了避免匹配“ admin
istrator”和“wo wget
ter”等,请在正则表达式中包含单词边界。例如\b(wget|/etc|admin|wp-login)\b
。