ОРИГИНАЛЬНАЯ СТАТЬЯ
ПЕРЕВЕДЕНО СПЕЦИАЛЬНО ДЛЯ xss.pro
$600 на SSD для Jolah Molivski ---> 0x5B1f2Ac9cF5616D9d7F1819d1519912e85eb5C09 для поднятия ноды ETHEREUM и тестов
Недавно в Интернете я увидел несколько дискуссий о произвольной загрузке файлов в среде Java. Основным вопросом является то, как обойти определение имени файла при загрузке произвольного файла.
Поэтому я пишу эту статью для того, чтобы рассказать об этих трюках.
Использование метода getSubmittedFileName для получения имени файла
Когда мы используем оригинальный сервлет для разработки функции загрузки файлов в многочастном формате на Java, метод getSubmittedFileName() часто используется для получения имени файла, особенно в ранних Java-приложениях. Но с этим методом связана потенциальная проблема.
Мы можем отладить код, чтобы проанализировать ее. Сначала установите точку останова на getSubmittedFileName, затем перейдите к следующему методу HttpParser.unquote(), здесь происходит получение имени файла.
Во время отладки кода можно обнаружить, что когда имя файла содержит \, оно опускается. В итоге имя файла становится pyn3rd.jsp
Поэтому мы можем использовать эту особенность, чтобы обойти обнаружение имен файлов, как это делают WAF на основе регулярных выражений.
Использование метода getOriginalFilename для получения имени файла
Как мы знаем, в сценарии загрузки файлов в формате multipart в SpringBoot, мы привыкли использовать метод getOriginalFilename() для получения имени файла, он может получить имя файла напрямую, без каких-либо изменений имени файла.
Однако, когда мы используем другой метод StringUtils.cleanPath() для нормализации имени файла, которое получает метод getOriginalFilename(), возникает другая особенность. Мы можем использовать один или несколько /. для добавления имени файла.
/ используется в качестве разделителя, а . означает текущий каталог. Если он указывает на текущий каталог, просто отбросьте его. В результате имя файла будет выглядеть так: pyn3rd.jsp
Кстати, в Java (система Windows), \ всегда преобразуется в /, когда мы сталкиваемся с уязвимостями SSRF/XXE, пытаемся заменить \ на /, например, http:\/ заменяет http://.
Используйте метод Apache commons-fileupload/commons-io для получения имени файла
Мы также можем использовать некоторые общие библиотеки Java, такие как org.apache.commons.fileupload.FileItem.getName или org.apache.commons.io.FilenameUtils.getName для получения имени файла. Например, commons-io анализируется следующим образом
Если в конце имени файла добавляется / или /[ПРОБЕЛ]. Другими словами, / с нулевым символом или нулевым символом, результаты имени файла будут оба pyn3rd.jsp
Если в конце имени файла добавляется / или /[ПРОБЕЛ], то в случае непустых символов, существующих за разделителем /, символы за / будут получены в качестве имени файла.
Различные результаты нормализации зависят от реализации различных библиотек jar и личных привычек разработчиков. Если разработчики не знают об этом, потенциальные уязвимости окажутся неизбежными. Таким образом, глубокое исследование разнообразия нормализации поможет нам уклониться от защиты.
ПЕРЕВЕДЕНО СПЕЦИАЛЬНО ДЛЯ xss.pro
$600 на SSD для Jolah Molivski ---> 0x5B1f2Ac9cF5616D9d7F1819d1519912e85eb5C09 для поднятия ноды ETHEREUM и тестов
0x01 Предисловие
Недавно в Интернете я увидел несколько дискуссий о произвольной загрузке файлов в среде Java. Основным вопросом является то, как обойти определение имени файла при загрузке произвольного файла.
Поэтому я пишу эту статью для того, чтобы рассказать об этих трюках.
0x02 Сочные трюки
Использование метода getSubmittedFileName для получения имени файла
Когда мы используем оригинальный сервлет для разработки функции загрузки файлов в многочастном формате на Java, метод getSubmittedFileName() часто используется для получения имени файла, особенно в ранних Java-приложениях. Но с этим методом связана потенциальная проблема.
Мы можем отладить код, чтобы проанализировать ее. Сначала установите точку останова на getSubmittedFileName, затем перейдите к следующему методу HttpParser.unquote(), здесь происходит получение имени файла.
Во время отладки кода можно обнаружить, что когда имя файла содержит \, оно опускается. В итоге имя файла становится pyn3rd.jsp
Поэтому мы можем использовать эту особенность, чтобы обойти обнаружение имен файлов, как это делают WAF на основе регулярных выражений.
Использование метода getOriginalFilename для получения имени файла
Как мы знаем, в сценарии загрузки файлов в формате multipart в SpringBoot, мы привыкли использовать метод getOriginalFilename() для получения имени файла, он может получить имя файла напрямую, без каких-либо изменений имени файла.
Однако, когда мы используем другой метод StringUtils.cleanPath() для нормализации имени файла, которое получает метод getOriginalFilename(), возникает другая особенность. Мы можем использовать один или несколько /. для добавления имени файла.
/ используется в качестве разделителя, а . означает текущий каталог. Если он указывает на текущий каталог, просто отбросьте его. В результате имя файла будет выглядеть так: pyn3rd.jsp
Кстати, в Java (система Windows), \ всегда преобразуется в /, когда мы сталкиваемся с уязвимостями SSRF/XXE, пытаемся заменить \ на /, например, http:\/ заменяет http://.
Используйте метод Apache commons-fileupload/commons-io для получения имени файла
Мы также можем использовать некоторые общие библиотеки Java, такие как org.apache.commons.fileupload.FileItem.getName или org.apache.commons.io.FilenameUtils.getName для получения имени файла. Например, commons-io анализируется следующим образом
Если в конце имени файла добавляется / или /[ПРОБЕЛ]. Другими словами, / с нулевым символом или нулевым символом, результаты имени файла будут оба pyn3rd.jsp
Если в конце имени файла добавляется / или /[ПРОБЕЛ], то в случае непустых символов, существующих за разделителем /, символы за / будут получены в качестве имени файла.
0x03 Заключение
Различные результаты нормализации зависят от реализации различных библиотек jar и личных привычек разработчиков. Если разработчики не знают об этом, потенциальные уязвимости окажутся неизбежными. Таким образом, глубокое исследование разнообразия нормализации поможет нам уклониться от защиты.