# Cookie Bomb + Onerror XS Leak {{#include ../../banners/hacktricks-training.md}} This technique combines: - Cookie bombing: stuffing the victim’s browser with many/large cookies for the target origin so that subsequent requests hit server/request limits (request header size, URL size in redirects, etc.). - Error-event oracle: probing a cross-origin endpoint with a ``` Why the popup (window.open)? - Modern browsers increasingly block third-party cookies. Opening a top-level window to the target makes cookies first‑party so Set-Cookie responses from the target will stick, enabling the cookie-bomb step even with third‑party cookie restrictions. Generic probing helper If you already have a way to set many cookies on the target origin (first-party), you can reuse this minimal oracle against any endpoint whose success/failure leads to different network outcomes (status/MIME/redirect): ```js function probeError(url) { return new Promise((resolve) => { const s = document.createElement('script'); s.src = url; s.onload = () => resolve(false); // loaded successfully s.onerror = () => resolve(true); // failed (e.g., 4xx/5xx, wrong MIME, blocked) document.head.appendChild(s); }); } ``` Tips to build the oracle - Force the “positive” state to be heavier: chain an extra redirect only when the predicate is true, or make the redirect URL reflect unbounded user input so it grows with the guessed prefix. - Inflate headers: repeat cookie bombing until a consistent error is observed on the “heavy” path. Servers commonly cap header size and will fail sooner when many cookies are present. - Stabilize: fire multiple parallel cookie set operations and probe repeatedly to average out timing and caching noise. Related XS-Search tricks - URL length based oracles (no cookies needed) can be combined or used instead when you can force a very long request target: {{#ref}} url-max-length-client-side.md {{#endref}} Defenses and hardening - Make success/failure responses indistinguishable: - Avoid conditional redirects or large differences in response size between states. Return the same status, same content type, and similar body length regardless of state. - Block cross-site subresource probes: - SameSite cookies: set sensitive cookies to SameSite=Lax or Strict so subresource requests like