1、web缓存(Web Cache)
Web缓存是位于源服务器和用户之间的系统。当客户端请求静态资源时,请求首先被定向到该高速缓存。如果该高速缓存不包含资源的副本(称为缓存未命中),则请求被转发到源服务器,源服务器处理并响应请求。然后,响应在发送给用户之前先发送到该高速缓存。该高速缓存使用一组预配置的规则来确定是否存储响应。当将来对同一静态资源发出请求时,该高速缓存会将存储的响应副本直接提供给用户(称为缓存命中)。
内容交付网络(Content Delivery Networks,CDN)就是缓存技术,CDN使用缓存将内容的副本存储在世界各地的分布式服务器上,通过从最接近用户的服务器提供内容来加速交付,通过最小化数据传输距离来减少加载时间。
1.1 缓存键(Cache Keys)
当该高速缓存收到一个HTTP请求时,它必须决定是否有一个它可以直接服务的缓存响应,或者它是否必须将请求转发到源服务器。该高速缓存通过从HTTP请求的元素生成缓存键(cache key)来做出此决定。通常,这包括URL路径和查询参数,但它也可以包括各种其他元素,如标题和内容类型。
如果传入请求的缓存键与前一个请求的缓存键匹配,则该高速缓存认为它们是等价的,并提供缓存响应的副本。
1.2 缓存规则(Cache Rules)
缓存规则确定可以缓存什么以及缓存多长时间。缓存规则通常用于存储静态资源,这些资源通常不会频繁更改,并且可以在多个页面中重用。动态内容不缓存,因为它更可能包含敏感信息,确保用户直接从服务器获取最新数据。常见缓存规则如下:
- 静态文件扩展名规则:这些规则匹配所请求资源的文件扩展名,例如样式表的
.css
或JavaScript文件的.js
。 - 静态目录规则:这些规则匹配所有以特定前缀开头的URL路径。这些通常用于定位仅包含静态资源的特定目录,例如
/static
或/assets
。 - 文件名规则:这些规则将特定文件名与Web操作普遍需要且很少更改的目标文件相匹配,例如
robots.txt
和favicon. ico
。
2、实施web缓存欺骗攻击
一般来说,构建一个基本的Web缓存欺骗攻击包括以下步骤:
- 识别返回包含敏感信息的动态响应的目标计算机。在Burp中查看响应,因为某些敏感信息可能在呈现的页面上不可见。重点关注支持
GET
、HEAD
或OPTIONS
方法的端点,因为改变源服务器状态的请求通常不会被缓存。 - 确定该高速缓存和源服务器解析URL路径的方式存在差异。这可能是它们在以下方面存在差异:
- 将URL映射到资源;
- 处理字符串;
- 规范化路径。
- 制作一个恶意URL,利用差异欺骗该高速缓存存储动态响应。当受害者访问URL时,他们的响应存储在该高速缓存中;攻击者此时向同一URL发送请求,以获取包含受害者数据的缓存响应。避免直接在浏览器中执行此操作,因为某些应用程序在没有会话的情况下重定向用户或使本地数据无效,这可能会隐藏漏洞。
判断是否存在web缓存欺骗
在测试过程中,能够识别缓存的响应至关重要。为此,请查看响应头和响应时间。各种响应标头可能表明它已被缓存。举例来说:
-
X-Cache标头提供有关是否从该高速缓存提供响应的信息。典型值包括:
X-Cache:hit
:从高速缓存提供响应。X-Cache:miss
:高速缓存不包含对请求键的响应,因此从源服务器获取。在大多数情况下,响应会被缓存。要确认这一点,请再次发送请求以查看值是否更新为命中。X-Cache:dynamic
:源服务器动态生成内容。通常这意味着响应不适合缓存。X-Cache:refresh
:缓存的内容已过期,需要刷新或重新验证。
-
Cache-Control
报头可能包括指示缓存的指令,例如具有大于0的max-age的public。请注意,这只表明资源是可缓存的。
3、利用静态扩展缓存规则
静态扩展缓存规则:通过匹配常见的文件扩展名(如.css
或. js
)来定位静态资源,这是大多数CDN中的默认行为。
3.1 路径映射差异
URL路径映射是将URL路径与服务器上的资源(如文件、脚本或命令执行)相关联的过程。常见的样式包括:URL映射和RESTful URL映射。
- 传统URL映射:以
http://example.com/path/in/filesystem/resource.html
为例,http://example.com
表示目标主机;/path/in/filesystem/
表示服务器文件系统中的目录路径;resource.html
表示要访问的特定文件。
- RESTful URL映射:以
http://example.com/path/resource/param1/param2
为例http://example.com
表示目标主机;/path/resource/
表示要访问的资源;param1
和param2
是请求参数。
web缓存欺骗漏洞的核心:高速缓存和源服务器将URL路径映射到资源的方式存在差异。 以http://example.com/user/123/profile/wcd.css
为例:
- 使用RESTful URL映射的源服务器可以将此解释为对
/user/123/profile
端点的请求,并返回用户123的配置文件信息,忽略wcd.css作为非重要参数。 - 使用传统URL映射的缓存可能会将此视为对位于
/user/123
下的/profile
目录中名为wcd.css的文件的请求。它将URL路径解释为/user/123/profile/wcd. css
。如果将该高速缓存配置为存储路径以.css结尾的请求的响应,则它将缓存并提供配置文件信息。
测试方法:要测试高速缓存如何将URL路径映射到资源,通过添加静态扩展来修改路径,以尝试匹配缓存规则。例如,将/API/orders/123/foo
更新为/API/orders/123/foo. js
。如果响应被缓存,则表明:
- 该高速缓存解释带有静态扩展名的完整URL路径。
- 有一个缓存规则来存储以
. js
结尾的请求的响应。
缓存可以具有基于特定静态扩展的规则。尝试一系列扩展名,包括
.css
、.ico
和. exe
。
3.2 Lab: Exploiting path mapping for web cache deception(路径映射)
3.2.1 判断是否存在web缓存欺骗漏洞
首先,用wiener:peter
登录后台,可以在My Account
处看到当前用户的API key。
在GET /my-account
返回包中可以看到当前用户wiener
的API key。
将任意段添加到基本路径,如GET /my-account/abc
,仍然返回个人主页。
向URL路径添加静态扩展名,如/my-account/abc.js
,仍然返回个人主页。注意:响应包含X-Cache:miss
和Cache-Control:max-age=30
标头。
X-Cache:miss
表示此响应不是从该高速缓存提供的。Cache-Control