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. 普通用户测试

  1. 以普通用户(test)登录系统
  2. 尝试上传JSP文件 - 被系统拦截,不允许上传

2. 管理员权限利用

  1. 以admin用户登录后台
  2. 进入"系统设置" → "基础设置" → "话题编辑器"
  3. 修改"允许上传的文件后缀"字段,添加"jsp"后缀
  4. 保存设置(可通过抓包确认修改请求)
  5. 再次以普通用户身份上传JSP文件 - 上传成功并可执行

漏洞原理分析

代码流程

  1. 设置读取流程:

    • 接口位置: SystemSettingManageAction.java中的edit接口GET方法
    • 调用readRichTextAllowFileUploadFormat方法
    • 最终从richtext.properties配置文件中读取默认设置
  2. 设置保存流程:

    • 接口位置: SystemSettingManageAction.java中的edit接口POST方法
    • 调用updateSystemSetting方法
    • 将修改后的配置直接存入数据库(而非配置文件)
    • 数据库表: systemsetting

关键问题

  1. 前端显示误导:

    • 修改成功后,前端仍然显示默认配置(从配置文件读取)
    • 实际生效的是数据库中的配置,导致管理员误以为修改未成功
  2. 权限校验缺失:

    • 后端未对上传文件类型进行二次校验
    • 仅依赖前端配置进行过滤
  3. 配置存储不一致:

    • 读取配置: 优先从配置文件
    • 写入配置: 直接存入数据库
    • 导致配置显示与实际生效值不一致

漏洞利用条件

  1. 获取管理员后台权限
  2. 系统使用默认配置或未严格限制上传文件类型
  3. 服务器未部署额外的WAF或文件上传防护措施

修复方案

临时缓解措施

  1. 限制后台管理权限,仅授权给必要人员
  2. 在服务器层面限制上传目录的执行权限
  3. 部署WAF规则拦截可疑的JSP文件上传

代码层面修复建议

  1. 统一配置存储:

    // 修改配置读取逻辑,优先从数据库读取,其次从配置文件
    String allowFormats = systemSettingService.findValueByKey("richTextAllowFileUploadFormat");
    if(allowFormats == null) {
        allowFormats = // 从配置文件读取默认值
    }
    
  2. 增加后端校验:

    // 在上传处理逻辑中添加严格的文件类型校验
    public void uploadFile(File file, String filename) {
        String ext = FilenameUtils.getExtension(filename);
        if(!ALLOWED_EXTENSIONS.contains(ext.toLowerCase())) {
            throw new SecurityException("不允许的文件类型");
        }
        // 继续上传流程
    }
    
  3. 配置同步机制:

    • 确保前端显示的配置值与实际生效值一致
    • 修改配置后立即刷新缓存
  4. 权限细化:

    • 对系统设置修改操作进行权限分级
    • 关键设置(如文件上传类型)需要超级管理员权限

审计建议

  1. 配置相关审计要点:

    • 检查配置读取和存储是否一致
    • 验证关键配置是否有默认安全值
    • 确认配置修改是否需要权限验证
  2. 文件上传审计要点:

    • 检查文件类型校验是否在后端实现
    • 验证文件存储位置是否安全
    • 确认上传文件是否有随机重命名
  3. 权限审计要点:

    • 验证关键操作是否有权限控制
    • 检查权限校验是否在服务端实现
    • 确认不同角色权限隔离是否有效

总结

本漏洞展示了配置管理不一致和权限校验缺失可能导致的安全风险。开发人员应当:

  1. 保持配置读取和存储的一致性
  2. 对所有用户输入(包括配置文件)进行严格校验
  3. 关键安全控制应在服务端实现
  4. 权限系统应遵循最小权限原则

该案例也提醒安全测试人员,在测试配置修改类漏洞时,不应仅依赖界面反馈,而应通过实际功能测试验证修改是否生效。

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文件上传 代码层面修复建议 统一配置存储 : 增加后端校验 : 配置同步机制 : 确保前端显示的配置值与实际生效值一致 修改配置后立即刷新缓存 权限细化 : 对系统设置修改操作进行权限分级 关键设置(如文件上传类型)需要超级管理员权限 审计建议 配置相关审计要点 : 检查配置读取和存储是否一致 验证关键配置是否有默认安全值 确认配置修改是否需要权限验证 文件上传审计要点 : 检查文件类型校验是否在后端实现 验证文件存储位置是否安全 确认上传文件是否有随机重命名 权限审计要点 : 验证关键操作是否有权限控制 检查权限校验是否在服务端实现 确认不同角色权限隔离是否有效 总结 本漏洞展示了配置管理不一致和权限校验缺失可能导致的安全风险。开发人员应当: 保持配置读取和存储的一致性 对所有用户输入(包括配置文件)进行严格校验 关键安全控制应在服务端实现 权限系统应遵循最小权限原则 该案例也提醒安全测试人员,在测试配置修改类漏洞时,不应仅依赖界面反馈,而应通过实际功能测试验证修改是否生效。