Использование и исправление уязвимости обхода пути
У меня есть веб-приложение Java, работающее на Tomcat, в котором я должен использовать уязвимость обхода пути. Есть раздел (в приложении), в котором я могу загрузить ZIP-файл, который извлекается на сервере /tmp
каталог. Содержание .zip
файл не проверяется, поэтому я могу в него положить что угодно. Я пытался положить .jsp
файл в нем, и он прекрасно извлекает. Моя проблема в том, что я не знаю, как получить доступ к этому файлу как "обычный" пользователь из браузера. Я пытался войти ../../../tmp/somepage.jsp
в адресной строке, но Tomcat просто удаляет ../
и дает мне http://localhost:8080/tmp/
ресурс недоступен. Идеально было бы, если бы я мог как-то кодировать../ на пути somepage.jsp
так что он извлекается в каталоге веб-бунта в веб-приложении. Это возможно? Есть ли какие-нибудь escape-последовательности, которые могли бы перевести на ../
после извлечения?
Любые идеи будут высоко оценены.
Примечание. Это школьный проект по курсу безопасности, в котором я должен найти уязвимости и исправить их. Не пытаясь никому навредить...
2 ответа
Извините за отрицательные голоса. Безопасность очень важна, и ее нужно учить.
Вы передаете имя файла для использования?
Проверка, что сервер делает, вероятно, что-то вроде If location starts with "/tmp" then allow it
, Итак, что вы хотите сделать, это передать `/tmp/../home/webapp/"?
Другой идеей было бы посмотреть, можете ли вы создать zip-файл, в результате чего содержимое будет перемещено вверх - например, если вы установите "../" в имени файла внутри zip-файла, что произойдет? Возможно, вам придется вручную что-то изменить, если ваши почтовые инструменты не позволяют этого.
Чтобы защититься от такой уязвимости, вы ищете что-то вроде этого:
String somedirectory = "c:/fixed_directory/";
String file = request.getParameter("file");
if(file.indexOf(".")>-1)
{
//if it contains a ., disallow
out.print("stop trying to hack");
return;
}
else
{
//load specified file and print to screen
loadfile(somedirectory+file+".txt");
///.....
}
Если вы просто передадите переменную "file" в функцию loadfile без проверки, тогда кто-нибудь может создать ссылку для загрузки любого файла, который он захочет. См. https://www.owasp.org/index.php/Path_Traversal