企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 其他注入方法 都是面对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. 程序内部的数据调用,也要进行严格检查,不要认为可信