Почему существует риск безопасности для кодирования косой черты в URI?

У меня есть ситуация, когда я хочу закодированные косые черты в URI ( %2F ), но мои правила .htaccess игнорируются, когда я делаю запрос, отправляя вместо этого на страницу 404. Я быстро нашел директиву Apache AllowEncodedSlashes , который я планирую включить, но я до сих пор не понимаю, почему это риск безопасности в первую очередь. Не могли ли кто-либо вручную преобразовать закодированные косые черты в реальные косые черты, если они пытались быть гнусными? (Хотя я не вижу, какой вред они могут сделать …)

Приложение, которое я тестирую, написано на PHP, а правило mod_rewrite, которое взаимодействует с ним, выглядит так:

 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^test/(.*)$ /test.php?_escaped_fragment_=$1 [NE,QSA,L] 

Я просто хочу убедиться, что понимаю риски перед тем, как продолжить.


Чтобы уточнить: Apache не разрешает кодированные косые черты в пути , но они разрешены в строке запроса. Строка запроса так же восприимчива к эксплоитам, перечисленным ниже Кристианом («Удаленное выполнение кода, доступ к локальному файлу и обход каталога»).

Итак, почему ASF зашел так далеко, что создал специальную директиву, чтобы позволить это поведение? Я не пытаюсь быть трудным, я просто не понимаю. Я думаю, само собой разумеется, что любой пользовательский ввод (включая URI) должен быть проверен перед его использованием в любой функции базы данных или файловой системы.

Я бы подумал, что использовать экранированные косые черты в любом месте URL-адреса, если оправдано экранирование. Например, пример, приведенный в следующем (соответствующем) вопросе, является очень разумным:

Является косой чертой ("/"), эквивалентной закодированной косой чертой ("% 2F") в части пути HTTP-URL

Что касается того, почему он по умолчанию отключается … эта запись в блоге с 2003 года предполагает, что она должна «защищать хромовые скрипты CGI от себя»:

http://ken.coar.org/burrow/Apache_2f_encoding_decoding_and_security

Некоторые неосторожные практики, вероятно, приводят некоторых людей к тому, чтобы оказаться в кодовой базе со строкой, в которой они не уверены, стоит ли игнорировать или нет. Поэтому они освобождают его «просто для того, чтобы быть в безопасности». Но это может произойти после того, как предполагается, что символов пути нет … и он передается в некоторый исполняемый контекст, который полагал, что он выполнил всю проверку, в которой это необходимо.

Поэтому, если вы используете рекомендуемые методы большинства современных веб-фреймворков, я сомневаюсь, что это серьезная проблема, и вы можете без проблем использовать AllowEncodedSlashes.

Честно говоря, я не вижу никаких проблем с безопасностью, но я должен признать, что я не работал в этой области. Тем не менее, это правило все еще неверно.

Вы должны перенаправить на файл обработчика (php script), который анализирует $_SERVER['REQUEST_URI'] вместо передачи через $_GET . Это главным образом, чтобы избежать проблем, которые вы обычно получаете с некодированным контентом.

С другой стороны, вы можете запустить брандмауэр веб-приложений с правилом против передачи косой черты через URI. Это связано с тем, что это поведение часто связано с удаленным выполнением кода , локальным доступом к файлам и обращением к каталогам . Это, однако, является мерой предосторожности, которую вы действительно не должны полагаться в первую очередь.

Пример использования PoC:

 include 'languages/'.$_GET['lang']; // hacker may pass ../ to move around.