- PVSM.RU - https://www.pvsm.ru -
Давненько мы ничего не публиковали про SAP, и сегодня мы рассмотрим уязвимость, которая затрагивает любое SAP решение от старинного R/3 до новомодной HANA. Имя этой уязвимости – межсайтовый скриптинг (XSS). Статья эта, вопреки нашему обычному повествованию про поиск и эксплуатацию уязвимости, будет по большей части посвящена защите от данной уязвимости.
Межсайтовый скриптинг — одна из самых распространенных уязвимостей вообще, и в продуктах SAP в частности. Так, за 12 лет в SAP было обнаружено 628 XSS-уязвимостей, что составляет 22% от всех уязвимостей в SAP. Только исследователи ERPScan нашли 52 XSS-уязвимости в SAP, и то потому, что больше времени уходило на написание Advisory и бюрократические моменты, чем на непосредственный поиск уязвимостей. Более подробная информация по всем уязвимостям может быть изучена в нашем исследовании "Analysis of 3000 vulnerabilities in SAP [1]", а мы переходим к основной части.
Десять самых распространенных уязвимостей в продуктах SAP
Опасность межсайтового скриптинга состоит в том, что данная уязвимость позволяет атакующему выполнить произвольный JavaScript-код в рамках пользовательской сессии. Этот код может помочь заполучить доступ к куки, токенам сессии и другой критически важной информации, которая хранится браузером. Атакующий может получить доступ к пользовательской сессии и заполучить важную бизнес-информацию, а в самом худшем случае – получить полный контроль над системой. С помощью XSS также можно незаконно подменить данные, отображающиеся на сайте, и провести фишинг-атаку и тд и тп. Думаю, про XSS вы и так знаете предостаточно, но без вводной не обойтись.
XSS обычно возможны в следующих случаях:
Традиционно выделяют следующие типы межсайтового скриптинга:
В данном типе вредоносный код должен храниться на сервере. Например, атакующий может внедрить код путем изменения имени объекта на сервере (например, имя файла в системе документооборота). Если атака прошла успешно, то когда легитимный пользователь запросит информацию о списке файлов, его браузер запустит вредоносный код, загруженный злоумышленником.
Когда-то очень давно мы провели подобную атаку во время одной из работ по анализу защищенности SAP. В этой организации SAP SRM использовалась для проведения торгов, поэтому каждый поставщик мог разместить свою документацию с информацией об услугах и расценках. Система была уязвима к хранимому межсайтовому скриптингу, поэтому нам удалось внедрить JavaScript-код в поле имени файла. Когда сотрудник компании из отдела закупок открывал папку со списком файлов, чтобы увидеть недавно загруженные документы, вредоносный код автоматически запускался, и атакующий получал доступ к аккаунту сотрудника. Используя этот аккаунт, он мог получить доступ к тендерной документации конкурентов и заполучить информацию об их услугах и расценках, что позволяло выиграть торги, скорректировав свои цены. Уязвимость была закрыта SAP (SAP Security Note 1284360).
Еще одним примером хранимого межсайтового скриптинга в SAP является нашумевшая XSS уязвимость в системе SAP Afaria [2] с крайне интересным способом эксплуатации. Такая уязвимость, как хранимый межсайтовый скриптинг, крайне опасна и легка в эксплуатации, но встречается сильно реже, чем отраженный межсайтовый скриптинг, о котором ниже.
Этот тип уязвимости более распространен. В данном случае вредоносный код не хранится на сервере, а выполняется пользователем в тот момент, когда он открывает ссылку примерно следующего вида:
Чтобы проэскплуатировать уязвимость, нужно послать ссылку пользователю. Этот тип XSS менее мощный, так как требует пользовательского взаимодействия, но более популярный, чем хранимый межсайтовый скриптинг, и примеров таких уязвимостей сотни.
Как пример критически опасной атаки, можно внедрить JavaScript-код и не только украсть информацию о пользовательской сессии, хранящуюся в куки, но и проэксплуатировать компнент ActiveX, установленный на компьютере жертвы. Таким образом, можно будет получить полный доступ к его компьютеру через одну из уязвимостей в ActiveX. В результате вы получите доступ к корпоративной внутренней сети и станете на один шаг ближе к SAP-серверу со всеми корпоративными данными.
В данном случае атакующий изменяет среду DOM (Document Object Model) страницы браузера таким образом, чтобы один из скриптов на странице выполнил вредоносный JavaScript-код.
Рассмотрим этот тип более детально на примере уязвимости, закрытой SAP Security Note 1788080. Баг существует потому, что пользовательский ввод в JSP-скрипте ‘error_msg.jsp’ не фильтруется, что позволяет атакующему внедрить JavaScript code в страницу.
Пример страницы, уязвимой к межсайтовому скриптингу
Как мы видим, атакующий может использовать переменную ‘id’ для того, чтобы внедрять код (строка 15), потому что значение переменной ‘id’ будет отображаться у пользователя без изменений (строка 28).
Эксплойтом для этой уязвимости служит следующий запрос:
example1234567.com/dir/start/error_msg.jsp?id=1111 [4]">
Чтобы избежать подобных уязвимостей, нужно всегда экранировать/фильтровать пользовательский ввод. В нашем примере с DOM XSS, переменная 'ID' должна быть повторно заложена в методе 'URLEncoder.encode ()', потому что ее значение используется в качестве параметра HTTP-запроса.
Действия, необходимые для того, чтобы закрыть уязвимость
Как итог, представим еще несколько советов, как предотвратить возможность межсайтового скриптинга на этапе разработки:
Также в браузерах существует несколько механизмов, которые могут значительно снизить риск XSS-атак:
А сейчас давайте подробнее рассмотрим, как защитить различные SAP-платформы от XSS-атак со стороны разработчика, администратора и специалиста по расследованию инцидентов.
Для всех Web-приложений, где разрешен ввод параметров, следует использовать методы энкодинга, обеспеченные ICF-обработчиком. Реализация доступна как API в двух вариантах:
В SAP NetWeaver версии 7.0 enhancement package 3 и выше (SAP_BASIS >= 731) используйте встроенную в ABAP функцию ESCAPE(). Более подробная информация доступна в документации ключевых слов ABAP для функции ESCAPE().
HTML / XML | out = escape(val = val format = cl_abap_format=>e_xss_ml) |
JavaScript | out = escape(val = val format = cl_abap_format=>e_xss_js) |
URL | out = escape(val = val format = cl_abap_format=>e_xss_url) |
CSS | out = escape(val = val format = cl_abap_format=>e_xss_css) |
Для версий SAP_BASIS 702, 720 и ниже, существует реализация ABAP OO в классе CL_ABAP_DYN_PRG.
Контекст | Метод |
HTML / XML | out = CL_ABAP_DYN_PRG=>ESCAPE_XSS_XML_HTML(val) |
JavaScript | out = CL_ABAP_DYN_PRG=>ESCAPE_XSS_JAVASCRIPT(val) |
URL | out = CL_ABAP_DYN_PRG=>ESCAPE_XSS_URL(val) |
CSS | out = CL_ABAP_DYN_PRG=>ESCAPE_XSS_CSS(val) |
Подробная информация об этих расширениях в SAP Security Note 1582870. Теперь рассмотрим особенности защиты от XSS с специфичных SAP-технологиях.
Для WebDynpro ABAP не нужно беспокоится о защите от межсайтового скриптинга. Безопасность обеспечивается самой платформой.
Для BSP следует использовать директивы страницы. Для более подробной информации обратитесь к SAP Security Note 1600317 и SAP Security Note 1638779. Преимущество этих BSP-атрибутов страницы состоит в том, что архитектура BSP гарантирует, что используется самая безопасная версия энкодинга.
Для BSP следует использовать директивы страницы: <% page [5] language=«abap» forceEncode=«html|url|javascript|css»%>
После установки SAP Security Note 1600317 существующие директивы страниц также используют обновленный BSP-компилятор, который поддерживает HTML-энкодинг всех вводимых на странице выражений.
В следующем примере все вводимые выражения используют HTML-энкодинг. Он затрагивает только напечатанные выражения на BSP страницах и ничего не делает с параметрами тегов.
Например:
<%@page language="abap" forceEncode="html"%>
<html><body><form>
<% data: inputvalue type string.
inputvalue = request->get_form_field( 'x' ).
%>
<input type=text name=x value="<%=inputvalue%>">
<input type=submit>
</form></body><<video></video>/html>
Глобальный атрибут страницы определяет кодировку по умолчанию в пределах страницы и всех включенных фрагментов страниц. Кроме глобальных атрибутов страницы, вы можете использовать следующие символы для энкодинга событий специального ввода (переопределение глобальных настроек):
Для библиотеки BSP HTMLB установите атрибут forceEncode тега <htmlb:content> в значение ENABLED для того, чтобы переключиться на внутреннее кодирование (по умолчанию отключено). ENABLED означает, что расширение будет использовать соответствующее кодирование в зависимости от контекста, в котором используется значение:<htmlb:content forceEncode=«ENABLED|BACKWARDS_COMPATIBLE»>
Кроме того, атрибут архитектуры htmlb:content определяет возможную архитектуру, которую поддерживает страница. Валидны следующие значения: CLASSIC, DESIGN2002, DESIGN2003, DESIGN2008, а также их соединения, разграниченные знаком (+). Старая архитектура не поддерживает значения CLASSIC и DESIGN2002 (возможно, небезопасны) и вследствие этого больше не должны использоваться.
<htmlb:content forceEncode="ENABLED" design="DESIGN2003+DESIGN2008">
Если дизайн не определен, то используется design=CLASSIC. Поэтому мы рекомендуем заменить значение по умолчанию на одно из упомянутых выше.
Атрибут forceEncode страницы BSP директивы page [5] и атрибут forceEncode HTMLB тега контента не зависят друг от друга. Первый контролирует энкодинг переменных за пределами расширений, тогда как второй – энкодинг в расширении HTMLB. Таким образом, для смешанных страниц, где используется HTML в сочетании с расширением BSP, нужно установить оба параметра
Для Internet Transaction Server (ITS) и HTML Business, доступны следующие функции энкодинга:
При обращении к значениям переменных, используйте символы HTML-Бизнеса: то есть, используя обратные кавычки (`) или разделитель , энкодинг контролируется глобальными параметрами:
Это может быть отменено локально в шаблонах с помощью установки параметра ~html_escaping_off=1/0, который позволяет включить или отключить экранирование.
То, где и как эти параметры определены, зависит от версии SAP_BASIS:
Что касается версии 7.20, не нужно устанавливать параметр ~new_xss_functions, так как обновленная XSS-библиотека используется во всех случаях.
При данном подходе следует тщательно тестировать приложения, так как могут встречаться случаи, когда кодирование слишком общее, что может привести к ложному кодированию. В подобных случаях можно установить параметр ~html_escaping_off=”X”, чтобы деактивировать автоматическое кодирование и вызывать названные функции вручную. Для получения более подробной информации, см. SAP Security Note 1488500.
Функции HTMLBusiness Template Library (например, SAP_TemplateNonEditableField()) всегда кодируются должным образом и не могут быть отключены или включены. Для получения более подробной информации, см. SAP Security Note 916255.
Для ручного энкодинга
Вы также можете вручную энкодить выходные данные используя функции, названные выше. В данном случае, кодируйте все выходные параметры.
Администратор должен установить следующие параметры, чтобы повысить безопасность и минимизировать вероятность атак через XSS-уязвимости:
Чтобы изменить параметр, запустите транзакцию RZ10, выберите (в поле Profile) нужный профиль (например, DEFAULT.PFL, если параметр должен быть применен для всей SAP-системы). Для того, чтобы создать, изменить или удалить параметр, в профиле выберите Extended maintenance и нажмите кнопку изменить. Когда изменения сделаны, нажмите кнопку Copy.
Для того, чтобы идентифицировать реальные атаки, произошедшие из-за межстайтового скриптинга, а также из-за некоторых других уязвимостей в веб-интерфейсе, рекомендуется настроить следующие параметры:
Теперь рассмотрим как же защитить сервер приложений SAP NetWeaver J2EE
Для AS Java энкодинг доступен при помощи класса tc_sec_csi.jar. Это статический класс и интерфейс, который обеспечивает энкодинг для HTML/XML, JavaScript, CSS и URL. Также возможно использование методов открытого класса StringUtils (com.sap.security.core.server.csi.util.StringUtils):
Вот неполный список методов. Более детально вы можете посмотреть в документе Securing SAP from XSS vulnerabilities [6]
Ниже ряд примеров, которые используют те или иные функции энкодинга.
Случай 1 (вывод между тегами)
<head>
<title>[CASE1]</title>
</head>
<table>
<tr>
<td>Username</td>
<td>[CASE1]</td>
</tr>
</table>
Случай 2 (вывод внутри тегов, но выводимое значение – не URL)
<form name="CASE2">
<input type="text" name="user" value="[CASE2]">
<input type="text" name="user" value='[CASE2]'>
</form>
<a name="[CASE2]">Click here</a>
Случай 3 (вывод — URL)
<a href="CASE3" style="[CASE3]"><img src="[CASE3]" lowsrc="[CASE3]"></a>
Случай 4 (вывод внутри SCRIPT’а, но вывод – не дескриптор строки)
<script>
var a = [CASE4];
[CASE4];
</script>
Случай 5 (вывод – declaration строки)
<script>
var a = '[CASE5]';
alert("[CASE5]");
</script>
В качестве альтернативы можно использовать класс XSSEncoder.
Имя класса — XSSEncoder (класс с именем пакета: com.sap.security.core.server.csi.XSSEncoder).
Методы использования для каждого контекста следующие:
Контекст | Метод |
HTML / XML | out = XSSEncoder.encodeHTML( in ) and XSSEncoder.encodeXML( val ); |
JavaScript | out = XSSEncoder.encodeJavaScript( val ); |
URL | out = XSSEncoder.encodeURL( val ); |
CSS | out = XSSEncoder.encodeCSS( val ); |
Для получения информации об этих расширениях, см. SAP Security Note 1590008.
WebDynpro Java
Для WebDynpro Java, можно не волноваться о XSS. Безопасность обеспечивается самой архитектурой.
SAP UI Development Kit for HTML5
Для SAP UI Development Kit для HTML5, функция энкодинга представлена как плагин jQuery во фреймворке /_core/src/main/js/jquery.sap.encoder.js.
Функции использования в каждом контексте следующие:
Контекст | Функция |
HTML / XML | jQuery.sap.encodeHTML(sValue) and jQuery.sap.encodeXML(sValue) |
JavaScript | jQuery.sap.encodeJS(sValue) |
URL | jQuery.sap.encodeURL(sValue) |
CSS | jQuery.sap.encodeCSS(sValue) |
Администратор должен выставить следующие параметры для того, чтобы улучшить безопасность:
Для того, чтобы идентифицировать реальные атаки, произошедшие из-за XSS-уязвимостей, а также из-за некоторых других уязвимостей в веб-интерфейсе, рекомендуется настроить следующие параметры.
И напоследок, рассмотрим как защитить от XSS-уязвимостей самую последнюю платформу – SAP HANA.
Существует несколько правил защиты SAP HANA с помощью фреймворка SAPUI5.
Администратор должен установить следующие параметры для того, чтобы улучшить безопасность:
Для того, чтобы идентифицировать реальные атаки, произошедшие из-за XSS-уязвимостей, а также из-за некоторых других уязвимостей в веб-интерфейсе, рекомендуется настроить следующие параметры.
Вот в общем-то и все, что хотелось сказать про защиту от XSS. Получилось немало, но это еще раз показывает, насколько сложны бизнес-приложения SAP и как много в них разнообразных возможностей. И это только информация об XSS-уязвимостях – сотой доле проблем которые могут встретиться при разработке программ под SAP. Надеюсь эта статья вам поможет безопасно писать приложения под SAP и хотя бы минимизировать количество XSS-уязвимостей. Ниже дополнительная информация по XSS уязвимостям в SAP.
Да, еще хотелось бы сказать спасибо исследователям Дмитрию Частухину (@chipik) и Султану Абубакирову за неоценимую помощь в написании этой статьи.
Автор: Digital Security
Источник [13]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/informatsionnaya-bezopasnost/110769
Ссылки в тексте:
[1] Analysis of 3000 vulnerabilities in SAP: https://erpscan.com/wp-content/uploads/publications/3000-SAP-notes-Analysis-by-ERPScan.pdf
[2] XSS уязвимость в системе SAP Afaria: https://erpscan.com/press-center/blog/sap-afaria-security-stored-xss-vulnerability-detailed-review/
[3] example.com/search.php?q=: http://example.com/search.php?q=
[4] example1234567.com/dir/start/error_msg.jsp?id=1111: http://example1234567.com/dir/start/error_msg.jsp?id=1111
[5] page: https://habrahabr.ru/users/page/
[6] Securing SAP from XSS vulnerabilities: https://erpscan.com/wp-content/uploads/publications/Securing-SAP-Systems-from-XSS-vulnerabilities.pdf
[7] Logging additional information : http://help.sap.com/saphelp_nw70/helpdata/en/d8/4134420793ab04e10000000a1550b0/content.htm?frameset=/en/ef/8cd7f51dfead42ab90537886104269/frameset.htm¤t_toc=/en/49/e98876e9865b4e977b54fc090df4ed/plain.htm&node_id=154
[8] ABAP protection SAP Encoding Functions for AS ABAP : http://help.sap.com/SAPhelp_nw70/helpdata/en/a6/87890ae991441b89bf418d0198ddcc/content.htm
[9] Java protection : http://help.sap.com/javadocs/nwce/current/se/com.sap.se/com/sap/security/core/server/csi/util/StringUtils.html
[10] SAP Encoding Functions for AS Java and JavaScript: http://help.sap.com/SAPhelp_nw70/helpdata/en/b5/b5b54ba97d4413987252fed5866603/content.htm?frameset=/en/16/58ece980104b668cfe69b23dc925c3/frameset.htm¤t_toc=/en/44/6ad7e1e5254ddee10000000a1553f7/plain.htm&node_id=39
[11] Prevention of Cross-site Scripting SAP HANA protection : https://sapui5.hana.ondemand.com/sdk/docs/guide/4de64e2e191f4a7297d4fd2d1e233a2d.html
[12] Protecting SAP® Applications Based on Java and ABAP™ Against Common Attacks: https://websmp104.sap-ag.de/~sapdownload/011000358700001376952010E/Protecting-SAP-Apps.pdf
[13] Источник: https://habrahabr.ru/post/275719/
Нажмите здесь для печати.