
Технический анализ и proof-of-concept для манипуляции параметрами класса Apache Struts 1 (CVE-2014-0114), демонстрирующие удаленное выполнение кода на Tomcat и отказ в обслуживании на JBoss/Wildfly.
Параметры POST- или GET-запроса обрабатываются как свойства (properties), которые должны устанавливаться с использованием формы в качестве основы. Параметры могут быть путем к вложенному объекту.
Apache Struts 1.x может быть использован для вызова getClass() на Form Beans. Например, можно напрямую манипулировать атрибутами classloader формы: https://example.com/?class.classLoader.defaultAssertionStatus=true.
Под капотом Apache Struts 1.x использует commons-beanutils, который в версии 1.8 (и более ранних) не исключает атрибут class.
Struts 2 также имел подобные недостатки, но здесь мы сосредоточимся на Struts 1.x, для которого нет исправлений в самом фреймворке, последняя версия которого вышла в 2008 году (EOL с 2013 года).
Если приложение работает в Tomcat (Catalina), то можно манипулировать логированием таким образом, чтобы злоумышленник мог создать JSP-файл, который затем выполняется при запросе с сервера. JSP-файл может выполнять произвольный Java-код от имени пользователя, под которым работает Java-процесс.
Смотрите демонстрацию Julián Vilas для подробностей.
(Протестировано на JBoss EAP 7.1)
Существует простой метод выполнения DOS-атаки, которая в худшем случае делает JBoss полностью недоступным и требует перезапуска. В лучшем случае JBoss отвечает медленно.
Через атрибут class можно получить доступ к Class#protectionDomain.codeSource.location. В JBoss это объект URL с протоколом vfs.
Для URL типа vfs:// JBoss зарегистрировал URLStreamHandler, который возвращает объект типа org.jboss.vfs.VirtualFile при вызове URL#getContent.
class.protectionDomain.codeSource.location.content.pathName указывает на каталог <ПУТЬ>/<приложение>/WEB-INF/classes.
Через parent можно получить объект для каталога уровнем выше:
class.protectionDomain.codeSource.location.content.parent.pathName -> <ПУТЬ>/<приложение>/WEB-INF
Вопрос: Сколько ссылок parent необходимо, чтобы добраться до корня файловой системы?
Вопрос:
Что произойдет, когда мы запросим class.protectionDomain.codeSource.location.content.parent.parent.[...].childrenRecursively[0].pathName для корневого каталога файловой системы?
Ответ:
JBoss пройдется по всем файлам в файловой системе и выделит org.jboss.vfs.VirtualFile для каждого файла и каталога.
Дополнительный вопрос: Что произойдет, если два запроса одновременно запросят все файлы в файловой системе? Три? Пять? Десять? Сто?
...
Ответ:
Если подождать достаточно долго, будет зарегистрирована ошибка