宽字节注入:
首先说一下为什么用这种注入方式,我们都知道,在防御SQL注入的时候,大多说都是使用的过滤特殊字符,或者使用函数将特殊字符转化为实体,就是说在字符转义,添加‘\’。从而使大多数注入失效,我们这里使用宽字节注入的目的,就是把\(斜杠)无效化,从而使得转义失效,使我们能够轻松进行注入获取数据信息。
宽字节注入的原理,是利用不同编码方式之间的解码漏洞,GB2312、GBK、GB18030、BIG5、Shift_JIS等这些都是常说的宽字节,宽字节带来的安全问题主要是ASCII字符(一字节)的现象,即把两个ascii字符误认为是一个宽字节字符。中文、韩文、日文等均存在宽字节,英文默认都是一个字节。在使用PHP连接MySQL的时候,当设置“set character_set_client = gbk”时会导致一个编码转换的问题。
最常使用的宽字节注入是利用%df,其实我们只要第一个ascii码大于128就可以了,比如ascii码为129的就可以,但是我们怎么将他转换为URL编码呢,其实很简单,我们先将129(十进制)转换为十六进制,为0x81,如图1所示,然后在十六进制前面加%即可,即为%81,我们可以去下列网站解码:
http://www.mytju.com/classcode/tools/urldecode_gb2312.asp
例子: id= 1’ 处理 1 \’ ,进行编码 1%5c%27 ,带入sql后 id = \’ and XXXX 此时无法完成注入
id=1%df’ ,处理 1%df\’ ,进行编码 1%df%5c%27 ,带入sql后 id =1運’ and XXX, 此时存在宽字节注入漏洞
Less-32
本节我们在PHP Study的Less-32中完成,我们还是正常尝试注入点,结果在下面输出的语句中发现产生了转义:
http://192.168.1.1/sqli-labs-master/Less-32/?id=1'
法一:
按照宽字节注入的知识,我们往里面添加%df,后面可以跟单引号,也可以跟%27,这是单引号的编码:
http://192.168.1.1/sqli-labs-master/Less-32/?id=1%df'
在输出的语句中我们发现,注释符已经被成功利用宽字节吃掉了,这个时候再加入注释符--+,回显正确,注入点成功出现:
接下来的语句就是常规的联合查询,参考Less-1即可。
法二:
因为%5c代表\ ,所以我们只要用字母组合使其形成宽字节,从而使\(斜杠)失效,例如我们这里用%ee和%5c进行组合:
然后这里就也出现了注入点,使用联合查询即可进行注入,不再赘述。
Less-33
还是一样尝试寻找注入点,发现产生了转义:
我们查看源码发现这一关用了addslashes()函数:
其实与上一关的区别就是,这一关是使用函数过滤。而上一关用的是自定义过滤。那么我们可以继续使用宽字节注入,用上一节中任意一种都可以,这里我使用%df‘,也可以使用自定义的闭合:%ee%5c,%ee可以替换:
http://192.168.1.1/sqli-labs-master/Less-33/?id=1%df'--+
现在已经存在注入点了,使用联合查询即可,不再赘述。
Less-34
我们进入的时候就发现这是一种熟悉的界面形式,我们需要选择post数据形式进行传参,输入用户名admin,密码admin,登陆成功,参考前面的内容,我们得到Post数据的语句:
然后我们更改用户名,试图得到注入点,却发现没有反应。打开index源码,我们发现它也使用了addslashes()函数,对uname和passwd进行了转义,理论上我们可以使用前几关中的宽字节注入的方法进行测试:
我们使用%df,因为在用户名和密码都发生了转义,所以都得使用宽字符注入,结果发现还是没有访问成功,我们看到在语句和下方的提示中,转义字符已经被宽字符注入方式吃掉了,按道理应该回显成功,然而并没有:
打开Burp Suite,我们抓一下包看看,发现了问题:
语句为 :uname=a%25df%27&passwd=a&submit=Submit
我们看到捕获的数据里多了一个%25,为什么呢,我们通过解码发现,%25就是%(百分号)的码,也就是说,发生了又一次编码,不按照预定的语句走,当然无法执行成功了,我们这里有两种办法:
法一:修改参数(改包)
既然抓到的数据包它自己解码的时候会把百分号解码,那么我们在Burp Suite里面直接修改,把%25重新修改为%,改为我们想要的句子,为了避免转码,我们直接在Burp Suite里修改,不在火狐的Harkbar中输入了:
点击Forword执行语句,把数据放出去,再看回显,发现正常:
接下来我们只要在Burp Suite中进行联合查询的语句输入即可,不再赘述。
法二:将单引号的UTF-8转换为UTF-16的单引号模式
我们可以把普通的单引号转换:‘(单引号)转化为�’
然后我们就可以在火狐中输入了,因为我使用win2003,所以这个特殊符号会不以原来的方式出现,但是并不影响输入语句:
a�\‘ union select 1,2#
此时我们就成功测试出了注入点,接下来正常使用联合查询即可。
Less-35:无包裹
我们正常键入?id=1,结果发现回显的语句中没有任何注入:
所以我们直接进行注入即可,根本不用任何符号进行注入点测试,自然符号的转义就对我们无效了,跟Less-1的查询方式根本没有区别,参考Less-1即可,不再赘述。除此之外,我们也可以使用布尔盲注。
Less-36:用?id=1’包裹
我们照旧进行注入点的尝试,发现数据使用’(单引号)进行包裹:
http://192.168.1.1/sqli-labs-master/Less-36/?id=1'--+
我们在index中查看源码,发现这次对字符串使用的转义函数不一样:
mysql_real_escape_string函数,可以参考下列网址:
https://www.w3school.com.cn/php/func_mysql_real_escape_string.asp
同样,我们可以用宽字节注入的方式解决,参考Less-32即可,这里使最后一步的语句及截图,其他不再赘述:
http://192.168.1.1/sqli-labs-master/Less-36/?id=-1 %df' union select 1,2,group_concat(concat_ws(0x7e,username,password))from security.users --+
Less-37
这一关除了转义函数不同,事实上与Less-34别无二致:
我们看到转义函数使用了mysql_real_escape_string函数,我们可以照旧使用宽字节注入,与Less-34一样有两种方式可以使用:
法一:改包
因为数据包会发生重新编码,所以在Burp Suite中直接进行改包,具体步骤参考Less-34.
法二:将单引号的UTF-8转换为UTF-16的单引号模式
具体步骤参考Less-34,这里放出测试列数的语句,不再赘述;
�\'union select 1,2#
�\‘ union select 1,2#