聚焦源代码安全,网罗国内外最新资讯!
1.1 状态
完成漏洞挖掘条件分析、漏洞复现。
1.2 简介
相关的重点类和方法:
org.apache.xmlrpc.parser.SerializableParser 包含序列化代码;
org.apache.ofbiz.webapp.control.RequestHandler负责发送请求至“/webtools/control/xmlrpc”端点;
org.apache.ofbiz.webapp.event.XmlRpcEventHandler#execute()方法;
org.apache.ofbiz.webapp.event.XmlRpcEventHandler#getRequest()方法的XMLReader类的parse()方法可开展XML解析工作。
org.apache.xmlrpc.parser.XmlRpcRequestParser、org.apache.xmlrpc.parser.RecursiveTypeParserImpl、org.apache.xmlrpc.parser.MapParser类可解析XML-RPC请求中的元素。
序列化问题在于org.apache.xmlrpc.parser.SerializableParser#getResult()方法。OFBiz使用的 Apache Commons BeanUtils 库和 Apache ROME库存在漏洞。
XML-RPC是一个远程过程调用(RPC)协议。
版本:APACHE-OFBIZ-16.11.05,jdk1.8。
1.3 漏洞挖掘能力条件
根据调试信息可精准定位入口点。
认为可灵活导入所需jar包。
1.4 利用方法
入口点是 /webtools/control/xmlrpc,因此从framework/webtools/webapp/webtools/WEB-INF/web.xml(如果没有WEB-INF/web.xml文件,tomcat会输出找不到的消息)开始深入分析。
framework/webtools/webapp/webtools/WEB-INF/web.xml |
<servlet> <description>Main Control Servlet</description> <display-name>ControlServlet</display-name> <servlet-name>ControlServlet</servlet-name> <servlet-class>org.apache.ofbiz.webapp.control.ControlServlet</servlet-class> 【路由目的地】 <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>ControlServlet</servlet-name> <url-pattern>/control/*</url-pattern> 【待路由目录】 </servlet-mapping> |
|
org.apache.ofbiz.webapp.control.ControlServlet#doPost |
- |
|
org.apache.ofbiz.webapp.control.ControlServlet#doGet |
long requestStartTime = System.currentTimeMillis(); RequestHandler requestHandler = this.getRequestHandler(); 【a】 HttpSession session = request.getSession(); … String errorPage = null; try { // the ServerHitBin call for the event is done inside the doRequest method requestHandler.doRequest(request, response, null, userLogin, delegator); 【d】 |
|
a |
org.apache.ofbiz.webapp.control.RequestHandler#RequestHandler |
this.controllerConfigURL = ConfigXMLReader.getControllerConfigURL(context); 【b】 … this.eventFactory = new EventFactory(context, this.controllerConfigURL); 【c】 |
b |
org.apache.ofbiz.webapp.control.ConfigXMLReader#getControllerConfigURL |
public static URL getControllerConfigURL(ServletContext context) { try { return context.getResource(controllerXmlFileName); 【controllerXmlFileName= /WEB-INF/controller.xml】 } catch (MalformedURLException e) { Debug.logError(e, "Error Finding XML Config File: " + controllerXmlFileName, module); return null; } |