用友NC-CLOUD 任意文件上传和SQL注入漏洞分析
字数 1767 2025-08-24 07:48:22

用友NC-CLOUD 任意文件上传和SQL注入漏洞分析教学文档

漏洞概述

用友NC Cloud是一款企业级管理软件,在其ncchr模块中存在两个严重安全漏洞:

  1. 安全特性绕过漏洞:通过构造特定的accesstokenNCC可以绕过登录校验
  2. 任意文件上传漏洞:绕过鉴权后可上传任意文件到服务器
  3. SQL注入漏洞:多处存在未过滤的SQL查询导致注入风险

漏洞1:登录校验绕过分析

漏洞位置

LoginFilter.class类中的validAccessToken方法存在校验缺陷

技术细节

  1. 路由分析

    • 通过web.xml查看路由信息,发现ncchr路径由特定应用服务处理
    • 在WEB-INF/lib中找到相应jar包并反编译分析
  2. 过滤器分析

    • LoginFilter继承自OncePerRequestFilter,确保每个请求只被过滤一次
    • 定义了多个静态常量字符串用于识别鉴权请求参数
  3. 过滤器生命周期

    • 实例化:Servlet容器启动时创建
    • 初始化:调用init方法
    • 请求处理:匹配路径时调用doFilter方法
    • 销毁:容器关闭时调用destroy方法
  4. 关键校验方法

    filterChain.doFilter(request, response);  // 传递请求和响应
    

    请求传递条件(至少一个为true):

    • validSession(request):检查NCCloudSessionID cookie
    • validToken(request):检查ACCESSTOKEN
    • validAccessToken(request):检查ACCESSTKEN_NCC(漏洞点)
    • isExcludedPage(request):检查是否为排除页面
  5. validAccessToken方法缺陷

    • 获取HTTP请求中的accessTokenNcc
    • 使用JwtTokenUtil进行解密
    • 默认密钥硬编码在代码中(可自行生成有效JWT)
    • 解密成功后调用LoginHelper.ensureSecurity()设置安全令牌

利用方法

  1. 构造包含有效ACCESSTKEN_NCC头的请求
  2. 使用默认密钥生成有效JWT令牌
  3. 绕过鉴权访问ncchr路由

漏洞2:任意文件上传分析

漏洞位置

/ncchr/pm/fb/attachment.java中的uploadChunk方法

技术细节

  1. 请求映射

    @RequestMapping(value = {"/uploadChunk"}, method = {RequestMethod.POST})
    public Object uploadChunk(HttpServletRequest request, MultipartFile file, Integer chunk, Integer chunks, String fileGuid, String operation)
    
  2. 上传处理

    • fileGuid参数未做过滤处理
    • 调用attachmentService.uploadAttachment方法
    • 构造临时文件路径:
      SpringHelper.getRealPath() + File.separator + AppContext.getContext().getScope() + 文件名
      
  3. 漏洞成因

    • 文件名完全可控
    • 可通过../进行目录穿越
    • 可上传JSP等可执行文件到web目录

利用方法

  1. 构造POST请求到/ncchr/pm/fb/attachment/uploadChunk
  2. 设置恶意文件名(如../../webapps/ROOT/shell.jsp
  3. 上传webshell获取服务器权限

漏洞3:SQL注入分析

漏洞位置

多处模糊查询实现类中存在未过滤的SQL拼接

技术细节

  1. 典型漏洞代码

    public Page<SimpleStaff> querySimpleStaffPageByName(String name, String orgPk, Pageable pageable) {
        String condition = "1=1";
        if (StringUtils.isNotBlank(name)) {
            condition = condition + " and name like '%" + name + "%'";
        }
        // 其他条件处理
        return this.queryCommonSimpleStaffPage(condition, orgPk, pageable);
    }
    
  2. 查询链

    • querySimpleStaffPageByNamequeryCommonSimpleStaffPagequeryCommonSimpleStaffList
    • 最终使用IPsndocQryService执行查询
  3. 注入接口示例

    • queryStaffByName接口直接调用存在漏洞的方法
    • name参数无任何过滤

利用方法

  1. 构造恶意name参数:
    test' AND (SELECT * FROM (SELECT(SLEEP(5)))a)-- 
    
  2. 使用sqlmap自动化检测:
    sqlmap -u "http://target/ncchr/xxx/queryStaffByName" --data="name=test" --level=5 --risk=3
    

修复建议

  1. 登录校验修复

    • 修改默认JWT密钥
    • 增加accesstokenNCC的时效性校验
    • 实现多因素认证
  2. 文件上传修复

    • 限制上传文件类型
    • 对文件名进行规范化处理
    • 禁止路径穿越字符
    • 文件存储在非web可访问目录
  3. SQL注入修复

    • 使用预编译语句
    • 实现参数化查询
    • 对所有输入参数进行严格过滤
    • 使用ORM框架替代原生SQL
  4. 其他建议

    • 定期进行安全审计
    • 及时更新安全补丁
    • 实施最小权限原则

总结

用友NC Cloud的这三个漏洞组合利用可导致严重的安全后果:攻击者可先绕过登录校验,然后上传webshell获取服务器控制权,最后通过SQL注入获取数据库敏感信息。企业用户应及时更新补丁,并按照修复建议加强系统安全防护。

用友NC-CLOUD 任意文件上传和SQL注入漏洞分析教学文档 漏洞概述 用友NC Cloud是一款企业级管理软件,在其ncchr模块中存在两个严重安全漏洞: 安全特性绕过漏洞 :通过构造特定的accesstokenNCC可以绕过登录校验 任意文件上传漏洞 :绕过鉴权后可上传任意文件到服务器 SQL注入漏洞 :多处存在未过滤的SQL查询导致注入风险 漏洞1:登录校验绕过分析 漏洞位置 LoginFilter.class 类中的 validAccessToken 方法存在校验缺陷 技术细节 路由分析 : 通过web.xml查看路由信息,发现ncchr路径由特定应用服务处理 在WEB-INF/lib中找到相应jar包并反编译分析 过滤器分析 : LoginFilter 继承自 OncePerRequestFilter ,确保每个请求只被过滤一次 定义了多个静态常量字符串用于识别鉴权请求参数 过滤器生命周期 : 实例化:Servlet容器启动时创建 初始化:调用init方法 请求处理:匹配路径时调用doFilter方法 销毁:容器关闭时调用destroy方法 关键校验方法 : 请求传递条件(至少一个为true): validSession(request) :检查NCCloudSessionID cookie validToken(request) :检查ACCESSTOKEN validAccessToken(request) :检查ACCESSTKEN_ NCC(漏洞点) isExcludedPage(request) :检查是否为排除页面 validAccessToken方法缺陷 : 获取HTTP请求中的accessTokenNcc 使用 JwtTokenUtil 进行解密 默认密钥硬编码在代码中(可自行生成有效JWT) 解密成功后调用 LoginHelper.ensureSecurity() 设置安全令牌 利用方法 构造包含有效ACCESSTKEN_ NCC头的请求 使用默认密钥生成有效JWT令牌 绕过鉴权访问ncchr路由 漏洞2:任意文件上传分析 漏洞位置 /ncchr/pm/fb/attachment.java 中的 uploadChunk 方法 技术细节 请求映射 : 上传处理 : fileGuid 参数未做过滤处理 调用 attachmentService.uploadAttachment 方法 构造临时文件路径: 漏洞成因 : 文件名完全可控 可通过 ../ 进行目录穿越 可上传JSP等可执行文件到web目录 利用方法 构造POST请求到 /ncchr/pm/fb/attachment/uploadChunk 设置恶意文件名(如 ../../webapps/ROOT/shell.jsp ) 上传webshell获取服务器权限 漏洞3:SQL注入分析 漏洞位置 多处模糊查询实现类中存在未过滤的SQL拼接 技术细节 典型漏洞代码 : 查询链 : querySimpleStaffPageByName → queryCommonSimpleStaffPage → queryCommonSimpleStaffList 最终使用 IPsndocQryService 执行查询 注入接口示例 : queryStaffByName 接口直接调用存在漏洞的方法 对 name 参数无任何过滤 利用方法 构造恶意name参数: 使用sqlmap自动化检测: 修复建议 登录校验修复 : 修改默认JWT密钥 增加accesstokenNCC的时效性校验 实现多因素认证 文件上传修复 : 限制上传文件类型 对文件名进行规范化处理 禁止路径穿越字符 文件存储在非web可访问目录 SQL注入修复 : 使用预编译语句 实现参数化查询 对所有输入参数进行严格过滤 使用ORM框架替代原生SQL 其他建议 : 定期进行安全审计 及时更新安全补丁 实施最小权限原则 总结 用友NC Cloud的这三个漏洞组合利用可导致严重的安全后果:攻击者可先绕过登录校验,然后上传webshell获取服务器控制权,最后通过SQL注入获取数据库敏感信息。企业用户应及时更新补丁,并按照修复建议加强系统安全防护。