服务器端漏洞篇 | Web缓存欺骗专题

声明

该系列共三篇,30个专题(截止2024.8.14),其中有26个专题的全部内容已于2023年8月在Freebuf发布,至此,这26个专题的安全客版本及相关专题的更新内容已全部重新编写并发布,旧版本文章可以不用看了,该专题为Freebuf首发。

本系列介绍

PortSwigger是信息安全从业者必备工具burpsuite的发行商,作为网络空间安全的领导者,他们为信息安全初学者提供了一个在线的网络安全学院(也称练兵场),在讲解相关漏洞的同时还配套了相关的在线靶场供初学者练习,本系列旨在以梨子这个初学者视角出发对学习该学院内容及靶场练习进行全程记录并为其他初学者提供学习参考,希望能对初学者们有所帮助。

梨子有话说

梨子也算是Web安全初学者,所以本系列文章中难免出现各种各样的低级错误,还请各位见谅,梨子创作本系列文章的初衷是觉得现在大部分的材料对漏洞原理的讲解都是模棱两可的,很多初学者看了很久依然是一知半解的,故希望本系列能够帮助初学者快速地掌握漏洞原理。

服务器端漏洞篇介绍

burp官方说他们建议初学者先看服务器漏洞篇,因为初学者只需要了解服务器端发生了什么就可以了

服务器端漏洞篇 – Web缓存欺骗专题

Web缓存欺骗允许攻击者利用该漏洞欺骗Web缓存来存储敏感的动态内容。这是由于缓存服务器和源服务器处理请求的方式存在差异造成的。这个听着这么耳熟呢,有点像请求走私,但是又和Web缓存有关,有意思。
在网络缓存欺骗攻击中,攻击者诱使受害者访问恶意URL,诱导受害者的浏览器对敏感内容发出模糊请求。缓存将此错误解释为对静态资源的请求并存储响应。然后,攻击者可以请求相同的URL来访问缓存的响应,从而获得对私人信息的未经授权的访问。哇,这个牛啊,居然能把浏览器都骗过去,把本应仅发送给个人的数据误以为是静态资源从而生成Web缓存,其他访问同源资源的都能得到相同的响应,这危害可太大了。
区分Web缓存欺骗和Web缓存投毒非常有用。虽然两者都利用缓存机制,但它们的实现方式不同:

  • Web缓存投毒会操纵缓存密钥,将恶意内容注入到缓存的响应中,然后将其提供给其他用户。

  • Web缓存欺骗利用缓存规则来诱骗缓存存储敏感或私有内容,然后攻击者可以访问这些内容。

这个专题是非常新的一个专题,是由PortSwigger在Black Hat USA 2024上提出的原创研究,感兴趣的小伙伴可以查看研究报告原文:Gotta Cache ’em all: bending the rules of web cache exploitation

Web缓存

Web缓存是位于源服务器和用户之间的系统。当客户端请求静态资源时,请求首先被定向到缓存。如果缓存不包含资源的副本(称为缓存未命中),则请求将转发到源服务器,由源服务器处理并响应该请求。然后,响应会先发送到缓存,然后再发送给用户。缓存使用一组预先配置的规则来确定是否存储响应。
当将来发出对相同静态资源的请求时,缓存将直接向用户提供存储的响应副本(称为缓存命中)。
缓存已成为交付Web内容的一个常见且重要的方面,特别是随着内容交付网络(CDN)的广泛使用,该网络使用缓存在世界各地的分布式服务器上存储内容副本。CDN通过从距离用户最近的服务器提供内容来加速交付,并通过最小化数据传输距离来减少加载时间。

缓存键

当缓存收到HTTP请求时,它必须决定是否有可以直接提供服务的缓存响应,或者是否必须将请求转发到源服务器。缓存通过从HTTP请求的元素生成”缓存键”来做出此决定。通常,这包括URL路径和查询参数,但也可以包括各种其他元素,例如头和内容类型。
如果传入请求的缓存键与先前请求的缓存键匹配,则缓存认为它们是等效的并提供缓存响应的副本。

缓存规则

缓存规则决定可以缓存什么内容以及缓存多长时间。缓存规则通常用于存储静态资源,这些资源通常不会频繁更改,并且可以跨多个页面重用。动态内容不会被缓存,因为它更有可能包含敏感信息,确保用户直接从服务器获取最新数据。
Web缓存欺骗攻击利用缓存规则的应用方式,因此了解一些不同类型的规则非常重要,特别是那些基于请求URL路径中定义的字符串的规则。例如:

  • 静态文件扩展名规则 – 这些规则与所请求资源的文件扩展名匹配,例如样式表的.css或JS文件的.js。

  • 静态目录规则 – 这些规则匹配以特定前缀开头的所有URL路径。这些通常用于定位仅包含静态资源的特定目录,例如/static或/assets。

  • 文件名规则 – 这些规则将特定文件名与Web操作普遍需要且很少更改的目标文件相匹配,例如robots.txt和favicon.ico。

缓存还可以基于其他标准(例如URL参数或动态分析)实现自定义规则。

构造一个Web缓存欺骗攻击

