一、利用静态扩展缓存规则
在后面添加类似/aaa.js/ico/css
等后缀查看数据是否被缓存,多发几次请求
观察数据包标头x-cache:miss
就是缓存不存在。x-cache:hit
就表示缓存存在,存在漏洞。
二、使用分隔符差异
不同的框架在进行缓存时,被解析的分隔符也是不同的,使用burp爆破模块,导入常用分隔符字典
找出该框架可以被解析的分隔符,进行挨个测试。
例如:GET /Myaccount?abc.js
GET /Myaccount ; abc.js
也是到repeater模块中多发送几次请求观察数据包标头,x-cache:hit就表示缓存存在,
存在漏洞,反之则无。
三、利用静态目录缓存规则
Web 服务器通常将静态资源存储在特定目录中。缓存规则通常通过匹配特定的 URL 路径前缀(如 ,,, 或 .)来定位这些目录。这些规则也可能容易受到 Web 缓存欺骗的攻击。/static/assets/scripts/images
四、源服务器(主机)和缓存服务器(CDN)的规范化差异和利用
(一).通过源服务器检查规范化
1.要测试源服务器如何规范化 URL 路径,请向不可缓存的资源发送请求,其中包含路径遍历序列和路径开头的任意目录。要选择不可缓存的资源,请查找非幂等方法。
例如:将POST/profile
修改为 :/aaa/..%2fprofile
2.如果响应与基本响应匹配并返回用户档案信息,则表示路径已被解释为 .源服务器对斜杠进行解码并解析点段。/profile
3.如果响应与基本响应不匹配,例如返回错误消息,则表示路径已被解释为 .源服务器要么不解码斜杠,要么不解析点段。404 /aaa/..%2fprofile
(二).利用源服务器的规范化
1.如果源服务器解析编码的点段,但缓存没有解析,您可以尝试根据以下结构构建有效负载来利用差异:
/<static-directory-prefix>/..%2f<dynamic-path>
2.例如,考虑 payload :/assets/..%2fprofile
- 缓存将路径解释为:
/assets/..%2fprofile
- 源服务器将路径解释为:
/profile
源服务器返回存储在缓存中的动态配置文件信息。
(三).通过缓存服务器检测规范化
1.您可以使用几种不同的方法来测试缓存如何规范化路径。首先确定潜在的静态目录。在 Proxy > HTTP history (代理 HTTP 历史记录) 中,查找具有常见静态目录前缀和缓存响应的请求。通过将 HTTP 历史记录筛选条件设置为仅显示具有 2xx 响应和脚本、图像和 CSS MIME 类型的消息,专注于静态资源。
2.然后,您可以选择具有缓存响应的请求,并在静态路径的开头使用路径遍历序列和任意目录重新发送请求。选择响应包含缓存证据的请求。例如:/aaa/..%2fassets/js/stockCheck.js
3.如果响应不再缓存,则表示缓存在将路径映射到终端节点之前未对路径进行规范化。它显示存在基于前缀的缓存规则。/assets
如果响应仍处于缓存状态,这可能表示缓存已将路径规范化为 。/assets/js/stockCheck.js
(四).利用缓存服务器的规范化
1.如果缓存服务器解析编码的点段,但源服务器没有解析,您可以尝试根据以下结构构建有效负载来利用差异: /<dynamic-path>%2f%2e%2e%2f<static-directory-prefix>
2.在这种情况下,仅靠路径遍历不足以进行漏洞利用。例如,考虑缓存和源服务器如何解释有效负
载:/profile%2f%2e%2e%2fstatic
- 缓存将路径解释为:
/static
- 源服务器将路径解释为:
/profile%2f%2e%2e%2fstatic
源服务器可能会返回错误消息,而不是配置文件信息。
3.要利用此差异,您还需要确定源服务器使用但缓存未使用的分隔符。通过将可能的分隔符添加到动态路径后的有效负载中来测试可能的分隔符:
- 如果源站使用分隔符,它将截断 URL 路径并返回动态信息。
- 如果缓存不使用分隔符,它将解析路径并缓存响应。
4.例如,考虑 payload 。源服务器用作分隔符:/profile;%2f%2e%2e%2fstatic
- 缓存将路径解释为:
/static
- 源服务器将路径解释为:
/profile
源服务器返回存储在缓存中的动态配置文件信息。因此,您可以将此负载用于漏洞利用。
五、总结
1.确认目标的终端节点,就是保存有用户总要数据的页面。
2.开始调查源服务器使用的路径分隔符,使用burp爆破模块,导入常用分隔符字典,找出可以被相应的分隔符,状态码为200的。
3调查路径分隔符差异,添加被筛选出来的分隔符到路径末尾拼接类似:/myaccount?abc.js
。这种拼接 ,?
是被筛选出来状态码200的分隔符。
4.调查规范化差异:
源服务器:在原始路径的开头添加一个任意目录,后跟一个编码的点段。例如:/aaa/..%2fmy-account
,发送此数据包,如果收到的响应是404 notfound
,那就代表源服务器并不解析斜杠或点段,路径被规范化了。
缓存服务器:在httphistory中寻找前缀带有缓存请求响应(x-cache:hit)
的静态资源,将其发送到repeater模块中,在前缀前添加编码的点段和任意目录。
例如:/aaa/..%2fresources/YOUR-RESOURCE
,发送请求两次,看是否被缓存。
再次进行判断此缓存没有误报,在构造一个数据包,
例如:/resources/..%2fYOUR-RESOURCE
进行发送,此时响应不再包含缓存,这表示缓存对点段进行解码和解析,并具有基于前缀的缓存规则。
5.制作漏洞,进行漏洞的验证
构建一个脚本文件,并在后面随意添加一个参数(aaa)用于接收缓存
<script>document.location="https://0afc005703212e3e82d3883d00b20097.web-security-academy.net/resources/..%2fmy-account?aaa"</script>
(利用源服务器构造链接示意)
<script>document.location="https://0afc005703212e3e82d3883d00b20097.web-security-academy.net/my-account%23%2f%2e%2e%2fresources?aaa"</script>
(利用缓存服务器构造链接示意)
6.将此脚本交付给受害者,当受害者在登陆状态下访问此脚本,个人信息将会被缓存,此时你再访问这个地址,就能看到受害者的个人信息。