用友NC文件上传漏洞复现:从原理到RCE实战解析
1. 项目概述与核心价值最近在安全圈里用友NC的uploadControl/uploadFile接口引发的远程代码执行RCE漏洞讨论热度很高。这个漏洞的典型之处在于它并非一个简单的、孤立的文件上传点而是将“文件上传”这个常见功能与Java Web应用特定的处理逻辑、路径解析缺陷以及潜在的代码执行环境串联了起来最终形成了一条完整的攻击链。对于从事渗透测试、红队评估或应用安全研究的朋友来说这类漏洞的复现与分析极具学习价值。它不仅能让你理解一个高危漏洞从发现到利用的完整生命周期更能深刻体会到在复杂企业级应用中一个看似普通的业务功能点是如何演变成整个系统“命门”的。简单来说这个漏洞允许攻击者通过构造特定的HTTP请求向用友NC系统上传一个包含恶意代码的JSP文件并利用系统对上传文件路径的解析或处理逻辑缺陷使得该文件能够被服务器端的Java引擎如Tomcat、WebLogic等解析执行从而在目标服务器上执行任意系统命令。这相当于拿到了服务器的最高控制权危害等级为“严重”。本文将从一个实战复现者的角度带你一步步拆解这个漏洞的原理、定位利用点、构造Payload并分享在复现过程中可能遇到的坑以及排查技巧。无论你是想搭建环境亲自验证还是单纯想理解其技术机理这篇内容都会提供详实的参考。2. 漏洞原理深度解析要成功复现一个漏洞死记硬背利用步骤是远远不够的。我们必须先吃透其背后的原理这样才能在遇到环境差异或防护措施时灵活调整攻击策略。2.1 漏洞触发点uploadControl/uploadFile 接口用友NC作为一款大型的ERP系统提供了大量的Web服务接口以供前端调用。uploadControl和uploadFile通常是与文件上传相关的Servlet或Action。漏洞的核心在于这些接口在对用户上传的文件进行处理时存在两处关键缺陷文件类型校验不严或可绕过接口可能只检查了文件扩展名如.jpg,.png或者检查逻辑存在缺陷导致攻击者可以通过修改HTTP请求包中的Content-Type、在文件名中添加特殊字符如test.jsp%00.jpg或使用双扩展名如test.jsp.jpg等方式将包含Java代码的.jsp文件成功上传至服务器。上传路径可控或可预测更致命的问题是上传后的文件存储路径可能直接或间接地处于Web应用的可访问目录下。例如文件被上传到了Web根目录如webapps/nc_web/的某个子目录或者通过某些参数如path,filepath可以控制或影响最终存储路径。这使得攻击者上传的恶意JSP文件能够通过一个确定的URL被直接访问。2.2 从文件上传到RCE的跨越仅仅能上传JSP文件还不等于RCE。这里需要一个关键的“跳板”服务器需要将上传的JSP文件当作动态脚本进行解析执行。在标准的Java Web应用中只有放置在特定目录如Web应用的根目录或其子目录下且扩展名为.jsp或.jspx的文件才会被Servlet容器如Tomcat的JSP引擎处理。因此漏洞的完整链条是薄弱的文件上传校验 将文件上传至Web可访问目录 可访问的恶意JSP脚本 远程代码执行。攻击者在上传的JSP文件中写入利用Java运行时执行系统命令的代码例如使用Runtime.getRuntime().exec(“whoami”)一旦该JSP文件被访问其中的代码就会在服务器端执行。2.3 关联组件与依赖环境的影响在复现时需要特别注意用友NC的版本和其运行的中间件环境。不同版本的NC其接口路径、参数名、过滤规则可能存在差异。同时中间件Tomcat, WebLogic, JBoss等的版本和配置也会影响利用方式。例如某些中间件默认禁止访问特定目录下的JSP文件或者有额外的安全过滤器。了解这些背景信息有助于在复现失败时快速定位问题所在。注意本文讨论的漏洞细节仅用于合法的安全研究、授权测试和教育学习。未经授权对任何系统进行测试或攻击都是非法行为。3. 复现环境搭建与前期准备“工欲善其事必先利其器”。一个贴近真实环境的复现场景能让我们更准确地理解漏洞。3.1 靶机环境搭建理想情况下我们需要一个存在漏洞的用友NC版本。由于官方已发布补丁获取原始的漏洞版本可能需要从历史版本或特定的测试环境中寻找。请务必在隔离的虚拟机或专属网络环境中进行操作切勿影响任何生产或公共系统。获取漏洞版本寻找包含漏洞的用友NC安装包例如根据漏洞公告中提及的受影响版本范围。这通常是一个庞大的安装程序。安装Java环境用友NC通常依赖特定版本的JDK如JDK 1.6或1.7。需要预先安装并配置好JAVA_HOME环境变量。安装数据库NC系统通常需要后端数据库如Oracle, SQL Server。安装并创建好所需的数据库实例、用户和密码。安装中间件根据NC的安装指引安装对应的应用服务器如Tomcat或WebLogic并进行基本配置。安装与初始化NC运行NC安装程序按照向导配置数据库连接、中间件路径、管理员账号等信息。完成安装后启动应用服务。搭建过程可能比较复杂会遇到各种依赖问题。一个常见的捷径是使用安全研究人员或社区打包好的漏洞环境虚拟机镜像如某些Vulhub或自主构建的靶场。这能极大简化环境准备步骤让你快速进入漏洞利用阶段。3.2 攻击机工具准备在攻击机通常是你的Kali Linux或日常开发机上需要准备以下工具Burp Suite Professional/Community用于拦截、修改和重放HTTP请求是构造上传Payload的核心工具。社区版足以完成大部分工作。浏览器用于访问目标系统触发请求。中国菜刀/C刀/蚁剑等Webshell管理工具可选但重要一旦上传JSP Webshell成功可以使用这些工具进行图形化连接和管理执行命令、上传下载文件等操作更为方便。请注意这些工具应仅用于授权的安全测试。简单的JSP Webshell代码准备一段用于上传的JSP代码。例如一个最基础的执行命令的Webshell% page importjava.util.*,java.io.*% % String cmd request.getParameter(cmd); if (cmd ! null) { Process p Runtime.getRuntime().exec(cmd); OutputStream os p.getOutputStream(); InputStream in p.getInputStream(); DataInputStream dis new DataInputStream(in); String disr dis.readLine(); while ( disr ! null ) { out.println(disr); disr dis.readLine(); } } %将上述代码保存为一个文本文件如shell.jsp。4. 漏洞利用步骤实操详解现在我们进入最核心的实操环节。假设目标NC地址为http://192.168.1.100:8080。4.1 信息收集与接口探测首先我们需要找到确切的漏洞接口地址。访问系统用浏览器打开NC的登录页面例如http://192.168.1.100:8080。你可能需要先以默认或已知的弱口令登录系统因为文件上传功能通常位于已认证的业务模块内。开启代理在浏览器中配置代理指向Burp Suite如127.0.0.1:8080并打开Burp的拦截功能Intercept is on。触发文件上传操作在NC系统中寻找任何涉及文件上传的功能点。这可能是“附件上传”、“图片上传”、“文档导入”等。点击上传按钮选择一个无害的文件如test.txt。拦截与分析请求Burp会拦截到上传请求。仔细观察这个请求URL路径很可能包含uploadControl、uploadFile、UploadServlet等关键词。例如可能是/nc_web/uploadControl/uploadFile或/servlet/UploadFile。请求方法通常是POST。Content-Type通常是multipart/form-data这是文件上传的标准格式。参数注意观察除了文件流file之外的参数特别是那些可能指向存储路径的参数如path、filepath、folder、fileType等。这些参数是后续利用的关键。4.2 构造并发送恶意上传请求在Burp的Proxy - Intercept标签页中我们已经拦截到了正常的上传请求。现在我们需要修改它使其上传我们的JSP Webshell。修改文件名在multipart/form-data的正文部分找到代表文件名的部分。将filename”test.txt”修改为filename”shell.jsp”。这是最直接的一步测试系统是否仅校验扩展名。修改文件内容将文件内容部分Content-Type下面跟着的原始文本内容完全替换为我们之前准备好的JSP Webshell代码。尝试路径穿越可选但常用如果请求中存在像path或filepath这样的参数可以尝试进行目录遍历攻击。例如如果参数值为./upload/可以尝试修改为../../webapps/nc_web/或../试图让文件上传到Web根目录。常见的Payload如../../../。发送请求关闭Burp的拦截Intercept is off或者直接在前一步的拦截界面点击 “Forward”将修改后的请求发送出去。分析响应在Burp的Proxy - HTTP history中找到刚才发送的请求查看服务器的响应。重点关注以下几点响应状态码200通常意味着请求被接受但不一定成功上传。403、500可能意味着被拦截或出错。响应内容仔细阅读响应体。成功的上传可能会返回文件的存储路径、访问URL或一个成功的状态码如{“status”:”success”, “path”:”/upload/xxx.jsp”}。失败的响应可能会包含错误信息如“文件类型不允许”、“路径错误”等这些信息是调整Payload的重要线索。4.3 访问Webshell并执行命令如果响应信息暗示上传成功并给出了文件路径例如/upload/202405/shell.jsp接下来就是验证RCE是否生效。拼接访问URL根据返回的路径在浏览器中直接访问这个JSP文件。例如http://192.168.1.100:8080/upload/202405/shell.jsp。执行命令访问该URL后如果页面空白或没有报错说明JSP已被服务器加载。此时在URL后添加参数来执行命令例如http://192.168.1.100:8080/upload/202405/shell.jsp?cmdwhoami。如果页面正常返回了当前系统用户的名称如nt authority\system或root那么恭喜RCE漏洞复现成功如果返回了错误信息如500内部错误可能是命令执行环境有问题或者Webshell代码与目标环境不兼容如Java版本、权限问题。需要调整Webshell代码或命令格式。4.4 利用工具进行连接进阶手动访问带参数的URL虽然可行但不够方便。我们可以使用专业的Webshell管理工具。打开中国菜刀或蚁剑添加一个新的Shell连接。URL地址填写我们上传的JSP文件的完整URL例如http://192.168.1.100:8080/upload/202405/shell.jsp。连接密码在我们提供的示例Webshell代码中使用的是cmd作为参数名这相当于一个“密码”。在菜刀中对应的密码栏通常就填写这个参数名cmd有些工具可能叫“密钥”。脚本类型选择JSP。点击连接。如果一切正常工具会成功连接到服务器并展示服务器的文件目录结构。此时你就可以通过图形化界面执行命令、上传下载文件、管理数据库等直观地验证了RCE漏洞的危害性。5. 常见问题排查与实战技巧在实际复现过程中很少能一击即中。下面是我在多次测试中总结的常见问题和解决思路。5.1 上传请求被拦截或返回错误问题现象修改请求后服务器返回403 Forbidden、500 Internal Server Error或者返回JSON/HTML提示“文件类型非法”、“上传失败”。排查思路检查文件内容格式确保在Burp中修改multipart/form-data时没有破坏其格式。每个部分boundary的起始和结束要正确。一个技巧是先用一个正常文件上传捕获请求模板然后在Repeater模块中基于模板修改比在Intercept里直接改更稳妥。尝试不同扩展名绕过大小写绕过shell.Jsp、shell.JSP。双扩展名shell.jsp.jpg、shell.jpg.jsp。有些校验逻辑只检查最后一个扩展名而服务器可能根据真正的扩展名.jsp来解析。空格/点号绕过shell.jsp.末尾加点、shell.jsp末尾加空格需要URL编码为%20。在某些系统处理文件名时末尾的特殊字符会被去除。00截断这在旧版本系统中较常见如shell.jsp%00.jpg。但需要请求在特定编码方式下发送且对后端解析逻辑有要求现代系统较少见。检查路径参数如果使用了路径穿越../../../可能穿越的层数不对或者目标目录没有写权限。可以尝试减少或增加../的数量。也可以尝试绝对路径如果参数支持但可能性较低。查看服务器日志如果条件允许查看NC应用或中间件的日志文件里面通常会有更详细的错误信息能直接告诉你被哪个过滤器拦截了或者哪里出错了。5.2 文件上传成功但无法访问或执行问题现象服务器返回成功信息给出了路径但通过浏览器访问该路径返回404 Not Found或403 Forbidden或者访问后不执行命令。排查思路确认Web可访问性上传的路径可能不在Web应用的发布目录内。例如文件被上传到了服务器的某个物理路径如D:/upload/但这个路径没有映射为Web URL。你需要结合返回的路径和实际的Web应用部署目录进行推断。有时返回的是相对路径需要你根据上下文拼出完整URL。检查JSP引擎确保应用服务器确实启用了JSP解析功能。虽然极少见但需要确认。Webshell代码兼容性我们的示例Webshell非常基础可能在复杂环境下出错。尝试使用更健壮、兼容性更好的Webshell代码。例如处理命令执行时的输入输出流更完善或者对Java版本适应性更强。权限问题即使JSP文件被访问执行系统命令也需要相应的操作系统权限。如果Web服务器进程如tomcat用户权限很低可能无法执行某些命令如whoami能执行但net user不行。可以尝试执行cmd /c echo helloWindows或echo helloLinux来测试最基本的命令执行是否通畅。5.3 利用工具连接失败问题现象使用中国菜刀、蚁剑等工具连接时提示“连接失败”、“密码错误”或“脚本类型不匹配”。排查思路核对URL和密码URL必须是JSP文件的直接访问地址。密码连接参数必须与Webshell代码中接收参数的变量名一致我们例子中是cmd。尝试原始访问验证先用浏览器访问http://.../shell.jsp?cmdwhoami确认命令能正常执行并回显。这是工具连接的基础。工具与Webshell的兼容性有些工具对Webshell的代码格式有特定要求。可以尝试使用工具自带的或社区推荐的、经过验证的JSP Webshell代码进行替换上传。防火墙与安全软件目标服务器可能装有主机防火墙或安全软件拦截了来自工具特定端口的连接或非浏览器的异常请求。但这通常不影响基础的HTTP GET/POST请求。6. 漏洞修复与安全加固建议复现漏洞是为了更好地防御。如果你负责的系统正在使用用友NC请务必立即采取行动。官方补丁升级这是最根本、最有效的解决方案。立即联系用友官方或查看安全公告获取针对该漏洞的官方补丁并尽快安装。补丁通常会修复uploadControl/uploadFile等接口的校验逻辑并限制上传文件的存储路径。临时缓解措施如果无法立即升级可以考虑以下临时方案WAF防护在NC系统前端部署Web应用防火墙WAF配置规则拦截包含../等路径穿越字符的请求以及文件名中包含.jsp的上传请求。中间件安全配置Tomcat在conf/web.xml中为上传目录配置额外的安全约束禁止直接执行JSP。例如为/upload/路径下的*.jsp和*.jspx文件配置一个安全约束使其无法被访问。文件系统权限确保上传目录如/upload/位于Web应用目录之外并且该目录下的文件不具备执行权限。同时配置应用服务器对该目录只有写权限没有读或执行权限这可能需要调整应用逻辑。代码层加固如果具备开发能力可以审查并重写文件上传组件实施白名单文件扩展名校验只允许jpg, png, pdf, doc等对上传文件进行重命名如使用UUID并强制将文件存储到非Web可访问的目录通过一个安全的下载Servlet来提供文件访问。安全开发生命周期SDL从根本上企业应在软件开发初期就引入安全设计对文件上传、反序列化、命令执行等高风险操作进行严格的安全评审和测试。漏洞复现的过程是一个不断试错、分析和学习的过程。每一次失败响应的分析都能让你对目标系统的防御机制多一分了解。通过亲手实践这个经典的“文件上传致RCE”漏洞你收获的将不仅仅是一个利用脚本更是一套面对未知黑盒系统时如何进行漏洞挖掘与利用的思维方法。在实战中情况往往更复杂可能需要结合目录扫描、源码泄露、其他接口等多个信息点才能最终定位并成功利用漏洞点。保持好奇心严谨测试你的技能树会在这个过程中不断生长。

相关新闻