宽字节注入

漏洞介绍
1,涉及函数
addslashes():函数返回在预定义字符之前添加反斜杠字符串
mysql_real_esape_string():函数转义SQL语句中使用的字符串的特殊字符
mysql_escape_string():转义一个字符串
2,原理分析
何为宽窄字节
当某字符的大小为一个字节时,称其字符为窄字节。
当某字符的大小为两个字节时,称其字符为宽字节。
所有英文默认占一个字符,汉字占两个字符。
常见的宽字节编码:GB2312,GBK,GB18030,BLG5,Shift_JIS
为什么会产生宽字节,其中就涉及到编码格式的问题,宽字节注入主要是源于程序员设置数据库编码与PHP编码设置为不同的两个编码格式从而导致产生宽字节注入。
如果数据库使用的是GBK编码而PHP编码为UTF8就可能出现注入问题,原因是程序员为了防止SQL注入,就会调用上面的几种函数,将单引号或者双引号进行转义操作,转义无非便是在单或双引号前加上斜杠 () 进行转义,但这样并不是安全的,因为数据库使用的是宽字节编码,两个连在一起的字符会被当做一个汉字,而在PHP使用的UTF8编码则认为是两个独立的字符,如果在单或双引号前添加一个字符,使其和斜杠 () 组合被当成一个汉字,从而保留单或双引号,使其发挥作用。但添加的字符的Ascii要大于128,这样两个字符才能组合成汉字,因为前一个ascii码要大于128,才到汉字的范围。
3,什么是GBK编码
一种汉字编码
使用
以靶场举例,输入单引号后 1和’之间出现了\正如描述中所说,转义无非就是把单引号或者双引号前面加上\进行转义,想要成功只需要想办法将\去掉就行,而现在知道了漏洞产生是由编码引起,尝试利用编码解决问题。
\在编码中为 %5C这是后一个字节,只需要前面的字节可以和他组合并大于ascii128就可以达到需要的效果,常见的方式有 %df | %a1,如
如此就可以实现注入的效果,但是为什么说转义无非就是引号前加斜杠转义,这是因为使用了addslashes()函数,此函数就是在预定义的字符的前面添加反斜杠,知道原理就可以很好的处理了。
- 标题: 宽字节注入
- 作者: 莉蓓
- 创建于 : 2024-05-06 04:10:23
- 更新于 : 2024-05-06 05:00:14
- 链接: https://xkyuanm.github.io/2024/05/06/宽字节注入/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。