前言
书接上文,上面描述了静态扩展缓存的方式进行Web缓存欺骗攻击,这里主要是集中在使用静态目录缓存规则和文件命名缓存规则进行Web缓存欺骗的攻击利用。
分隔符解码引发的安全问题
分隔符解码差异
网站有时需要在 URL 中发送包含在 URL 中具有特殊含义的字符(例如分隔符)的数据。为了确保这些字符被解释为数据,通常会对它们进行编码。但是,某些解析器会在处理 URL 之前对某些字符进行解码。如果分隔符字符被解码,则它可能被视为分隔符,从而截断 URL 路径
缓存和源服务器对分隔符字符的解码差异可能会导致它们解释 URL 路径的方式出现差异,即使它们都使用相同的字符作为分隔符。
考虑示例/profile%23wcd.css
,它使用 URL 编码的#
字符:
源服务器将
%23
解码为#
。它使用#
作为分隔符,因此它将路径解释为/profile
并返回配置文件信息Cache还使用
#
字符作为分隔符,但不解码%23
。它将路径解释为/profile%23wcd.css
。如果.css
扩展名有缓存规则,它将存储响应
此外,某些缓存服务器可能会对 URL 进行解码,然后使用解码后的字符转发请求。其他人首先根据编码的 URL 应用缓存规则,然后对 URL 进行解码并将其转发到下一个服务器。这些行为还可能导致缓存和源服务器解释 URL 路径的方式出现差异。
考虑示例/myaccount%3fwcd.css
缓存服务器根据编码路径
/myaccount%3fwcd.css
应用缓存规则,并决定存储响应,因为存在.css
扩展名的缓存规则。然后它将%3f
解码为?
并将重写后的请求转发给源服务器。源服务器接收请求
/myaccount?wcd.css
。它使用?
字符作为分隔符,因此它将路径解释为/myaccount
利用分隔符解码差异
可以通过使用编码分隔符将静态扩展添加到缓存(而非源服务器)查看的路径来利用解码差异。 使用与识别和利用分隔符差异相同的测试方法,但使用一系列编码字符。
确保您还测试了编码的不可打印字符,特别是 %00、%0A 和 %09。如果这些字符被解码,它们还可以截断 URL 路径。
利用静态目录缓存规则
Web 服务器将静态资源存储在特定目录中是常见的做法。缓存规则通常通过匹配特定的 URL 路径前缀(例如/static
、/assets
、/scripts
或/images
)来定位这些目录。这些规则也可能容易受到Web缓存欺骗
标准化差异
规范化涉及将 URL 路径的各种表示形式转换为标准化格式。这有时包括解码编码字符和解析点段,但这从解析器到解析器都有很大差异
缓存和源服务器标准化 URL 的方式之间的差异可能使攻击者能够构建由每个解析器以不同方式解释的路径遍历有效负载。考虑示例/static/..%2fprofile
解码斜杠字符并解析点段的源服务器会将
/profile
的路径规范化并返回配置文件信息不解析点段或解码斜杠的缓存会将路径解释为
/static/..%2fprofile
。如果缓存存储带有/static
前缀的请求的响应,它将缓存并提供配置文件信息
检测源服务器的标准化方式
要测试源服务器如何规范化 URL 路径,请向不可缓存的资源发送请求,其中包含路径遍历序列和路径开头的任意目录。要选择不可缓存的资源,请寻找非幂等方法,例如 POST。例如将/profile
修改为/aaa/..%2fprofile
如果响应与基本响应匹配并返回配置文件信息,则表明该路径已被解释为 /profile。源服务器解码斜杠并解析点段。
如果响应与基本响应不匹配,例如返回 404 错误消息,则表明该路径已被解释为 /aaa/..%2fprofile。源服务器要么不解码斜杠,要么解析点段。
检测缓存服务器的标准化方式
您可以选择具有缓存响应的请求,并使用路径遍历序列和静态路径开头的任意目录重新发送请求。选择一个响应包含已缓存证据的请求。例如,/aaa/..%2fassets/js/stockCheck.js
如果不再缓存响应,则表明缓存在将路径映射到端点之前未对其进行规范化。它表明存在基于
/assets
前缀的缓存规则。如果响应仍然被缓存,这可能表明缓存已规范化
/assets/js/stockCheck.js
的路径
利用源服务器的标准化方式
如果源服务器解析编码的点段,但缓存不解析,您可以尝试通过根据以下结构构建有效负载来利用差异
/<static-directory-prefix>/..%2f<dynamic-path>
例如/assets/..%2fprofile
:
Cache将路径解释为
/assets/..%2fprofile
源服务器将路径解释为
profile
源服务器返回动态配置文件信息,该信息存储在缓存中。
利用源服务器的标准化方式-靶场
靶场地址:https://portswigger.net/web-security/web-cache-deception/lab-wcd-exploiting-origin-server-normalization
同前面几个靶场是一样的,提供了wiener:peter
账号,需要获取到另一个用户carlos
的API Key
确定目标点
类似的,在使用提供的账号登录之后存在有对应API Key的回显
探究路径分隔符的差异
直接在
/my-account
这一endpoint后添加任意字符进行请求,其回显状态码为404,表明源服务器端未将其抽象为/my-account
之后我们探测以下源服务器端的截断规则,是否存在可用的分隔符,同样使用burpsuite的Intruder模块进行FUZZ
添加FUZZ位置: