SQL宽字节注入

SQL宽字节注入

  编码是信息从一种形式或格式转换为另一种形式的过程,也称为计算机编程语言的代码简称编码。用预先规定的方法将文字、数字或其它对象编成数码,或将信息、数据转换成规定的电脉冲信号。编码在电子计算机电视、遥控和通讯等方面广泛使用。编码是信息从一种形式或格式转换为另一种形式的过程。解码,是编码的逆过程。

   GBK编码(对多达2万多的简繁汉字进行了编码)采用双字节表示,总体编码范围为 8140-FEFE,首字节在 81-FE 之间,尾字节在 40-FE 之间

  假设一个SQL语句是 select * from user where id = '1',它使用了addsalshes函数或者类似函数进行了转义,那么我们输入的参数1',就会变为1\'

  addslashes函数产生的效果就是,让’变成\’,让引号变得不再是“单引号”,只是一撇而已。一般绕过方式就是,想办法处理\’前面的\:

  ①想办法给\前面再加一个\(或单数个即可),变成\\’,这样\被转义了,’逃出了限制,叫做'逃逸

  ②想办法把\弄没有

  我们这里的宽字节注入是利用mysql的一个特性,mysql在使用GBK编码的时候,会认为两个字符是一个汉字(前一个ascii码要大于128,才到汉字的范围)。所以理论上对所有宽字节编码来说,只要你能使用合适的编码拼接掉后边的多余字符,例如\,那么就可以进行绕过

  select * from user where id = '%df''  我们输入%df',那么会产生报错,%df和\(%5c)两个字节组合为一个汉字“運“,那么我们就可以进行注入

   例如我们可以查询  select * from user where id = '%df' union select 1,2,database()--+

判断宽字节注入

  一般我们输入 ' ,它被转移为%27,那么我们尝试着使用 \' 来构造 \\' 造成 ' 逃逸 

 
   因为刚开始使用手工注入开始注入,所以会遇到很多问题,我对注入时自己的疑惑点做出整理

  ①sql注入中语句的闭合问题

  需要使用 # -- 等来注释掉后面的引号,但是实际上不能使用 # 来注释,原因是url中#号是用来指导浏览器动作的(例如锚点),对服务器端完全无用。所以,HTTP请求中不包括#
将 # 号改成url的编码%23就可以了,而 -- 是因为它与后面的单引号连接在一起,无法形成有效的mysql语句,我们可以使用 --+ 对比上面--的效果,这里发现+号在语句中变成了空格。用来和后面的单引号分隔开,将后面的语句注释,所以综上所述,我们可以使用 %23 或者 --+ 来注释

  ②在宽字节注入时,使用union查询要将之前的值改为不存在的值

  select * from user where id='1'%df' union select 1,2,3,4,database()--+  原来的语句 

  select * from user where id='-1'%df' union select 1,2,3,4,database()--+  查询语句

  是因为前边查询到结果,那么后边的内容就不会执行

   ③为什么使用group_concat()

  因为这个函数可以可以拼接字符串,查询到所有到表名并且输出,如果使用select table_name 那么只会输出一个表,但我们可以通过limit控制输出,但是这个函数查询列中具体的数据时,可以输出全部的数据

   ④宽字节注入查询表名是,为了绕过引号,我们可以使用将库名表名转换为16进制,这样就可以绕过函数addslashes  
 
   ⑤sqlmap 使用 --tamper "unmagicquotes.py" 也可以绕过宽字节,或者在url后边加一个%df
 
 
 
关于宽字节的修复以及iconv配置不当引起的宽字节注入
 
posted @ 2019-07-29 15:36  衰小草  阅读(574)  评论(0编辑  收藏  举报