深入剖析JeeSite框架中的任意文件下载漏洞实战

张开发
2026/4/6 11:07:50 15 分钟阅读

分享文章

深入剖析JeeSite框架中的任意文件下载漏洞实战
1. 漏洞背景与发现过程第一次接触JeeSite框架是在去年的一次安全测试中。当时客户系统使用的是JeeSite 4.x版本我在测试文件下载功能时发现了一个有趣的现象下载接口的fileUrl参数居然可以直接传入系统绝对路径。这个发现让我立刻意识到可能存在任意文件下载漏洞。具体测试过程是这样的我先用正常方式下载了一个PDF文档然后尝试修改fileUrl参数值为/WEB-INF/web.xml。没想到服务器真的返回了这个配置文件的内容。这种漏洞在Java Web应用中其实很常见主要是由于开发人员没有对用户传入的文件路径做严格校验导致的。注意任意文件下载漏洞的危害性经常被低估实际上它可能成为整个系统沦陷的突破口。2. 漏洞利用实战技巧2.1 基础探测方法在确认存在漏洞后我通常会按照以下步骤进行深入利用首先尝试读取WEB-INF/web.xml这个文件相当于Java Web应用的户口本接着查找数据库配置文件常见路径包括/WEB-INF/classes/jdbc.properties/WEB-INF/classes/config.properties/WEB-INF/classes/application.properties但在这次测试中前两个路径都没能成功读取。这时候就需要一些经验了——我注意到请求Cookie中包含jeesite.session.id字段这提示系统可能使用了JeeSite框架。2.2 JeeSite特定利用通过查阅JeeSite文档我发现它的核心配置文件路径比较特殊/WEB-INF/classes/jeesite.properties用这个路径尝试后果然成功下载到了配置文件。这个文件里通常包含以下关键信息数据库连接信息包括明文密码文件上传路径配置系统管理员默认账号第三方服务API密钥在实际案例中我就是通过这个文件获取到了Oracle数据库的jdbc连接字符串格式如下# 数据库设置 jdbc.typeoracle jdbc.driveroracle.jdbc.OracleDriver jdbc.urljdbc:oracle:thin:127.0.0.1:1521:orcl jdbc.usernamesystem jdbc.passwordAdmin1233. 漏洞深入利用3.1 数据库连接实战拿到数据库凭证后我立即使用SQLPlus进行连接测试sqlplus system/Admin123127.0.0.1:1521/orcl连接成功后就可以查询敏感数据了。这里有个实用技巧JeeSite默认会把用户密码加密存储但加密密钥通常就在jeesite.properties文件中# 安全密钥 shiro.loginSubmit.secretKey0x1234567890abcdef有了这个密钥理论上就可以解密数据库中的用户密码。3.2 系统提权路径除了数据库配置文件中还可能泄露以下关键信息短信平台凭证用于发送验证码的账号密码邮件服务器配置SMTP服务的登录凭证第三方API密钥如支付接口、地图服务等文件存储路径可能包含备份文件或日志文件我曾经在一个案例中通过这个漏洞获取到了阿里云OSS的AccessKey直接导致了整个云存储的数据泄露。4. 防御方案与修复建议4.1 临时修复措施如果暂时无法升级框架可以采用以下应急方案在下载接口添加白名单校验String safePath /upload/; if(!fileUrl.startsWith(safePath)){ throw new IllegalArgumentException(非法文件路径); }使用文件ID代替真实路径// 使用文件ID查询真实路径 String realPath fileService.getPathById(fileId);4.2 长期解决方案从根本上解决这个问题建议升级到JeeSite最新版本目前是5.x实现文件下载的安全校验逻辑校验文件路径是否在允许范围内对用户传入参数进行规范化处理记录所有下载操作日志最小化配置文件权限将敏感配置移出WEB-INF目录使用环境变量替代明文密码对配置文件进行加密处理5. 漏洞挖掘经验分享在实际测试中我发现JeeSite框架还有几个值得关注的敏感路径/WEB-INF/classes/spring-context.xmlSpring容器配置/WEB-INF/views/error/500.html可能包含调试信息/WEB-INF/logback.xml日志配置可能泄露日志路径有个小技巧当常规路径不奏效时可以尝试以下变体/WEB-INF/classes/../web.xml /WEB-INF\web.xml不同操作系统对路径解析的差异有时能绕过简单的防护。最后提醒一点在渗透测试时获取到数据库密码后不要立即进行修改操作这可能会影响业务系统正常运行。应该先评估风险等级然后按照规范的流程进行处理。

更多文章