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"

Я понятия не имею, почему это не работает. Я пробовал несколько вещей, чтобы заставить его работать, но пока безуспешно, поэтому я публикую. Я уверен, что это что-то тонкое или легкое.

RewriteCond %{QUERY_STRING} ^/.*(wget|/etc|admin|wp-login|setup|public).*$
RewriteRule .* - [F,NC]
1
задан 28 March 2020 в 22:19
1 ответ
 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 istrator» и «wo wget ter» и т. Д., Включите границы слов в регулярное выражение. например. \ b (wget | / etc | admin | wp-login) \ b .

0
ответ дан 30 March 2020 в 00:20

Теги

Похожие вопросы