Авторские курсы Михаила Тарасова

SSO misconfig в SAML — IDP принимает твой кастомный issuer → логин без пароля

SSO misconfig в SAML — IDP принимает твой кастомный issuer → логин без пароля

Ну что, брат, сегодня разбираем, как через SAML-SSO заходить в админки без пароля. Это когда DevOps настроил “Single Sign-On” за 15 минут по гайду со StackOverflow, а проверку подписи забыл. Результат — ты Бог с curl’ом.
Что за дыра
SAML (Security Assertion Markup Language) — это XML-протокол для SSO.

Схема простая:
1. Ты идёшь на app.com/login
2. Тебя редиректит на Identity Provider (IDP) типа Okta/Azure AD
3. IDP проверяет логин/пароль, генерит SAML Response (XML с утверждением “Да, это Вася”)
4. Браузер отправляет этот Response обратно на app.com
5. Service Provider (SP) проверяет подпись и пускает тебя внутрь
Где косяк: Если SP не проверяет подпись или принимает любой issuer, ты можешь сделать свой Response, прописать там email=admin@company.com и зайти как CEO.
Типичные мисконфиги
1. Нет валидации подписи

Что тут не так: Нет блока <Signature> с цифровой подписью. Если SP не проверяет её — он просто парсит XML и верит, что admin@target.com — это ты.
2. Принимает левый Issuer
Даже если подпись есть, SP может не проверять, кто её подписал. Пример конфига (AWS Cognito/Auth0):

Ты поднимаешь свой IDP на https://evil.com, генеришь валидную подпись своим ключом, прописываешь Issuer: https://idp.target.com — и SP думает: “О, это наш IDP!”.
3. XML Signature Wrapping (XSW)
Классика — подмена элементов в XML через комментарии:

Парсер проверяет подпись первого Assertion, но применяет данные из второго (если логика кривая).
Как тестировать
Инструменты
1. SAML Raider (Burp Suite extension)

Что смотреть: Если после Remove Signature тебя всё равно пустило — jackpot.
2. SAMLTool (CLI-версия)

Закинь evil.b64 в POST-запрос:

3. Ручная проверка через Python

Вставляй в POST → профит.

Обход защит
Если есть проверка подписи
1. Comment Injection
Многие парсеры игнорируют комментарии при валидации, но читают весь XML:

Парсер валидации видит user@target.com, а логика авторизации — admin@target.com.
2. XML External Entity (XXE)
Если парсер обрабатывает DOCTYPE:

Может дать RCE через expect:// или SSRF.
3. Replay Attack
Если нет проверки NotOnOrAfter (время жизни токена):

Если есть WAF
1. Обход через deflate
SAML может быть сжат через zlib:

WAF может не декомпрессировать для проверки.
2. HTTP Parameter Pollution
Отправь два параметра:

Веб-сервер может взять последний, а WAF проверит первый.
PoC для баунти
Сценарий: Нет проверки подписи
Шаг 1: Перехват легитимного Response

Шаг 2: Декодируй и модифицируй

Шаг 3: Отправь

Доказательство:
• Скриншот с admin@target.com в профиле
• Лог запроса из Burp (покажи отсутствие <Signature>)
• CVSS: 9.1 Critical (Authentication Bypass)
Автоматизация
Скрипт для mass-testing

Советы:
Три вектора для добивания
1. SAML Metadata poisoning:
Если есть endpoint /saml/metadata, попробуй заменить его через SSRF:

1. Пропиши свой IDP — все юзеры пойдут через твой сервер.
2. Session fixation через RelayState:

2. После логина жертва может случайно выполнить действие.
3. Subdomain takeover + SAML:


Если Issuer: https://old-idp.target.com, но поддомен мёртвый:

План атаки (если зацепка есть)
1. Найди SAML endpoint: Ищи /saml, /sso, /acs в Burp History или через:

2. Перехвати легитимный Response: Зарегай тестовый аккаунт, логинься через SSO.
3. Тест 1 — Remove Signature: Удали <Signature> → отправь. Если работает — репорт готов.
4. Тест 2 — Change Issuer: Поменяй Issuer на https://evil.com, но оставь подпись. Если работает — ещё хуже.
5. Тест 3 — XSW Attack: Используй SAML Raider → Insert XSW → пробуй 8 вариантов обёртки.
Если застрял
• Metadata leak: Чекни /.well-known/saml-metadata.xml или /FederationMetadata/2007-06/FederationMetadata.xml — там могут быть сертификаты IDP.
• Google Dorks:

• Nuclei template:

• Если всё закрыто — ищи JWT-based SSO (OAuth 2.0 misconfig) — там свои приколы с aud/iss.
Иди ломай, бро. Только помни: SAML — это боль. Если видишь XML больше 10 КБ, готовь валерьянку. И да, всегда тести на staging/test-окружениях, если есть scope. На проде можешь случайно уронить HR-систему и получить не баунти, а повестку. 🏴‍☠️

Мои курсы