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

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

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

Еще была уязвимость языка шаблонов Freemarker (Freemarker Template Language). Некорректная работа механизма обработки тегов позволяла опять же отправлять серверу выражения Object Graph Navigation 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, отправленных на сервер.
Заглянем в конфигурационный файл.

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

Cтатьи из последних выпусков журнала можно покупать отдельно только через два месяца после публикации. Чтобы читать эту статью, необходимо купить подписку.

Подпишись на журнал «Хакер» по выгодной цене!

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

2 комментария

Подпишитесь на ][, чтобы участвовать в обсуждении

Обсуждение этой статьи доступно только нашим подписчикам. Вы можете войти в свой аккаунт или зарегистрироваться и оплатить подписку, чтобы свободно участвовать в обсуждении.

Check Also

Безопасность превыше всего. 9 простых трюков, которые сделают жизнь линуксоида секьюрнее

Жизнь обычных людей складывается из мелочей. Жизнь линуксоида складывается из множества ма…