漏洞描述:
Apache OFBiz是一个电子商务平台,用于构建大中型企业级、跨平台、跨数据库、跨应用服务器的多层、分布式电子商务类应用系统。2021年3月22日 Apache OFBiz官方发布安全更新,修复了一处由RMI反序列化造成的远程代码执行漏洞(CVE-2021-26295)。攻击者可构造恶意请求,触发反序列化,从而造成任意代码执行,控制服务器。
JMI解读:
Java RMI服务是远程方法调用(Remote Method Invocation)。它是一种机制,能够让在某个java虚拟机上的对象调用另一个Java虚拟机的对象的方法。
RMI传输过程必然会使用序列化和反序列化,如果RMI服务端端口对外开发,并且服务端使用了像Apache Commons Collections这类库,那么会导致远程命令执行。
漏洞分析:
咱们去看看是哪一段代码出问题了,首先看了360的通报,如下
接下来去看看版本跟新情况:
https://github.com/apache/ofbiz-framework/compare/release17.12.05...release17.12.06#files_bucket
上个版本,该模块代码为:
在Java中,一个类对象想实现序列化,需要:
- 该类必须实现 java.io.Serializable 对象
- 该类的所有属性必须是可序列化的(此处有例外)
还是通过代码来演示,我们先写一个Person
类来用作序列化的内容。
class Person implements Serializable{ private String name; private Integer age; public Person(String name, Integer age){ this.name = name; this.age = age; } public void printInfo(){ System.out.println("My name is " + this.name + ", I'm " + this.age + " years old."); } } |
序列化Person
的对象并写入文件:
Person p = new Person("adan0s", 20); try{ FileOutputStream fileOut = new FileOutputStream("./person.ser"); ObjectOutputStream out = new ObjectOutputStream(fileOut); out.writeObject(p); out.close(); fileOut.close(); }catch (IOException i){ i.printStackTrace(); } |
这里主要是利用ObjectOutputStream
流来把对象进行包装,再使用FileOutputStream
流写入文件。
下面是反序列化:
Person p = null; try{ FileInputStream fileIn = new FileInputStream("./person.ser"); ObjectInputStream input = new ObjectInputStream(fileIn); p = (Person) input.readObject(); input.close(); fileIn.close(); p.printInfo(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } |
其实就是把序列化反着来了一遍。
我们通过源码来查看漏洞利用条件(存在反序列化):
一、环境搭建
docker run -d -p 811:8080 -p 8443:8443 opensourceknight/ofbiz
直接启动Docker
然后访问811 或者https://ip/8443