十、异或注入
异或
:一种逻辑运算,简言之,
相同为假,不同为真,NULL 与任何条件异或结果都为 NULL
,
mysql 中的符号是
^ 和 xor
。
测试:
![](https://i-blog.csdnimg.cn/blog_migrate/ed7aa80dacf5aa6be8135da93e991706.png)
常用手段:用于判断所过滤的字符串
?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注入。
![](https://i-blog.csdnimg.cn/blog_migrate/a958fd377e15aad0802f959a823e1a8c.png)
如果我们不进行转义,按照一般 攻击者的思路进行 SQL注入,都是通过 ?id=1' 进行验证,如
下图,如果没有进行任何防御,即没有进行转义操作,就会出现报错,也就很容易的验证出来
了 的确存在 SQL注入,并且容易看到注入方式。
![](https://i-blog.csdnimg.cn/blog_migrate/95334c94f2d3ecf76f8597280804fcf6.png)
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
的密码。
这样我们就在只以知某一用户名,不知其密码的情况下,通过
二次注入
,成功的可以登录
其它用户的账号了