Назад | Перейти на главную страницу

Apache RewriteCond не улавливает ключевые слова, как ожидалось, для QUERY_STRING

Я пытаюсь настроить RewriteRule для Apache 2.4, который позволяет мне возвращать код 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, которые тоже хотел бы уловить. Спасибо большое за вашу помощь!

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

В вперед косая черта в начале CondPattern, т.е. ^/.* - это буквальная косая черта в начале строки запроса, поэтому она вряд ли будет соответствовать типу URL-адреса, который вы пытаетесь заблокировать.

Если вы просто хотите сопоставить любое из серии ключевых слов в любом месте строки запроса, тогда вам не нужны якоря начала и конца строки или охватывающие соответствовать всему .* шаблоны на обоих концах регулярного выражения.

Вместо этого попробуйте следующее:

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

Вы, вероятно, хотите NC флаг на RewriteCond директива, чтобы строка запроса соответствовала регистронезависимости, но NC флаг на RewriteRule лишнее.

Вы также можете оптимизировать RewriteRule шаблон просто заявив начало строки (т.е. ^), скорее, чем соответствие все (что излишне заставляет обход URL-пути). Вам нужен только RewriteRule быть успешным - вы не пытаетесь соответствие что-нибудь здесь.

Также имеет значение порядок этих директив. Любая директива блокировки должна быть перед любыми существующими директивами mod_rewrite.

ОБНОВИТЬ: Если вы хотите сопоставить только слова целиком, а не частичные совпадения. например. Чтобы избежать совпадения "adminистратор "и" wowgetter "и т. д., а затем включить границы слов в регулярное выражение. \b(wget|/etc|admin|wp-login)\b.