PortSwigger网络缓存欺骗(1)

实验:利用路径映射欺骗网页缓存

要完成这个实验,你需要知道:

  • 正则表达式端点如何将 URL 路径映射到资源。
  • 如何检测和利用缓存服务器和源服务器映射 URL 路径方式的差异。

使用以下凭据登录您自己的帐户wiener:peter

登录后便可以repeter账户页面

根据以下url请求开始测试

复制代码
/my-account
        ↓
/my-account/abc
        ↓
/my-account/abc.js

先发送正常请求

再发送对/my-account/abc的请求

之后可以发送对/my-account/abc.js的请求

可以发现出现两个非常关键的响应头Cache-Control和X-Cache

解释下

X-Cache: miss

miss 表示:

这次响应没有从缓存中拿,而是去后端服务器重新获取的。

可以理解成:

复制代码
浏览器
  │
  │ GET /my-account/abc.js
  ▼
CDN / 缓存服务器
  │
  │ 没找到缓存 → MISS
  ▼
后端服务器
  │
  │ 返回响应
  ▼
CDN缓存服务器
  │
  │ 把响应缓存起来
  ▼
浏览器

所以第一次访问的目的并不是攻击,而是建立基准。

Cache-Control: max-age=30

这个响应头表示:

如果缓存服务器缓存了这个响应,那么它可以在 30 秒内直接使用这个缓存响应。

所以:

复制代码
第一次请求
    ↓
MISS
    ↓
后端生成响应
    ↓
缓存服务器保存响应
    ↓
有效期 30 秒

这就给了我们一个实验条件:

30 秒内再次请求同一个缓存键,有可能不再访问后端,而直接拿缓存。

30 秒内再次发送

再次发送:

复制代码
GET /my-account/abc.js HTTP/1.1
Host: example.com

结果:

复制代码
X-Cache: hit

这非常关键。

hit 意味着:

这次响应直接来自缓存。

流程变成:

复制代码
浏览器
  │
  │ GET /my-account/abc.js
  ▼
缓存服务器
  │
  │ 找到之前缓存的结果
  │
  │ HIT
  ▼
直接返回缓存内容

后端甚至可能没有参与这次请求。

理解:为什么 /my-account/abc.js 会被缓存?

这里才是这个实验的核心。

正常情况下:

复制代码
/my-account/

明显是一个动态、私密页面。

例如:

复制代码
GET /my-account/

可能返回:

复制代码
<h1>Welcome, Alice</h1>
<p>Email: alice@example.com</p>

这种内容通常不应该被公共缓存。

但是你构造了:

复制代码
/my-account/abc.js

虽然实际上:

复制代码
/my-account/abc.js

并不一定真的存在。

问题在于:缓存服务器可能只看 URL 后缀

它可能看到:

复制代码
/my-account/abc.js
             ↑
           .js

然后认为:

.js 是静态资源,应该可以缓存。

于是缓存服务器按照类似这样的规则:

复制代码
如果 URL 以 .js 结尾
        ↓
认为是静态资源
        ↓
允许缓存

但是后端服务器怎么看?

后端服务器可能没有把:

复制代码
/my-account/abc.js

当成一个真正的 JavaScript 文件。

它可能通过路由机制把它解释成:

复制代码
/my-account/

或者:

复制代码
/my-account/xxx

也就是说:

缓存服务器和后端服务器对同一个 URL 的理解不一样

这是整个漏洞的关键。

可以画成:

复制代码
                /my-account/abc.js
                        │
             ┌──────────┴──────────┐
             │                     │
             ▼                     ▼
        缓存服务器              后端服务器
             │                     │
       看 URL 后缀              看应用路由
             │                     │
          .js文件              /my-account
             │                     │
             ▼                     ▼
         可以缓存              私人账户页面

于是出现了一个危险情况:

复制代码
缓存服务器:
/my-account/abc.js
       ↓
   静态 JS 文件
       ↓
     可以缓存

后端服务器:
/my-account/abc.js
       ↓
   /my-account
       ↓
   用户私人数据

++推理链++

复制代码
① /my-account/abc.js
        ↓
② 第一次请求
        ↓
③ X-Cache: miss
        ↓
④ Cache-Control: max-age=30
        ↓
⑤ 说明响应可以被缓存
        ↓
⑥ 30秒内再次请求
        ↓
⑦ X-Cache: hit
        ↓
⑧ 证明该 URL 已经进入缓存
        ↓
⑨ 为什么?
        ↓
⑩ 缓存可能根据 .js 判断它是静态资源
        ↓
⑪ 但后端可能把它当成 /my-account 动态页面
        ↓
⑫ 缓存层和后端对 URL 的解释产生差异
        ↓
⑬ 可能形成 Web Cache Deception

完成实验

点击go to exploit server 在body中插入我们想要对用户的网络欺骗代码(欺取缓存session后登入账户拿到专属api)

复制代码
<script>window.location="https://0aea003004e6a85b80a50863004900f5.web-security-academy.net/my-account/xzy.js"</script>

点击Deliver exploit to victim算是发送给用户

然后访问以下url

复制代码
https://0aea003004e6a85b80a50863004900f5.web-security-academy.net/my-account/xzy.js

获得用户的api key 将其复制提交至submit solution 即可

攻克工程极短 但是想要完全理解如何一步一步检测出缓存欺骗的可行性需要花些时间与理解

我的攻克过程没能完成hit 可以参考以下视频借鉴学习

https://www.youtube.com/watch?v=9kGF1O9jyaA

相关推荐
Lzg_na17 小时前
IGMP 协议详解:从背景到报文的完整学习指南
网络
爱研究的小梁17 小时前
从无人车配送走向集群联动作业,通信如何扛住协同压力?
网络·网络协议·机器人·信息与通信
程序员清风17 小时前
缓存、索引与数据结构的工程选择
数据结构·spring·缓存
ESDWAN17 小时前
企业访问海外系统很慢,如何一步步定位问题?
服务器·网络·php
新时代牛马17 小时前
`arch_timer`、`IPI5`、`HRTIMER`、`ksoftirqd` 的关系
网络·单片机·tcp/ip
企业解惑小助手17 小时前
上网行为审计日志保存6个月怎么落地:从合规要求到存储架构
网络·架构·php
汤愈韬18 小时前
OSPF的虚链路
网络·网络协议
fb_1234518 小时前
K8s 网络通关手册:Ingress-Nginx 生产级路由 + Calico 三种隧道模式 + NetworkPolicy 白名单实战
网络·nginx·kubernetes
2601_9587369918 小时前
教师课件能不能做虚拟产品?一个被低估的方向
网络
code2cat18 小时前
【随笔】RAG语义缓存:问题很相似,答案就能直接复用吗
java·缓存·知识库·rag