一般来说,构建基本的Web缓存欺骗攻击包括以下步骤:

  1. 识别返回包含敏感信息的动态响应的目标端点。检查响应,因为某些敏感信息可能在呈现的页面上不可见。重点关注支持GET、HEAD或OPTIONS方法的端点,因为更改源服务器状态的请求通常不会被缓存。

  2. 确定缓存和源服务器解析URL路径的方式存在差异。它们可能存在以下方面的差异:

    • 将URL映射到资源的方式。

    • 处理分隔符的方式。

    • 规范化路径的格式。

  3. 制作一个恶意URL,利用该差异来欺骗缓存来存储动态响应。当受害者访问该URL时,他们的响应将存储在缓存中。然后,我们可以向同一URL发送请求,以获取包含受害者数据的缓存响应。避免直接在浏览器中执行此操作,因为某些应用程序会在没有会话的情况下重定向用户或使本地数据无效,这可能会隐藏漏洞。

使用一个缓存消除器(cache buster)

在测试差异并构造Web缓存欺骗漏洞时,请确保发送的每个请求都具有不同的缓存键。否则可能会收到缓存的响应,这会影响测试结果。
由于URL路径和任何查询参数通常都包含在缓存键中,因此可以通过向路径添加查询字符串并在每次发送请求时更改它来更改键。使用Param Miner插件自动执行此过程。所以安装插件后,单击Param miner > 设置菜单,然后选择添加动态缓存消除器。 现在发出的每个请求添加一个唯一的查询字符串。我们可以在Logger选项卡中查看添加的查询字符串。

检测缓存的响应

在测试过程中,能够识别缓存的响应至关重要。所以我们要检查响应头和响应时间。如果看到下面的响应头,说明这个响应已经被缓存了:

  • X-Cache头提供有关是否从缓存提供响应的信息。

    • X-Cache: hit – 响应由缓存提供。

    • X-Cache: miss – 缓存不包含请求键的响应,因此它是从源服务器获取的。在大多数情况下,响应会被缓存。想要确认这一点,要再次发送请求以查看该值是否更新为hit。

    • X-Cache: dynamic – 源服务器动态生成内容。一般来说,这意味着响应不适合缓存。

    • X-Cache: refresh – 缓存内容已过期,需要刷新或重新验证。

  • Cache-Control头可能包含指示缓存的指令,例如max-age高于0的public指令。值得注意的是,这仅表明该资源是可缓存的。它并不总是表示缓存,因为缓存有时可能会覆盖这个头。

如果我们发现同一请求的响应时间存在很大差异,这也可能表明缓存提供的响应速度更快。

利用静态资源扩展名缓存规则

缓存规则通常通过匹配常见文件扩展名(例如.css或.js)来定位静态资源。这是大多数CDN中的默认行为。
如果缓存和源服务器将URL路径映射到资源或使用分隔符的方式存在差异,则攻击者可能能够构造对具有静态扩展名的动态资源的请求,该请求会被源服务器忽略,但会被缓存响应。

路径映射差异

URL路径映射是将URL路径与服务器上的资源(例如文件、脚本或命令执行)相关联的过程。不同的框架和技术使用一系列不同的映射样式。两种常见的样式是传统URL映射和RESTful URL映射。
传统的URL映射表示位于文件系统上的资源的直接路径。我们来看这样的一个示例:
http://example.com/path/in/filesystem/resource.html

  • http://example.com– 指向服务器

  • /path/in/filesystem/ – 代表服务器文件系统上的目录路径

  • resource.html – 是指定要访问的文件

相反,REST样式的URL并不直接匹配物理文件结构。他们将文件路径抽象为API的逻辑部分:
http://example.com/path/resource/param1/param2

  • http://example.com– 指向服务器

  • /path/resource/ – 代表一个资源的端点

  • param1和param2是服务器用来处理请求的路径参数

缓存和源服务器将URL路径映射到资源的方式存在差异,可能会导致Web缓存欺骗漏洞。考虑以下示例:
http://example.com/user/123/profile/wcd.css

  • 使用REST样式URL映射的源服务器可能会将其解释为对/user/123/profile端点的请求,并返回用户123的配置文件信息,忽略wcd.css作为非重要参数。

  • 使用传统URL映射的缓存可能会将其视为对位于/user/123下的/profile目录中名为wcd.css的文件的请求。它将URL路径解释为/user/123/profile/wcd.css。如果缓存配置为存储路径以.css结尾的请求的响应,它将缓存并提供配置文件信息,就像它是CSS文件一样。

利用路径映射差异

要测试源服务器如何将URL路径映射到资源,要将任意路径段添加到目标终端节点的URL。如果响应仍然包含与基本响应相同的敏感数据,则表明源服务器抽象了URL路径并忽略了添加的段。例如,如果将/api/orders/123修改为/api/orders/123/foo仍然返回订单信息,就会出现这种情况。
要测试缓存如何将URL路径映射到资源,我们需要修改路径以尝试通过添加静态资源扩展名来匹配缓存规则。例如,将/api/orders/123/foo更新为/api/orders/123/foo.js。如果响应被缓存,则表明:

  • 缓存解释带有静态资源扩展名的完整URL路径。

  • 有一个缓存规则来存储以.js结尾的请求的响应。

缓存可能具有基于特定静态资源扩展名的规则。尝试一系列扩展名,包括.css、.ico和.exe。
然后我们可以制作一个返回存储在缓存中的动态响应的URL。请注意,攻击仅限于测试的特定端点,因为源服务器通常对不同端点有不同的抽象规则。
Burp自带的扫描器会自动检测审计期间由于路径映射差异而导致的Web缓存欺骗漏洞。我们还可以使用Web Cache Deception Scanner插件来检测配置错误的Web缓存。

配套靶场:利用路径映射进行网络缓存欺骗

这道靶场的目标就是获取到carlos的API key,我们先登录一下测试用户,发现这个路径下会返回API key:

千百度
© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容