加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 服务器 > 安全 > 正文

APACHE OFBIZ XMLRPC远程代码执行漏洞详解

发布时间:2022-07-11 15:44:17 所属栏目:安全 来源:互联网
导读:漏洞分析 Apache OFBiz是一个开源的企业资源规划(ERP)系统,它提供了一系列企业应用程序来帮助企业自动化实现很多业务流程。它包含了一个能提供常见数据模型和业务进程的框架,企业内所有的应用程序都需要采用这个框架来使用常见数据、逻辑和业务处理组件。
 漏洞分析
Apache OFBiz是一个开源的企业资源规划(ERP)系统,它提供了一系列企业应用程序来帮助企业自动化实现很多业务流程。它包含了一个能提供常见数据模型和业务进程的框架,企业内所有的应用程序都需要采用这个框架来使用常见数据、逻辑和业务处理组件。除了框架本身之外,Apache OFBiz还提供了包括会计(合同协议、票据、供应商管理、总账)、资产维护、项目分类、产品管理、设备管理、仓库管理系统(WMS)、制造执行/制造运营管理(MES/MOM)和订单处理等功能,除此之外,还实现了库存管理、自动库存补充、内容管理系统(CMS)、人力资源(HR)、人员和团队管理、项目管理、销售人员自动化、工作量管理、电子销售点(ePOS)、电子商务(电子商务)和scrum(开发)等多种功能。
 
Apache OFBiz使用了一系列开源技术和标准,比如Java、JavaEE、XML和SOAP。
 
超文本传输协议是一种请求/响应协议,该协议在 RFC 7230-7237中有详细描述。请求由客户端设备发送至服务器,服务器接收并处理请求后,会将响应发送回客户端。一个HTTP请求由请求内容、各种Header、空行和可选消息体组成:
 
复制
Request = Request-Line headers CRLF [message-body]
 
Request-Line = Method SP Request-URI SP HTTP-Version CRLF
 
Headers = *[Header]
 
 CRLF代表新的行序列回车符(CR),后跟换行符(LF),SP表示空格字符。参数将以键值对的形式通过Request- URI或message-body由客户端传递给服务器,具体将取决于Method和Content-Type头中定义的参数。比如说在下面的HTTP请求样本中,有一个名为“param”的参数,其值为“1”,使用的是POST方法:
 
复制
POST /my_webapp/mypage.htm HTTP/1.1
 
Host: www.myhost.com
 
Content-Type: application/x-www-form-urlencoded
 
Content-Length: 7
 
  
 
param=1
 Java序列化
Java支持对对象进行序列化操作,使它们额能够被表示为紧凑和可移植的字节流,然后可以通过网络传输这个字节流,并将其反序列化以供接收的servlet或applet使用。下面的示例演示了如何将一个类进行序列化并在随后提取数据:
 
复制
public static void main(String args[]) throws Exception{
 
   //This is the object we're going to serialize.
  
   //Read the serialized data back in from the file "object.ser"
 
   FileInputStream fis = new FileInputStream("object.ser");
 
   ObjectInputStream ois = new ObjectInputStream(fis);
 
  
 
   //Read the object from the data stream, and convert it back to a String
 
   MyObject1 objectFromDisk = (MyObject1)ois.readObject();
 
   ois.close();
 
 所有的Java对象都需要通过Serializable或Externalizable接口来进行序列化,这个接口实现了writeObject()/writeExternal()和readObject()/readExternal()方法,它们会在对象序列化或反序列化时被调用。这些方法能够在序列化和反序列化过程中通过修改代码来实现自定义行为。
 
XML-RPC
XML-RPC是一个远程过程调用(RPC)协议,它使用XML对其调用进行编码,并使用HTTP作为传输机制。它是一种标准规范,并提供了现成的实现方式,允许运行在不同的操作系统和环境中。在在XML-RPC中,客户机通过向实现XML-RPC并接收HTTP响应的服务器发送HTTP请求来执行RPC。
 
如下样例所示,常见的数据类型可以被转换成对应的XML类型:
 
复制
<array>
 
  <data>
 
    <value><i4>1404</i4></value>
 
    <value><string>Something here</string></value>
 
    <value><i4>1</i4></value>
 
  </data>
 
</array>
 各种原语的编码示例如下:
 
复制
<boolean>1</boolean>
 
<double>-12.53</double>
 
<int>42</int>
1.
2.
3.
4.
5.
字符串的编码示例如下:
 
复制
<string>Hello world!</string>
1.
对结构体的编码示例如下:
 
复制
<struct>
 
  <member>
 
    <name>foo</name>
 
   </member>
 
</struct>
 
序列化数据由””和””XML元素包裹来表示,在Apache OFBiz中,序列化代码在org.apache.xmlrpc.parser.SerializableParser这个Java类中实现。
 
但是,Apache OFBiz中存在一个不安全的反序列化漏洞,这个漏洞是由于OFBiz被配置为在发送到“/webtools/control/xmlrpc”URL时使用XML-RPC拦截和转换HTTP主体中的XML数据所导致的。发送到此端点的请求最初由org.apache.ofbiz.webapp.control.RequestHandler这个Java类来处理,它确定的URL的映射方式。接下来,org.apache.ofbiz.webapp.event.XmlRpcEventHandler类将调用execute()方法,XML解析首先需要通过XMLReader类来调用parse()方法,而这个方法需要在org.apache.ofbiz.webapp.event.XmlRpcEventHandler类的getRequest()方法中调用。

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读