bbs论坛管理员后台后端未校验漏洞导致getshell的一点点分析和思考
字数 1418 2025-08-26 22:11:51
BBS论坛管理员后台后端未校验漏洞导致Getshell分析与防御
漏洞概述
本漏洞存在于一个开源BBS论坛系统中,由于管理员后台在系统设置功能中对文件上传后缀名校验不严格,导致攻击者可以通过修改允许上传的文件类型,上传恶意JSP文件并获取服务器权限。
受影响系统
- 项目地址: https://github.com/diyhi/bbs
- 受影响版本: 漏洞提交前的所有版本
- 环境要求: JDK1.8, Tomcat9.x, MySQL5.7
漏洞复现步骤
1. 普通用户测试
- 以普通用户(test)登录系统
- 尝试上传JSP文件 - 被系统拦截,不允许上传
2. 管理员权限利用
- 以admin用户登录后台
- 进入"系统设置" → "基础设置" → "话题编辑器"
- 修改"允许上传的文件后缀"字段,添加"jsp"后缀
- 保存设置(可通过抓包确认修改请求)
- 再次以普通用户身份上传JSP文件 - 上传成功并可执行
漏洞原理分析
代码流程
-
设置读取流程:
- 接口位置:
SystemSettingManageAction.java中的edit接口GET方法 - 调用
readRichTextAllowFileUploadFormat方法 - 最终从
richtext.properties配置文件中读取默认设置
- 接口位置:
-
设置保存流程:
- 接口位置:
SystemSettingManageAction.java中的edit接口POST方法 - 调用
updateSystemSetting方法 - 将修改后的配置直接存入数据库(而非配置文件)
- 数据库表:
systemsetting表
- 接口位置:
关键问题
-
前端显示误导:
- 修改成功后,前端仍然显示默认配置(从配置文件读取)
- 实际生效的是数据库中的配置,导致管理员误以为修改未成功
-
权限校验缺失:
- 后端未对上传文件类型进行二次校验
- 仅依赖前端配置进行过滤
-
配置存储不一致:
- 读取配置: 优先从配置文件
- 写入配置: 直接存入数据库
- 导致配置显示与实际生效值不一致
漏洞利用条件
- 获取管理员后台权限
- 系统使用默认配置或未严格限制上传文件类型
- 服务器未部署额外的WAF或文件上传防护措施
修复方案
临时缓解措施
- 限制后台管理权限,仅授权给必要人员
- 在服务器层面限制上传目录的执行权限
- 部署WAF规则拦截可疑的JSP文件上传
代码层面修复建议
-
统一配置存储:
// 修改配置读取逻辑,优先从数据库读取,其次从配置文件 String allowFormats = systemSettingService.findValueByKey("richTextAllowFileUploadFormat"); if(allowFormats == null) { allowFormats = // 从配置文件读取默认值 } -
增加后端校验:
// 在上传处理逻辑中添加严格的文件类型校验 public void uploadFile(File file, String filename) { String ext = FilenameUtils.getExtension(filename); if(!ALLOWED_EXTENSIONS.contains(ext.toLowerCase())) { throw new SecurityException("不允许的文件类型"); } // 继续上传流程 } -
配置同步机制:
- 确保前端显示的配置值与实际生效值一致
- 修改配置后立即刷新缓存
-
权限细化:
- 对系统设置修改操作进行权限分级
- 关键设置(如文件上传类型)需要超级管理员权限
审计建议
-
配置相关审计要点:
- 检查配置读取和存储是否一致
- 验证关键配置是否有默认安全值
- 确认配置修改是否需要权限验证
-
文件上传审计要点:
- 检查文件类型校验是否在后端实现
- 验证文件存储位置是否安全
- 确认上传文件是否有随机重命名
-
权限审计要点:
- 验证关键操作是否有权限控制
- 检查权限校验是否在服务端实现
- 确认不同角色权限隔离是否有效
总结
本漏洞展示了配置管理不一致和权限校验缺失可能导致的安全风险。开发人员应当:
- 保持配置读取和存储的一致性
- 对所有用户输入(包括配置文件)进行严格校验
- 关键安全控制应在服务端实现
- 权限系统应遵循最小权限原则
该案例也提醒安全测试人员,在测试配置修改类漏洞时,不应仅依赖界面反馈,而应通过实际功能测试验证修改是否生效。