• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Трюки с произвольной загрузкой файлов в Java

вавилонец

CPU register
Пользователь
Регистрация
17.06.2021
Сообщения
1 116
Реакции
1 265
ОРИГИНАЛЬНАЯ СТАТЬЯ
ПЕРЕВЕДЕНО СПЕЦИАЛЬНО ДЛЯ xss.pro
$600 на SSD для Jolah Molivski ---> 0x5B1f2Ac9cF5616D9d7F1819d1519912e85eb5C09 для поднятия ноды ETHEREUM и тестов

0x01 Предисловие

Недавно в Интернете я увидел несколько дискуссий о произвольной загрузке файлов в среде Java. Основным вопросом является то, как обойти определение имени файла при загрузке произвольного файла.
Поэтому я пишу эту статью для того, чтобы рассказать об этих трюках.
0x02 Сочные трюки

Использование метода getSubmittedFileName для получения имени файла

Когда мы используем оригинальный сервлет для разработки функции загрузки файлов в многочастном формате на Java, метод getSubmittedFileName() часто используется для получения имени файла, особенно в ранних Java-приложениях. Но с этим методом связана потенциальная проблема.
Мы можем отладить код, чтобы проанализировать ее. Сначала установите точку останова на getSubmittedFileName, затем перейдите к следующему методу HttpParser.unquote(), здесь происходит получение имени файла.

1663211919366.png


Во время отладки кода можно обнаружить, что когда имя файла содержит \, оно опускается. В итоге имя файла становится pyn3rd.jsp

1663211967087.png


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

1663212000434.png

Использование метода getOriginalFilename для получения имени файла

Как мы знаем, в сценарии загрузки файлов в формате multipart в SpringBoot, мы привыкли использовать метод getOriginalFilename() для получения имени файла, он может получить имя файла напрямую, без каких-либо изменений имени файла.
1663212068123.png

1663212078534.png


Однако, когда мы используем другой метод StringUtils.cleanPath() для нормализации имени файла, которое получает метод getOriginalFilename(), возникает другая особенность. Мы можем использовать один или несколько /. для добавления имени файла.

/ используется в качестве разделителя, а . означает текущий каталог. Если он указывает на текущий каталог, просто отбросьте его. В результате имя файла будет выглядеть так: pyn3rd.jsp

1663212146212.png


1663212158345.png


Кстати, в Java (система Windows), \ всегда преобразуется в /, когда мы сталкиваемся с уязвимостями SSRF/XXE, пытаемся заменить \ на /, например, http:\/ заменяет http://.

1663212193225.png



Используйте метод Apache commons-fileupload/commons-io для получения имени файла

Мы также можем использовать некоторые общие библиотеки Java, такие как org.apache.commons.fileupload.FileItem.getName или org.apache.commons.io.FilenameUtils.getName для получения имени файла. Например, commons-io анализируется следующим образом

1663212224511.png


Если в конце имени файла добавляется / или /[ПРОБЕЛ]. Другими словами, / с нулевым символом или нулевым символом, результаты имени файла будут оба pyn3rd.jsp

1663212316458.png

1663212326088.png


1663212336106.png



1663212355881.png

Если в конце имени файла добавляется / или /[ПРОБЕЛ], то в случае непустых символов, существующих за разделителем /, символы за / будут получены в качестве имени файла.

1663212397842.png


0x03 Заключение

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


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх