Web Cache(网络缓存)在加快我们的浏览体验方面发挥着重要作用,因为它们保存了网页和其他资源的副本,以便用户可以更快访问相应内容。
但是,如果这些缓存成为黑客的工具,会发生什么情况呢?
让我们来了解一下缓存投毒,看看它是如何工作的,以及如何防范它。
1] 什么是网络缓存
缓存意味着是存储内容的副本,Web 缓存是指临时存储的网页副本或部分网页内容。
当我们访问网站时,浏览器可能会缓存某些元素,如图像和脚本。当下次访问同一网站时,浏览器就可以更快地加载相应内容。
缓存可加快网站访问速度,并且减少了必须通过网络传输的数据量。这使浏览效率更高,为用户提供更为流畅的体验。
缓存可以位于多个位置,这些缓存包括:
- 浏览器缓存:浏览器会保留最近访问的网页、图像和其他内容的副本
- CDN 缓存:CDN 将网络资源的副本存储在全球多个位置,这可确保用户访问距离最近的服务器,从而减少加载时间
- 反向代理缓存:反向代理服务器位于用户和 Web 服务器之间,它会缓存内容以减少服务器负载并缩短响应时间
网络缓存基于如下几条原则来工作:
- 过期时间:缓存内容要有一个生存时间 (TTL) 值,超过此 TTL 值后,缓存将被清除
- 验证机制:缓存需要同服务器核对存储的内容是否仍然有效或需要刷新
- 失效机制:如果网站的内容有更新,就会删除缓存并从服务器获取最新内容
2] 缓存投毒如何工作
缓存投毒是一种网络攻击方式,黑客会操纵网络缓存中存储的数据。使缓存的内容是有害或更改的版本,而不是真实的页面。
当用户请求此缓存内容时,就会收到被操纵的数据。这种攻击可能导致危险脚本在用户的浏览器上被运行。
图.1 DNS 注入示意图
在缓存投毒攻击中,黑客利用缓存系统存储内容的机制展开工作。以下是此攻击工作原理的简单说明:
- 攻击者首先确定网站上的哪些资源被缓存,他们根据 URL 或请求标头查找缓存可能存储的页面或资源
- 然后,攻击者精心制作包含有害内容的请求,此请求看起来像合法请求,从而得到缓存存储响应
- 服务器处理请求并返回缓存的响应,如果缓存服务器不检查请求,它将存储恶意内容
- 之后,当用户再请求缓存的资源时,缓存会提供恶意版本而不是合法版本
3] 缓存投毒的常用技术
缓存投毒利用了 Web 缓存机制中的不同漏洞,一些最常见的技术包括:
1、主机头攻击
Host Header 主机头会指定请求针对哪个域。攻击者可以更改此标头,让他们可以诱骗服务器缓存恶意响应。例如普通请求:
GET /resource HTTP/1.1 Host: www.example.com
恶意请求:
GET /resource HTTP/1.1 Host: attacker.com
如果缓存根据被操纵的主机存储响应,则”www.example.com”的所有用户都可能获得恶意内容。
2、HTTP 参数污染
攻击者可以将非法参数注入 URL,这会改变服务器行为并毒害缓存。例如正常的请求 URL 是:
https://www.example.com/page?id=123
恶意请求 URL 是:
https://www.example.com/page?id=123&malicious_flag=101
如果服务器不清理这些参数,它可能会缓存不同的内容。下一个访问正常 URL 的用户可能会收到有毒内容。
3、修改标头操作(Vary)
Vary 标头是 HTTP 响应标头,它告诉缓存如何根据某些请求标头存储 Web 资源的不同版本。
例如,如果服务器发送”Vary: User-Agent”标头,则意味着响应可能根据客户端的用户代理而有所不同。因此,缓存将为不同的用户代理存储资源的不同版本,比如一个用于桌面浏览器,另一个用于移动浏览器。
如果未正确检查”Vary”标头,攻击者就可以操纵请求标头来投毒缓存。
例如,攻击者可以使用操纵的”User-Agent”标头制作请求,这可能导致为下一个用户缓存恶意内容。
4] 如何防范缓存投毒
我们初步了解了缓存投毒的工作原理后,让我们看看如何防范它:
1、正确的输入验证
始终清理和检查用户的输入,尤其是请求标头和 URL 参数。这可以阻止攻击者将有害内容注入缓存请求。
2、使用安全缓存标头
正确设置”Cache-Control”和”Expires”等缓存标头,以避免缓存敏感数据。对动态或敏感内容使用”no-cache”、”no-stor””和”must-revalidate”等标头。
3、控制缓存键设置
正确设置缓存键,以避免缓存具有用户特定参数的响应。不要使用攻击者可以轻松操纵的请求标头或查询参数。
4、实施 HTTPS
使用 HTTPS 有助于防止攻击者拦截和修改请求和响应。HTTPS 还可以降低缓存投毒攻击的风险,因为它可以确保数据完整性。
缓存投毒对 Web 应用程序和用户构成重大风险。黑客可以操纵缓存内容来提供恶意数据或窃取敏感信息。
我们可以通过了解缓存投毒的工作原理并采取适当的预防措施来保护 Web 应用程序免受缓存投毒的影响。通过正确的方法,我们可以确保为用户提供更安全的浏览体验。