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控制输出,但是这个函数查询列中具体的数据时,可以输出全部的数据