基本介绍
首先我们需要一起来了解一下什么是窄字节、宽字节、宽字节编码(英文默认占一个字节,汉字占两个字节):
- 窄字节:字符的大小为一个字节时,称其字符为窄字节
- 宽字节:字符的大小为两个字节时,称其字符为宽字节
- 宽字节编码: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编码方式的时候会将两个字节当做一个汉字,此时%df%5c就是一个汉字,%27则作为一个单独的符号在外面,同时也就达到了我们的目的
- 将\'中的\过滤掉:可以构造%**%5c%5c%27的情况,后面的%5c会被前面的%5c给注释掉,这也是bypass的一种方法,'转换为utf-16为�'
注入流程
宽字节注入除了上面的构造外和其余注入没有什么特别大的区
订阅专栏 解锁全文
269

被折叠的 条评论
为什么被折叠?



