0
点赞
收藏
分享

微信扫一扫

SQL注入-Day20

夕阳孤草 2022-02-19 阅读 50
sql

十、异或注入

异或 :一种逻辑运算,简言之, 相同为假,不同为真,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 字符
  • 解释

GBK 编码范围, GBK 编码表 (qqxiuzi.cn)

十二、二次注入

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

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 的密码。

这样我们就在只以知某一用户名,不知其密码的情况下,通过 二次注入 ,成功的可以登录

其它用户的账号了

 

 

 

 

举报

相关推荐

day20

day20 数组指针

Java学习-Day20

算法打卡day20

渗透学习日记day20

0 条评论