1_2oracle注入+SQL注入

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 应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值