Сегодня мы вернемся к Apache Struts, популярному веб-фреймворку, который за последнее время натерпелся от исследователей безопасности и явил миру несколько критических уязвимостей. В этой статье я хочу обсудить уязвимость в модуле, отвечающем за REST API. Она приводит к выполнению произвольного кода и открывает широкие возможности (такие, например, как слив личных данных половины населения США).
 

В предыдущих сериях

Не так давно я уже писал статью об уязвимости в Struts. Там речь шла о некорректной обработке сообщений об ошибках: используя Object Graph Navigation Language (OGNL), можно было выполнять произвольные команды на машине.

Еще была уязвимость языка шаблонов Freemarker (Freemarker Template Language). Некорректная работа механизма обработки тегов позволяла опять же отправлять серверу выражения OGNL, которые снова приводили к выполнению произвольного кода.

В этот раз под прицелом оказался механизм REST API, а ошибка закралась в механизм десериализации сущностей XML.

 

Наш подопытный

Все свои манипуляции я буду производить на ОС Windows 10. В качестве сервера я использую Apache Tomcat 8.5.20. Версию фреймворка Apache Struts я возьму из ветки 2.5, и это последняя уязвимая до патча — 2.5.12. Скачать можно, разумеется, на официальном сайте. Чтобы не пришлось искать, вот тебе прямая ссылочка (ZIP). Также можешь скачать только исходники, если захочешь заглянуть внутрь и лучше понять, как все устроено.

После установки сервера нужно распаковать архив с фреймворком, взять из папки apps приложение struts2-rest (файл struts2-rest-showcase.war) и положить в папку webapps сервера Tomcat. После этого можно запускать сервер.

Теперь, перейдя по адресу http://127.0.0.1:8080/struts2-rest-showcase, ты можешь наблюдать нашего подопытного.

Готовое к экспериментам приложение
Готовое к экспериментам приложение
 

Копаемся в исходниках

Для начала несколько слов о ContentTypeHandler. Это интерфейс, который предоставляется фреймворком для конвертирования данных в объекты Java. Десериализацию здесь используют, чтобы преобразовать переданные данные в объекты. Поэтому каждый класс, реализующий этот интерфейс, представляет потенциальный интерес для нас как исследователей. Ведь все мы любим десериализацию юзердаты.

Так вот, в Struts имеется такой класс, как XStreamHandler.

/plugins/rest/src/main/java/org/apache/struts2/rest/handler/XStreamHandler.java
30: /**
31:  * Handles XML content
32:  */
33: public class XStreamHandler implements ContentTypeHandler {

Он используется при обработке данных в формате XML, отправленных на сервер.

Заглянем в конфигурационный файл.

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    2 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии