用友NC-CLOUD 任意文件上传和SQL注入漏洞分析
字数 1767 2025-08-24 07:48:22
用友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方法
-
关键校验方法:
filterChain.doFilter(request, response); // 传递请求和响应请求传递条件(至少一个为true):
validSession(request):检查NCCloudSessionID cookievalidToken(request):检查ACCESSTOKENvalidAccessToken(request):检查ACCESSTKEN_NCC(漏洞点)isExcludedPage(request):检查是否为排除页面
-
validAccessToken方法缺陷:
- 获取HTTP请求中的accessTokenNcc
- 使用
JwtTokenUtil进行解密 - 默认密钥硬编码在代码中(可自行生成有效JWT)
- 解密成功后调用
LoginHelper.ensureSecurity()设置安全令牌
利用方法
- 构造包含有效ACCESSTKEN_NCC头的请求
- 使用默认密钥生成有效JWT令牌
- 绕过鉴权访问ncchr路由
漏洞2:任意文件上传分析
漏洞位置
/ncchr/pm/fb/attachment.java中的uploadChunk方法
技术细节
-
请求映射:
@RequestMapping(value = {"/uploadChunk"}, method = {RequestMethod.POST}) public Object uploadChunk(HttpServletRequest request, MultipartFile file, Integer chunk, Integer chunks, String fileGuid, String operation) -
上传处理:
fileGuid参数未做过滤处理- 调用
attachmentService.uploadAttachment方法 - 构造临时文件路径:
SpringHelper.getRealPath() + File.separator + AppContext.getContext().getScope() + 文件名
-
漏洞成因:
- 文件名完全可控
- 可通过
../进行目录穿越 - 可上传JSP等可执行文件到web目录
利用方法
- 构造POST请求到
/ncchr/pm/fb/attachment/uploadChunk - 设置恶意文件名(如
../../webapps/ROOT/shell.jsp) - 上传webshell获取服务器权限
漏洞3:SQL注入分析
漏洞位置
多处模糊查询实现类中存在未过滤的SQL拼接
技术细节
-
典型漏洞代码:
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); } -
查询链:
querySimpleStaffPageByName→queryCommonSimpleStaffPage→queryCommonSimpleStaffList- 最终使用
IPsndocQryService执行查询
-
注入接口示例:
queryStaffByName接口直接调用存在漏洞的方法- 对
name参数无任何过滤
利用方法
- 构造恶意name参数:
test' AND (SELECT * FROM (SELECT(SLEEP(5)))a)-- - 使用sqlmap自动化检测:
sqlmap -u "http://target/ncchr/xxx/queryStaffByName" --data="name=test" --level=5 --risk=3
修复建议
-
登录校验修复:
- 修改默认JWT密钥
- 增加accesstokenNCC的时效性校验
- 实现多因素认证
-
文件上传修复:
- 限制上传文件类型
- 对文件名进行规范化处理
- 禁止路径穿越字符
- 文件存储在非web可访问目录
-
SQL注入修复:
- 使用预编译语句
- 实现参数化查询
- 对所有输入参数进行严格过滤
- 使用ORM框架替代原生SQL
-
其他建议:
- 定期进行安全审计
- 及时更新安全补丁
- 实施最小权限原则
总结
用友NC Cloud的这三个漏洞组合利用可导致严重的安全后果:攻击者可先绕过登录校验,然后上传webshell获取服务器控制权,最后通过SQL注入获取数据库敏感信息。企业用户应及时更新补丁,并按照修复建议加强系统安全防护。