其他注入方法
都是面对php代码或配置,对输入的单引号进行转义时,在处理用户输入数据时存在问题,可以绕过转义
宽字节注入
dbk处理编码的过程存在问题,可以构造数据消灭转义符\
宽字节注入原理
在对单双引号进行了转义过滤的情况下,前面的注入方式都不好使,但可以在引号前加上%df再进行sql注入尝试
它的原理是
1. \'编码后的值为%5C%27
2. 使用GBK编码数据库时,两个字符为一个汉字
2. ASCII码只有128个,大于128的,就会和第二个字符组成一个汉字
3. 使用%df\',编码后为%df%5C%27
第一个码大于128,因此会使用前两个字符運,最后单剩一个引号
即编码后的值为運'
4. 然后就可以正常进行sql注入了
宽字节注入方法
黑盒测试的话:在可能的注入点后,键入%df'后,进行测试
白合测试的话:
1. 查看mysql编码是否为GBK
2. 是否使用preg_replace转换单引号为\'
3. 是否使用addslashes进行转义
4. 是否使用mysql_real_escape_string进行转义
宽字节注入防范
- 使用utf-8,可以避免宽字节注入 不仅在gbk中,韩文、日文等都是宽字节
- 使用
mysql_real_escape_string方法转义 需同时设置mysql_set_charset('gbk',$conn) - 可以设置mysql连接参数:
character_set_clinet=binary
二次编码注入
php代码中用了urldecode()等编码函数,对url中的特殊字符进行编码,可以利用此函数与php自身编码转换,产生漏洞
二次编码注入原理
- 用户输入
id=1%27,会被php转码为id=1' - 转义代码发现有单引号,转义为
id=1\',无法sql注入 - 用户输入
id=1%2527,由于%25转码后就是%,因而会转码为id=1%27 - 转义代码没有发现单引号,故不转义
- 但后续urldecode等函数,处理url时,会将
id=1%27转码为id=1',就可以注入 注意:如果做白盒测试,要看urldecode函数 是否在转义方法之后
二次注入
二次注入原理
- 插入恶意数据 有些程序在进行数据库插入的时候,仅仅对特殊字符进行了转义,但仍然将数据写入了数据库,如果插入的数据包含恶意内容的话
- 引用恶意数据 在插入到数据库中后,在另外的地方查询该数据的时候,如果没有对取出的数据做校验处理(即认为可信),直接使用该数据,就会造成sql二次注入
二次注入举例
举例1如下:
- 新建用户
admin'#,有特殊字符,但写入成功,并能使用该用户登录 - 正常修改用户密码时
sql语句如是:
update user set password='1234' where username='x' and psssword='xx' - 但当用户为
admin'#时 sql语句变为:update user set password='1234' where username='admin'#' and xxxxx明显井号后的语句都被注释掉了 - 结果就是会修改掉原有用户admin的密码
举例2如下:
- 有两个页面,一个页面写入数据,另一个页面可以有办法查看该数据
- 如果写入时,写入了
xx' union select 1,database(),3 - 如果存在sql注入漏洞,写入的数据应该为
1,库名,3 - 在另一个页面就可以看到该库名数据
二次注入防御
- 对外部提交的数,需要更加谨慎处理,特殊字符不写入
- 程序内部的数据调用,也要进行严格检查,不要认为可信