Web缓存欺骗漏洞(Web Cache Deception)是一种利用不安全的缓存机制来泄露用户敏感信息的攻击方式。攻击者通过操控请求URL诱导缓存系统将敏感信息缓存并对其他用户公开,可能导致用户数据泄露等严重问题。
漏洞原理
缓存:
现代大多数Web应用会在应用前置CDN或缓存代理,再通过URL来决定是否缓存内容。下面这里放一个Nginx的例子
location ~* \.(css|js|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {proxy_cache cache;proxy_cache_valid 200 3m;proxy_cache_use_stale error timeout updating;......}
这段代码是 Nginx 配置的一部分,用于处理静态资源(如 CSS、JS、图片等)的缓存和代理。它定义了针对某些文件类型(通常是静态文件)的请求如何通过 Nginx 转发到后端的web应用,并缓存这些文件以提高性能。
location
:定义一个匹配规则,匹配请求路径中的文件类型。~*
:表示正则匹配,且不区分大小写。\.(css|js|...)
:匹配文件扩展名为 CSS、JS、PNG 等静态资源。proxy_cache cache
:启用代理缓存,使用名为cache
的缓存区域。proxy_cache_valid
:当后端返回 HTTP 200 响应时,缓存的有效时间为 3 分钟。
Web的路径规则:
这里我们写一个Go语言的Web应用的一部分示例,这个应用定义了一个/profile
接口:
router := gin.Default()
router.GET("/profile*", profileHandler)
router.Run(":8080")
...
接口的处理是这样的,通过Token获取用户名再获取用户信息,以确保用户信息的安全。
func profileHandler(c *gin.Context) {//从Token中获取用户名username, err := GetUsernameFromToken(c)//获取用户信息userinfo,err := GetUserInfo(username)if err != nil { c.JSON(http.StatusUnauthorized, gin.H{ "status": "error", "message": err.Error()}) return }c.JSON(http.StatusOK, gin.H{"status": "success","data": userinfo )
}
利用方式
- 首先受害者是已经登录的状态
- 攻击者发送链接:
http://*****.com/profile***********.css
- 受害者访问攻击者构造的链接,受害者的敏感数据将被Nginx缓存。
- 攻击者访问其链接,因为Nginx会将其视为一个css文件,对其进行缓存,因此所有人都可以访问。