Использование и исправление уязвимости обхода пути

У меня есть веб-приложение 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

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