Предотвращение доступа к WEB-INF из JSP

Я работаю над некоторыми предупреждениями безопасности на одном из наших серверов, в результате чего JSP-файл "загрузки файла" позволяет пользователю загружать содержимое WEB-INF для веб-приложения (которое находится в корневой папке сайта). Это очень грубо простой файл, написанный в 2007 году, который использует java.io.FileInputStream при неанализованном вводе для возврата файла пользователю.

В предупреждении фактически указывалось, что это проблема обхода каталога, которая устраняется одним способом, так как следующий URI загрузит файл web.xml для пользователя:

http://domain.com/filedownload.jsp?filename=../../WEB-INF/web.xml&filepath=some/directory/

Теперь очевидно, что часть "обратного хода в каталогах" должна быть исправлена ​​с помощью очистки входных данных пользователя (чего этот сценарий еще не делает). Тем не менее, следующий URI также доставляет web.xml пользователю, но входная очистка для обхода каталога здесь не поможет, если только проверка очистки для "WEB-INF" и других "нелегальных" каталогов...

http://domain.com/filedownload.jsp?filename=web.xml&filepath=WEB-INF/

Существует ли стандартизированный способ предотвратить это в обычных контейнерах сервлетов, или разработчик кода должен полностью этим управлять? Я заметил, что функция Java 'normalize()' не удаляет этот каталог из пользовательского ввода.

Я попытался найти ответ на этот вопрос, но все, что я мог найти, это информацию о том, как напрямую запретить "обслуживание" WEB-INF, но ничего о том, как предотвратить доступ к нему из самого файла JSP.

Спасибо,

Том...

1 ответ

Решение

Вы говорите, что страница JSP использует java.io.FileInputStream для чтения файла. Это стандартный класс Java, который не знает о том факте, что он работает внутри контейнера сервлета.

Таким образом, java.io.FileInputStream сможет получить доступ к любому файлу, к которому может обратиться пользовательский процесс, в котором выполняется контейнер сервлета (JVM). В контейнере сервлетов вы ничего не можете настроить, чтобы предотвратить это.

Возможно, вы захотите убедиться, что файлы в других областях файловой системы, совершенно не связанных с контейнером сервлета, не могут быть доступны, например, "/etc/passwd".

Предполагая, что вы работаете в Linux, что делает этот URL:

http://domain.com/filedownload.jsp?filename=passwd&filepath=/etc/

Если он вернет файл, у вас есть большая проблема! Возможно, защитное программное обеспечение (не уверенное, что вы используете?), Создавшее предупреждения, предотвратит загрузку. В противном случае могут помочь разрешения на доступ к файлам операционной системы, если веб-сервер не работает под учетной записью root или другой привилегированной учетной записью, но это только кратковременное экстренное исправление.

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

При использовании java.io.FileInputStream автор / сопровождающий страницы JSP отвечает за доступ только к допустимым путям.

Другие вопросы по тегам