本文由 简悦 SimpRead 转码, 原文地址 mp.weixin.qq.com
某远 OA 是一套办公协同软件。近日,阿里云应急响应中心捕获到多个利用致远 OA 文件上传与权限绕过漏洞的利用样本。由于某远 OA 旧版本某些接口存在未授权访问,以及部分函数存在过滤不足,攻击者通过构造恶意请求,可在无需登录的情况下上传恶意脚本文件,从而控制服务器。某远 OA 官方已针对该漏洞提供补丁,漏洞利用细节暂未公开。
首先我们可以看出,这首先是一个未授权访问漏洞,再结合任意文件上传漏洞的利用。
当然,这个非授权访问漏洞比较精彩,所以先分析这个洞。
某远 oa 的补丁是可以在官网下载的,当然,都是 2020 年 10 月补丁,可能是某里云搞错了。为啥突然诈尸一样更新了呢
百度一下破解版,只能这样。
首先我们分析补丁都改动了什么。这个才是重点
com.seeyon.ctp.common.spring.CTPHandlerInterceptor
CTPHandlerInterceptor 这个东西,我们可以类比为 spring 版的 filter,针对某些请求做过滤。我们可以看到,如果 url 出现"./", ";", ".#"
,则直接拦截请求。那么我们分析一下请求流程 CTPHandlerInterceptor 首先判断是否为 ajax 请求,也就是 url 是否包含 ajax.do。
boolean isAjax = "/ajax.do".equals(uri); String url = uri; String queryStr = request.getQueryString(); if (queryStr != null) { url = uri + "?" + queryStr; } String ignoreUrl = url; if (isAjax) { String serviceName = request.getParameter("managerName"); String methodName = request.getParameter("managerMethod"); ignoreUrl = serviceName + "." + methodName; }
记住 ignoreUrl 这个变量,这个变量随后就要分析
if (!needlessUrl && !User.isIgnoreUrl(ignoreUrl, request, response)) { boolean state = this.checkSessionPre(request, response, handler.getClass().getCanonicalName(), isAjax); if (!state) { return state; } User.validateResource(url, true); }
User.isIgnoreUrl 方法的作用主要是根据 ignoreUrl 是否需要重定向用户至登录页面。当然,部分 ajax 请求是不需要登录的,这也就给我们造成可乘之机。下面是 isIgnoreUrl 的简化代码com.seeyon.ctp.common.authenticate.domain.User#isIgnoreUrl
我们直接分析 ignoreUrl 这个列表是从哪里生成的即可。
也就是说,只要我们的 ignoreUrl 为图中的内容,就可以绕过登录。
看到这里,再结合上面补丁 diff 的内容,是不是就明白这是什么漏洞了。
这个漏洞其实就是绕过登录,访问被保护的接口,当然这里包括但不限于文件上传接口。所以官方直接就把未授权访问这个洞修复了。你可以把这个类比为 weblogic 的未授权访问,漏洞成因其实都是类似的
所以分享一个网上的例子,也就是未授权访问结合任意文件上传的 getshell
/seeyon/autoinstall.do.css/..;/ajax.do?method=ajaxAction&managerName=formulaManager&requestCompress=gzip