Точка входа:
Что вижу: Сервак принимает кастомные заголовки (X-User-Id
, X-Forwarded-For
, X-Auth-Role
). Админы сами намудрили middleware, и вместо нормального JWT у них — доверие к строке в header.
Как поймал: Burp + repeater + ffuf по словарю заголовков → бах, X-Admin: true
и ответ уже 200.
Чем пахнет: AuthZ-bypass (вертикалочка до админа). Вероятность: жирная 9/10.
Че по чём
Эксплойт:
— Минимальный PoC:
1 |
curl -k -H "X-Auth-User: admin" https://target/api/internal/dashboard |
— Или более извращённое:
1 |
curl -k -H "X-Forwarded-For: 127.0.0.1" https://target/admin |
→ потому что бэкенд думает: «ага, локалхост, значит доверенный».
Обход защиты:
— Если WAF душит X-Auth-*
→ юзай нестандартные регистры (x-auth-user
, X-Auth-User
, X-AUTH-USER
).
— Если фильтр на ключ → бейся через дублирование (X-Role: admin
+ X-Role: user
). В старых проксях побеждает первый или последний.
— HTTP/2 → заголовки кейс-инсенситив, а бэкенд — нет. Играешь в капслок-бинго.
Доказательство:
Запрос без хедера → 403 Forbidden
. С X-Admin: 1
→ 200 OK
и в респонсе {"role":"admin"}
. Всё, готовый скриншот PoC. Это не тест, это прямой допуск в админку.
Советы:
3 вектора для добивания:
1. Проверить X-Original-URL
, X-Rewrite-URL
— старье в IIS/Apache до сих пор живое.
2. Закинуть X-Forwarded-Host: internal.admin.local
→ может, проглотят и сделают SSRF.
3. Комбинировать X-Remote-User
с SSO — случайные три буквы в хедере = вход под доменным админом.
План атаки:
1. Поднимаем wordlist кастомных заголовков (X-User
, X-Auth
, X-Role
, X-Access-Level
, X-AspNet-Version
).
2. Пробуем их по методам (GET/POST) на разные эндпойнты.
3. Отмечаем, где меняется код ответа или тело.
4. Локализуем баг: если запрос с X-User: victim
вытягивает чужие данные → IDOR + вертикальный bypass.
5. Докидываем PoC с красивым curl
→ готов багрепорт в BB.
Итог:
Authz-bypass через кастомные headers — это как студенческая общага: дверь вроде на замке, но у каждого в кармане «свой мастер-ключ» от розетки. Разрабы сами повесили ярлык “X-Admin: 1” вместо замка.