SQL注入-Day20

十、异或注入

异或 :一种逻辑运算,简言之, 相同为假,不同为真,NULL 与任何条件异或结果都为 NULL
mysql 中的符号是 ^ 和 xor
测试:

 常用手段:用于判断所过滤的字符串

?id=1'^(0)
//得到正常的回显页面,由于异或之后得到 真 
?id=1'^(1)
//得到错误的回显页面,由于异或之后得到 假
常常用于判断我们所注入的某些字段是否被过滤
?id=1'^(length('union')>0)
  • 如果 union 已被过滤,那么得到的将会是 length(0>0) ,显然是不成立的,那就将会是 1'^0 ,得到的为 真,所以将会返回 正常 的页面;
  • 如果 union 没有被过滤,相反的,将会得到为假的异或,返回的将会是 错误 的页面。 由此可以判断某些字符的过滤情况。

常常使用:

?id=1'^(length('select')>0)#
?id=1'^(length('and')>0)#
?id=1'^(length('or')>0)#

符号特点:

  • ^ 运算符会做位异或运算

  •  xor 做逻辑运算 1 xor 0 会输出 1 ,其它情况输出其余所有数据

 十一、宽字节注入

11.1 防御原理

为了防止 SQL注入漏洞,通常在源代码当中会对我们所输入的 SQL查询语句进行一个 转义,一般是对 单引号,双引号 进行一个转义变成 ' 或者是",这样Mysql在 执行 SQL语句时,不会影响到查询,即不会出现报错,数据存储在数据库当中时不会含有 \ ,也就是说,它仅仅是在执行 SQL语句时进行了转义,当我们从数据库中向外调出数据时并不会含有 \ ,也就预防了SQL注入。
如果我们不进行转义,按照一般 攻击者的思路进行 SQL注入,都是通过 ?id=1' 进行验证,如
下图,如果没有进行任何防御,即没有进行转义操作,就会出现报错,也就很容易的验证出来
了 的确存在 SQL注入,并且容易看到注入方式。

 11.2 常用的转义函数

addslashes() 函数:返回在预定义字符之前添加反斜杠的字符串
  • 单引号('
  • 双引号("
  • 反斜杠(\
  • NULL
mysql_real_escape_string() 函数 : 转义 SQL 语句中使用的字符串中的特殊字符
下列字符受影响:
  •  \x00
  •  \n
  •  \r
  •  \
  •  '
  •  "
  •  \x1a
addslashes()

11.3 解决

  • 网页连接数据库时,将字符编码设置为 GBK 编码集合,然后进行 SQL语句的拼接,进行数
据库的查询。
  • GBK编码采用 双字节编码,编码范围为 8140~FEFE
  • 转义字符 的编码是 5c ,其在 GBK的编码范围之内,如果我们在转义字符之前 提交一个同样在编码范围之内的字符,网页在解析时,就会将其与 后面的转义字符进行一个匹配,组成一个 双字节的 GBK编码的汉字,从而失去了转义的作用。
  • 常用方法:在使用单引号 或者 双引号之前添加 %df 字符
  • 方法二:在使用单引号 或者 双引号之前添加 %aa%5c 字符
  • 解释

十二、二次注入

根源在于:来发这信任从数据库中取出的数据都是无害的。

12.1 原理:

攻击者构造的恶意数据 存储在 数据库 后,恶意数据 被读取 并进入到 SQL查询语句所导致的注入。

防御者可能在用户 输入 恶意数据时对其中的特殊字符进行了 转义处理 ,但在恶意数据插入到数据库时被处理的数据又 被还原 并存储在数据库中,当Web程序 调用 存储在数据库中的恶意数据并执行SQL查询时,就发生了SQL二次注入。

也就是说在应用程序中输入恶意造的数据库查询语句时会被转义,但是在数据库内部调用读
取语句的时候又被还原。

12.2 二次注入步骤:

第一步:插入恶意数据
进行数据库插入数据时,对其中的特殊字符进行了 转义处理,在写入数据库的时候又保留了
原来的数据。
第二步:引用恶意数据
开发者默认存入数据库的数据都是安全的,在进行查询即调用已存储在数据库中的数据时,
直接从数据库中取出恶意数据,没有进行进一步的检验的处理。

12.3 一般结合 修改密码 功能点 进行利用

举例:

1、已知用户登陆时的查询 login.php

我们使用下面用户登录

 

则实际进行操作的语句成为:

 由于进行了 mysql_real_escape_string 转义,则不会引发 sql 注入,从而成功进行了防御。

2、已知注册用户时的插入 login_create.php

 我们注册新的用户:

 同样对我们输入的数据进行了转义处理,则实际操作语句是:

这样我们重新注册了一个新的用户:

 3、已知用户修改密码 pass_change.php

 可以看到,此时的用户名没有进行转义防御就出现在了sql语句当中。

我们以新注册的 Dumb'# 用户登录进去,利用修改密码的功能。

代入sql语句中得到:

这样看来,我们实际上修改的是 用户名为 Dumb 的密码。
这样我们就在只以知某一用户名,不知其密码的情况下,通过 二次注入 ,成功的可以登录
其它用户的账号了

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值