当前位置: 首页 > article >正文

Web安全:缓存欺骗攻击;基于缓存、CDN的新型Web漏洞

基于缓存、CDN的新型Web漏洞

    • 漏洞原理
    • 利用方式
    • 解决方法

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 )
}

利用方式

  1. 首先受害者是已经登录的状态
  2. 攻击者发送链接:http://*****.com/profile***********.css
  3. 受害者访问攻击者构造的链接,受害者的敏感数据将被Nginx缓存。
  4. 攻击者访问其链接,因为Nginx会将其视为一个css文件,对其进行缓存,因此所有人都可以访问。

解决方法

  • 严格验证URL的路径和扩展名,拒绝非法请求。
  • 配置CDN/中间件的缓存规则,禁止对用户敏感页面的缓存。
  • 确保敏感页面的响应头中包含:Cache-Control: no-store, no-cache, must-revalidate

http://www.kler.cn/a/516183.html

相关文章:

  • 中国综合算力指数(2024年)报告汇总PDF洞察(附原数据表)
  • 双指针+前缀和习题(一步步讲解)
  • 解释 RESTful API,以及如何使用它构建 web 应用程序
  • K8S中Service详解(一)
  • mapbox加载geojson,鼠标移入改变颜色,设置样式以及vue中的使用
  • 5.SQLAlchemy对两张有关联关系表查询
  • OpenCV图像显示imshow()函数——详解
  • Sharding-JDBC 5.4.1+SpringBoot3.4.1+MySQL8.4.1 使用案例
  • 云计算中的微服务架构是什么
  • autogen 中的 Teams 示例
  • 【数据结构进阶】红黑树超详解 + 实现(附源码)
  • 【探索 Kali Linux】渗透测试与网络安全的终极操作系统
  • 使用github提交Pull Request的完整流程
  • 差分进化算法 (Differential Evolution) 算法详解及案例分析
  • HTML5 新的 Input 类型详解
  • 计算机图形学:实验二 三维模型读取与控制
  • C++ 入门速通1【黑马】
  • 52.this.DataContext = new UserViewModel(); C#例子 WPF例子
  • Python数据类型与操作
  • matlab计算功率谱的四种方法
  • 【Linux】Linux的基本指令(1),包括ls、pwd、cd、touch、mkdir、rm、man、cp、mv、cat
  • Vue2:使用sortablejs实现el-table中行拖拽调整顺序
  • 进程优先级
  • C语言-内存管理
  • 一个面向领域的直播平台开源!
  • Codeforces Round 1000 (Div. 2)(A-D)