一、Web缓存概述
Web 缓存是位于源服务器和用户之间的系统。当客户端请求静态资源时,请求首先被定向到缓存。如果缓存不包含资源的副本(称为缓存未命中),则请求将转发到源服务器,该服务器将处理并响应请求。然后,响应将发送到缓存,然后再发送给用户。缓存使用一组预配置的规则来确定是否存储响应。
当将来对同一静态资源发出请求时,缓存会将存储的响应副本直接提供给用户(称为缓存命中)
二、利用路径映射进行 Web 缓存欺骗
原理:缓存服务器和源服务器对于路径处理差异导致该问题。
利用思路:由于源服务器会对资源路径进行抽象,利用缓存服务器匹配规则,致使缓存服务器误将构造的恶意路径缓存住
1、寻找不严谨的源服务器资源路径
找到敏感路径进行测试,将路径后面加上容易被缓存服务器缓存住的资源如:11.js、11.css等。 查看源服务器是否会将修改后的路径抽象成正常的路径进行相应。
如图所示可以被相应并且能被缓存服务器缓存:
2、 构造而已请求,发送给受攻击者,诱使点击
攻击请求页面如下:
<script>document.location="https://YOUR-LAB-ID.web-security-academy.net/my-account/wc2d.js"</script>
访问构造的url页面,通过缓存服务器 成功获取到API key 如图:
三、利用路径分隔符进行 Web 缓存欺骗
原理:利用缓存和源服务器将字符解释为分隔符的方式的差异进行利用
本题解决思路:由于缓存和源服务器将字符解释为分隔符的方式存在差异,当以/exp?1.js、/exp;1/js访问资源的时候,源服务器会将分隔符后面的解释为参数,而缓存服务器则不做处理,最终根据缓存规则将exp?1.js、/exp;1.js 作为一个完整的资源进行了缓存。最终可能通过xss漏洞被恶意缓存利用
1、使用暴力破解对可能的分隔符进行暴力破解,寻找差异
通过intruder发现,当分隔符为”;“、” ?“ 时,返回正常数据,且可以被缓存服务器缓存(分隔符列表见文末附件)
2、构造而已请求,发送给受攻击者,诱使点击
攻击请求页面如下:
<script>document.location="https://YOUR-LAB-ID.web-security-academy.net/my-account/wc2d.js"</script>
访问构造的url页面,通过缓存服务器成功获取到API key 如图:
四、利用源站规范化进行 Web 缓存欺骗
原理:当缓存服务器对所有静态资源进行缓存,且源服务器进行规范化 URL 路径时将会导致该漏洞
本题解决思路:
寻找静态资源,确定网站对静态资源目录进行了缓存处理,利用源服务器的规范化路径,通过../../的方式跳到目标路径上,由于缓存服务器不做规范化,当匹配到了前面的静态后不会对../../进行解析,最终导致资源被缓存服务器成功缓存
1、测试网站静态文件资源目录
寻找静态资源目录
通过测试缓存服务器会对resources路径下的文件进行缓存,如图
2、测试通过URL路径跳转将目标资源与静态目录进行拼接
能够被缓存住,如图所示:
3、构造而已请求,发送给受攻击者,诱使点击
<script>document.location="https://0a4800400437e67e80e830e100d800b4.web-security-academy.net/resources/../my-account"</script>
需要对于/进行url编码 %2f 攻击请求页面如下:
访问构造的url页面,通过缓存服务器成功获取到API key 如图:
五、利用缓存服务器规范化进行 Web 缓存欺骗
原理:当缓存服务器对静态资源进行缓存,缓存服务器未将字符解释为分隔符源服务器将字符解释为分隔符,缓存服务器进行规范化源服务器未进行规范化处理
本题解决思路:
寻找静态资源,确定网站对静态资源目录或者单个静态文件进行了缓存处理,确定分隔符对于源和缓存服务器的影响,确认规范化对于源和缓存服务器的影响。如果条件均满足该漏洞成立,进行恶意请求的构造
1、查找网站静态文件资源目录
2、缓存服务器未将字符解释为分隔符源服务器将字符解释为分隔符
通过暴力破解确认存在分隔符对响应无影响,可以确认源服务器将字符解释为分隔符,如图:
判断缓存服务器未将字符解释为分隔符
首先将静态资源缓存住,通过分隔符测试不同参数查看是否缓存住了,未缓存住,说明未将字符解释为分隔符,如图:
3、确认缓存服务器进行规范化源服务器进行规范化处理
测试路径跳转,响应异常。确认源服务器未进行规范化处理,如图:
确认缓存服务器进行规范化处理
先将静态缓存中
修改url 查看缓存服务器是否进行了url规范化,能够缓存中,说明缓存服务器进行了规范化处理,如图所示:
4、构造而已请求,发送给受攻击者,诱使点击
<script>document.location="https://0a4800400437e67e80e830e100d800b4.web-security-academy.net/my-account;/..%2fresources"</script>
六、防止 Web 缓存欺骗漏洞
- 始终使用标头来标记动态资源
- 配置 CDN 设置,以便缓存规则不会覆盖标头。
- 激活 CDN 针对 Web 缓存欺骗攻击的任何保护。
- 验证源服务器和缓存解释 URL 路径的方式之间是否没有任何差异。
附件:分隔符列表
!
"
#
$
%
&
'
(
)
*
+
,
-
.
/
:
;
<
=
>
?
@
[
\
]
^
_
`
{
|
}
~
%21
%22
%23
%24
%25
%26
%27
%28
%29
%2A
%2B
%2C
%2D
%2E
%2F
%3A
%3B
%3C
%3D
%3E
%3F
%40
%5B
%5C
%5D
%5E
%5F
%60
%7B
%7C
%7D
%7E