基本介绍
首先我们需要一起来了解一下什么是窄字节、宽字节、宽字节编码(英文默认占一个字节,汉字占两个字节):
- 窄字节:字符的大小为一个字节时,称其字符为窄字节
- 宽字节:字符的大小为两个字节时,称其字符为宽字节
- 宽字节编码:GB2312,GBK,GB18030,BIG5,Shift_JIS等等
宽字节注入主要是源于程序员设置数据库编码与PHP编码设置为不同的两个编码格式从而导致产生宽字节注入,例如:在使用PHP连接MySQL的时候,很多人都会增加一句
"set character_set_client = gbk"
MySQL在使用GBK编码的时候会认为两个字符为一个汉字,例如:%aa%5c是一个汉字(前一个ascii码大于128才能到汉字的范围),而程序员们在过滤'的时候往往利用的思路是将'转换为\' ,因此我们可以想办法将'前面添加的\除掉,一般有两种思路:
- %df吃掉'\':具体的原因是urlencode('\)=%5c%27,我们在%5c%27前面添加%df,形成%df%5c%27,而上面提到的mysql在GBK编码方式的时候会将两个字节当