其他注入方法

都是面对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进行转义

宽字节注入防范

  1. 使用utf-8,可以避免宽字节注入 不仅在gbk中,韩文、日文等都是宽字节
  2. 使用mysql_real_escape_string方法转义 需同时设置mysql_set_charset('gbk',$conn)
  3. 可以设置mysql连接参数:character_set_clinet=binary

二次编码注入

php代码中用了urldecode()等编码函数,对url中的特殊字符进行编码,可以利用此函数与php自身编码转换,产生漏洞

二次编码注入原理

  1. 用户输入id=1%27,会被php转码为id=1'
  2. 转义代码发现有单引号,转义为id=1\',无法sql注入
  3. 用户输入id=1%2527,由于%25转码后就是%,因而会转码为id=1%27
  4. 转义代码没有发现单引号,故不转义
  5. 但后续urldecode等函数,处理url时,会将id=1%27转码为id=1',就可以注入 注意:如果做白盒测试,要看urldecode函数 是否在转义方法之后

二次注入

二次注入原理

  1. 插入恶意数据 有些程序在进行数据库插入的时候,仅仅对特殊字符进行了转义,但仍然将数据写入了数据库,如果插入的数据包含恶意内容的话
  2. 引用恶意数据 在插入到数据库中后,在另外的地方查询该数据的时候,如果没有对取出的数据做校验处理(即认为可信),直接使用该数据,就会造成sql二次注入

二次注入举例

举例1如下:

  1. 新建用户admin'#,有特殊字符,但写入成功,并能使用该用户登录
  2. 正常修改用户密码时 sql语句如是:update user set password='1234' where username='x' and psssword='xx'
  3. 但当用户为admin'#时 sql语句变为:update user set password='1234' where username='admin'#' and xxxxx 明显井号后的语句都被注释掉了
  4. 结果就是会修改掉原有用户admin的密码

举例2如下:

  1. 有两个页面,一个页面写入数据,另一个页面可以有办法查看该数据
  2. 如果写入时,写入了xx' union select 1,database(),3
  3. 如果存在sql注入漏洞,写入的数据应该为1,库名,3
  4. 在另一个页面就可以看到该库名数据

二次注入防御

  1. 对外部提交的数,需要更加谨慎处理,特殊字符不写入
  2. 程序内部的数据调用,也要进行严格检查,不要认为可信