Oracle注入攻击是一种SQL注入攻击,利用应用程序在处理SQL查询时的漏洞,注入恶意的SQL代码,从而执行任意的SQL查询或操作。以下是一些常见的Oracle注入攻击方式:
1)基于错误的注入方式
攻击者可以通过注入恶意的SQL代码来触发错误,从而了解SQL查询语句的结构和内容。例如,攻击者可以在用户名或密码字段中插入以下SQL代码:
' OR 1=utl_inaddr.get_host_address((SELECT chr(95)||chr(33)||user||chr(33)||chr(64)||chr(51)||chr(50)||chr(46)||chr(51)||chr(51)||chr(46)||chr(51)||chr(50)||chr(46)||chr(51)||chr(51)||chr(33)||chr(95) FROM dual))--
上面的这个是什么意思chr(95)||chr(33)||user||chr(33)||chr(64)||chr(51)||chr(50)||chr(46)||chr(51)||chr(51)||chr(46)||chr(51)||chr(50)||chr(46)||chr(51)||chr(51)||chr(33)||chr(95)
上述代码会触发一个错误,并返回一个包含攻击者IP地址的错误消息。攻击者可以利用这个特性来了解SQL查询语句的结构和内容,从而执行任意的SQL查询或操作。
这段代码是一个用于构造字符串的Oracle SQL语句的片段,它的作用是返回当前用户的用户名和攻击者的IP地址。该代码使用了Oracle数据库的内置函数chr(),该函数将一个ASCII值转换为对应的字符。
具体来说,这段代码将攻击者的IP地址用ASCII码表示,然后使用chr()函数将每个ASCII码转换为对应的字符,最终拼接成一个字符串。其中,chr(95)表示下划线字符,chr(33)表示感叹号字符,chr(64)表示"@"符号,chr(51)表示数字"3",chr(50)表示数字"2",chr(46)表示小数点,最终得到的字符串形如"!username!@32.33.32.33!"
第二个问题
dual是什么意思?怎么理解
在Oracle数据库中,dual是一个特殊的表名,是一个虚拟的表,用于查询一些特殊的常量和函数。dual表只有一行数据,其中包含两个列:DUMMY和X。DUMMY列包含一个固定的值“X”,而X列始终为NULL。
dual表通常用于查询一些特殊的常量和函数,例如:
查询系统时间:SELECT SYSDATE FROM dual;
查询一个常量:SELECT 'Hello, World!' FROM dual;
查询一个序列:SELECT my_sequence.nextval FROM dual;
执行一些函数:SELECT SIN(2) FROM dual;
这里的nextval和my_sequence什么意思
在 Oracle 数据库中,序列(Sequence)是一种对象,用于生成唯一的数字值。
my_sequence 是一个序列名,它用于标识一个特定的序列对象。nextval 是一个序列对象的方法,用于获取序列的下一个值。在这个查询中,通过在序列名后面添加 .nextval,就可以调用该序列对象的 nextval 方法,获取该序列的下一个值。
2, 基于时间的注入方式
攻击者可以通过注入恶意的SQL代码来触发时间延迟,从而了解SQL查询语句的结构和内容。例如,攻击者可以在用户名或密码字段中插入以下SQL代码:
' and (select count(*) from all_tables t1, all_tables t2, all_tables t3, all_tables t4, all_tables t5) > 2000000 and '1'='1'
代码会触发一个时间延迟,由于查询中涉及多个表的联接,因此查询的执行时间会非常长。攻击者可以利用这个特性来了解SQL查询语句的结构和内容,从而执行任意的SQL查询或操作。
问题一
在Oracle数据库中,all_tables是一个系统视图,用于显示当前用户下的所有表和视图的信息。在使用all_tables视图查询表信息时,需要指定一个别名(例如t1),以便在查询中引用该表。这个别名是任意的,可以使用任何合法的标识符作为别名。
因此,all_tables t1中的t1是一个表的别名,它可以被替换成任何其他合法的别名,例如:
· all_tables a
· all_tables mytable
· all_tables t
· 等等
3, 基于堆叠查询的注入方式
攻击者可以通过注入多个SQL查询语句,从而执行任意的SQL查询或操作。例如,攻击者可以在用户名或密码字段中插入以下SQL代码:
' and 1=(select count(*) from (select 1 from dual union select 1 from dual union select 1 from dual) where rownum=1)
问题一
rownum是什么意思,
在Oracle数据库中,rownum是一个伪列,用于表示返回结果集中的行号。每次查询返回的结果集都会按行号从1开始给每一行分配一个唯一的rownum值,该值是只读的,不能修改。可以理解为mysql里面的id.
4 基于联合查询的注入方式
攻击者可以通过联合查询来合并多个查询结果,从而执行任意的SQL查询或操作。例如,攻击者可以在用户名或密码字段中插入以下SQL代码:
' UNION SELECT 1,2,3 FROM dual--
上述代码会将攻击者注入的查询结果与原查询结果合并,并返回一个包含攻击者注入的查询结果的结果集。攻击者可以利用这个特性来执行任意的SQL查询或操作。
这里有个争议
Oracle不支持堆叠查询把
实际上,Oracle数据库支持堆叠查询。堆叠查询是一种在单个SELECT语句中合并多个查询结果集的方法。在Oracle中,可以使用UNION、UNION ALL、INTERSECT和MINUS等操作符来执行堆叠查询。这些操作符允许将多个查询结果集合并为一个结果集,并且每个结果集的列数和数据类型必须相同。
01, 什么是sql注入
将SQL语句插入或添加到用户输入参数中,之后再将这些参数传递给后台的SQL服务器加以解析并执行
2, 造成SQL注入的原因
2.1 对用户的输入的数据,没有进行过滤,被带到了数据库中去执行,造成了SQL注入。
2.2 程序编写者在处理程序与数据库交互时,使用字符串拼接的方式构造SQL语句
3, sql注入的分类
(3.1) 注入类型分两种
3.1.1 整型注入(不需要闭合,不需要注释符号)
3.1.2 字符型注入(需要闭合,需要注释符)
(3.2) 注入的方式
3.2.1 联合注入
3.2.1.1 联合注入原理
联合查询将两个以上的select语句的查询结果并成一个结果显示,语句之间用关键字Union分隔
Union中的每个查询必须包含相同的列,
3.2.2 报错注入
3.2.2.1 报错注入的原理
开启了报错mysql_error函数,页面爆出的错误信息,通过updatexml()及extractvalue()函数可构造合适的语句来获取我们想要的信息, 因,报错结果只有32个字符,要用substring()函数来截取字符串,
3.2.2.2 报错注入相关函数
updatexml() 报错函数 (需要三个参数站位)
extractvalue() 报错函数(需要两个参数站位)
3.2.3 布尔盲注(分布尔盲注和时间盲注)
3.2.3.1 布尔盲注
当没有回显位,也没有sql语句执行错误信息,此时可用到布尔盲注,当if判断条件为真为假时,返回的内容不一样时,此时可以用布尔盲注尝试.
3.2.3.2 时间盲注
输入参数,当页面返回的内容没有任何变化时,可以用时间盲注,利用sleep()延时打开页面特性,当if判断ascii第一个字符为等于数据库名第一个字符时,页面返回速度明显慢一些,在用二分法不断缩小ascii编码范围,
3.2.3.3 相关函数
ascii() 返回ascii编码,即便传递一个字符串,也只会返回第一个字符
substr() 截取字符串,下去从1开始
length() 返回字节长度
left() 从左边开始截取
3.2.3.4 共同点
都需要用到ascii码推算,都没有回显位,需要大量的时间去猜,都需要一个一个字符去爆出来
3.2.4 二次注入
3.2.4.1 二次注入原理
当用户提交表单时,保存的是未经过滤的数据,在其他地方调用数据执行拼接SQL查询,也未经过过滤,导致二次注入产生。
3.2.5 宽字节注入
3.2.5.1 宽字节注入原理:
前端编码和数据库编码不一致,数据库编码是GBK、GB2312这种两个字节代表一个字符的编码, 有转义addslashes函数,将{{'}}转义为{{\'}}等,此时mysql 数据库就会将ascii大于128(%df)的字符当做是汉字字符的一部分,从而吃掉\,引入单双引号进行逃逸,
3.2.6 二次编码注入
3.2.6.1 二次注入的原理
通常开发者使用addslashes()、mysql_real_escape_string()、mysql_escape_string()等函数方式来防止注入,所以无法转义经过编码后的字符,如果某处使用了urldecode()函数,则可能导致二次注入.
3.2.7 堆叠注入
3.2.7.1 堆叠注入原理
SQL中分号(;)用来表示一条sql语句的结束。能同时执行任意的SQL语句.
3.2.7.2 和union 或者union all 的区别
union 或者union all 只可以用来执行查询语句,而堆叠注入可以执行的是任意的语句
3.7.7.3 堆叠注入的局限性
受到API或者数据库引擎不支持的限制
4, 常见的注入位置
4.1 表单(登陆,注册,修改)
4.2 搜索框
4.3 url参数等等
5, SQL注入的防御
5.1 对进入数据库的特殊字符(单引号,双引号,尖括号等)进行转换或编码转换。
5.2 不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
5.3 不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
5.4 应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装