宽字节注入
宽字节注入
原理
mysql在使用GBK编码的时候,会认为两个字符为一个汉字,例如%aa%5c就是一个汉字(前一个ascii码大于128才能到汉字的范围)。我们在过滤 ’ 的时候,往往利用的思路是将 ’ 转换为 \’ 。
注入思路
(1) 思路一
由于单引号被过滤了,所以我们使用%df吃掉 \, 具体的原因是 urlencode(\') = %5c%27 , 我们在%5c%27前面添加%df,形成%df%5c%27,而上面提到的mysql在GBK编码方式的时候会将两个字节当做一个汉字,此事%df%5c就是一个汉字,%27则作为一个单独的符号在外面,同时也 就达到了我们的目的。
例子:
%df%27==>(addslashes)=>%df%5c%27==(数据库GBK)===>運’
前端输入%df%27时首先经过上面 addslashes 函数转义变成了%df%5c%27(%5c是反斜杠\), 之后在数据库查询前因为设置了GBK编码,即是在汉字编码范围内两个字节都会给重新编码为一个汉字。然后MySQL服务器就会对查询语句进行GBK编码即是%df%5c转换成了汉字”運”,而单引号 就逃逸了出来,从而造成了注入漏洞。1
(2) 思路二
将 \’ 中的 \ 过滤掉,例如可以构造 %**%5c%5c%27的情况,后面的%5c会被前面的%5c给转义掉。这也是bypass的一种方法。
另外
使用 set names UTF-8 指定了UTF8字符集,并且也使用转义函数进行转义。有时候在程序运行的时候,为了避免乱码,会将一些用户提交的GBK字符使用 iconv 函数
(或 mb_convert_encoding )先转为UTF8,然后再拼接SQL语句带入数据库。
转换过程:
%df%27==(addslashes)>%df%5c%27==(iconv)===>%e5%5c%5c%27
$id =iconv('GBK','UTF-8', $id) ; 如果内容是utf8编码的,将自动转成gbk编码的. 錦(%df%5c)的utf8编码是0xe98ca6,它的gbk编码是0xe55c。\的ascii码正是5c。那么,当我们的 錦 iconv 从utf8转换成gbk后,变成了%e5%5c,而后面的 ’ 被 addslashes 变成了%5c%27,这样组合起来就是%e5%5c%5c%27,两个%5c就是\,正好把反斜杠转义了,导致 ’ 逃逸出单引号, 产生注入。
sqli32注入过程
1、尝试了1 1‘ 1“ 都没有反应,根据提示可知是过滤掉了,接下来绕过过滤来注入
2、查看有几个字段,和最开始的sqli是一样的,最终获得数据
查看代码
preg_replace() 函数——执行一个正则表达式的搜索和替换
preg_quote()需要参数 str 并向其中 每个正则表达式语法中的字符前增加一个反斜线。
1. 参考
作者:P喵呜
链接:https://www.jianshu.com/p/84ba21e0eabc ↩