2020-12-17 14:36:1710002人阅读
1. 前言
之前在实战中遇到过该办公软件,最近刚好搭建了它的测试环境,于是便对其一处历史XXE漏洞进行了分析,攻击者可利用该漏洞读取服务器上的目录和文件,漏洞危害较大,建议采用百度漏洞扫描平台、智能威胁狩猎平台进行检测和防御。
2. 漏洞分析
本地搭建好该办公软件的环境后,先看portal应用的web.xml,位置在hotwebs/portal/WEB-INF/web.xml,通过搜索发现入口为LfwDispatcherServlet。
打开LfwDispatcherServlet查看源码,POST请求会进入doPost方法,并且POC中没有clearcompressjs、setdebugmode参数,因此我们直接进入else语句。67-68行创建LfwCoreController对象后调用了它的handleRequest方法。
跟进到LfwCoreController,在handleRequest方法中创建ControlPlugin的对象plugin,而ControlPlugin为接口因此需要找到该接口的实现类,寻找实现类可以跟进到PresentPluginFactory的getControlPlugin方法。
此处是根据请求路径中的path来返回具体哪个类对象,根据POC可知,此处path为空因此返回了AjaxControlPlugin类对象。
跟进到AjaxControlPlugin的handle方法,方法创建了xml对象rootNode,并利用该对象构造后续的xml响应。69行加载了IRequestProcessor对象并随后调用了doProcess方法。
RequestProcessorBase是IRequestProcessor接口的实现类,跟进到该类doProcess方法,如果开启了debug模式,则会有对应的日志记录,29行调用了processModel方法,而该方法在同一接口的实现类AbstractRequestProcessor有定义。
查看该方法,发现获取了xml参数,并且不为空的时候调用了IXml2ObjectSerializer接口的serialize方法处理xml,实现类为Xml2AppContextSerializer。
跟进到Xml2AppContextSerializer,发现有两个serialize方法,根据参数类型最初调用了第一个serialize方法,并在85行再次调用其重载serialize方法。
在117行很明显LfwXmlUtil是该软件处理xml的类库,调用了getDocumentBuilder方法返回对象的parse方法。
跟进到getDocumentBuilder方法发现其返回了getFromThreadLocal方法的builder对象,这里加载了java原生的javax.xml.parsers.DocumentBuilderFactory类解析器对象bf,但这里没有调用setXIncludeAware、setExpandEntityReferences、setFeature等方法禁用外部实体,和2018年爆出的微信支付SDK XXE漏洞类似。
3. 漏洞利用
虽然是blind xxe,但java中file://协议是可以起到列目录作用的,可以通过ftp协议将读取的数据传输出来实现回显,从而实现任意目录查看和任意文件读取,在vps执行xxeftp.py监听web和ftp端口。列目录:
读取文件:
4. 安全产品解决方案
百度度御关WAF、高级威胁感知系统,以及智能威胁狩猎平台已支持该漏洞的检测和拦截,有需要的用户可以访问anquan.baidu.com联系我们。
本篇文章由百度安全原创,转载请注明出处!