Трюки с произвольной загрузкой файлов в Java
Результаты нормализации имени файла зависят от реализации различных JAR библиотек и личных привычек разработчиков. Это можно использовать для обхода средств защиты. Ниже представлены способы загрузки файла с именем pyn3rd.jsp
для некоторых популярных методов:
getSubmittedFileName()
Для данного метода достаточно поместить обратный слеш в имя файла:filename="pyn3rd.j\sp"
После нормализации на сервер загрузится файл с именем pyn3rd.jsp
.Кроме обратного слеша, можно оставить параметр
filename
без закрывающей двойной кавычки и поместить в конце расширения произвольный символ:filename="pyn3rd.\jspz
2. Метод
getOriginalFilename()
Этот метод позволяет получить имя файла напрямую без изменений. Однако, когда мы используем другой метод StringUtils.cleanPath()
для нормализации имени файла, которое принимает метод getOriginalFilename()
появляется особенность, позволяющая обойти проверку имени:filename="pyn3rd.jsp/./././."
3. Метод Apache commons-fileupload/commons-io
Добавляем в конце имени файла /
или /[ПРОБЕЛ]
или /
c другими нулевыми значениями (\r
, \n
и т.д.)filename="pyn3rd.jsp/"
Кроме того, если вставить символы после /
или /[ПРОБЕЛ]
, то все, что после слеша, будет принято за имя файла.filename="pyn3rd.jsp/a"
Ссылка на блог