宽字节注入
宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而导致的注入漏洞。
具体原理如下:
1.正常情况下当GPC开启或使用addslashes函数过滤GET或POST提交的参数时,黑客使用的单引号 '就会被转义为: ';
2.但如果存在宽字节注入,我们输入%df%27时首先经过上面提到的单引号转义变成了%df%5c%27(%5c是反斜杠),之后在数据库查询前由于使用了GBK多字节编码,即在汉字编码范围内两个字节会被编码为一个汉字。然后MySQL服务器会对查询语句进行GBK编码即%df%5c转换成了汉字“運”,而单引号逃逸了出来,从而造成了注入漏洞。
现在基本上都会将mysql的连接配置为“setcharacter_set_client=binary”来解决这个问题,所以这篇文章将介绍出现在php中因为字符编码转换导致的注入问题。
使用GBK编码
这里纠正一些人的观念,GBK编码是数据库编码,跟前台的编码无关,比如我这代码<meta charset="utf-8" />就是使用了UTF-8。当我们正常请求这个网站的时候,数据库执行的是 select * from news where id = '1'
我们按照上节课讲的加个单引号,我们看是什么样子
我们输入的变成了 select * from news where id = '1'' ,在mysql里面,反斜杠是转义符,相当于,把我们输入的1' 拿到数据库有没有匹配的项。
那这样我们是不是没有办法注入了?
那么本节课的重点就来了。因为数据库使用的是GBK的编码,的编码是%5c我们可以使用%df来吃掉它,那什么叫吃掉呢?
%df%5c在GBK编码中是属于一个字符"運",我我们输入id=1%df%27的时候,程序检测到有单引号(%27),就默认在它前面加了一个转义符(%5c)数据库查询的就是select * from news where id = '1%df%5c%27'
之前说过,%df%5c = 運
这样我们的%27也就是单引号就逃出转义了,我们又是可以构造注入语句了
我们来测试一下
现在这种写法已经很少了,有些程序员有这个安全意识,就把代码改成了这样
GBK转UTF-8
我们来看看,关键的代码
原理其实跟前言里第2条是一样的,我们输入%df%27时首先经过上面提到的单引号转义变成了%df%5c%27(%5c是反斜杠),然后%df%5c正好属于gbk的汉字编码范围,经过iconv转换到utf-8编码转换后变成了汉字“運”,从而吞掉了反斜杠使得单引号逃脱出来。
utf-8转gbk
测试代码
这里我们就要用点逆向思维了
这里我们思考下“錦”这个字,它的utf-8编码是e98ca6,它的gbk编码是e55c,而上面提到过反斜杠正好为5c。
所以如果我们将title设置为:錦’,首先经过addlashes函数或GPC对单引号转义变为:錦’,然后会经过icnov函数会对”錦”转化为gbk编码,最后就是: %e5%5c%5c%27。反斜杠被转义了( %5c%5c),从而单引号逃逸出来就会引发注入漏洞。
实验一下,我们看到报错
分析一下报错信息
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''xE5''' at line 1
''xE5''' xE是属于一个字符,这就多出了一个,反斜杠是转义符,',这样的话,转义符就转义了第二个,导致单引号逃出来,我们就可以继续注入了。
作者:sqler
来源:https://bbs.ichunqiu.com/thread-15899-1-1.html
“炼石杯”网络空间安全技能大赛
以赛促学、以技会友
更有诸多大奖等你拿
详情咨询QQ群:478091920
2、本站永久网址:https://www.yuanmacun.com
3、本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
4、本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
5、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
6、本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。
源码村资源网 » 从代码角度看防范sql注入可从(从代码角度看防范sql注入可从哪里进行)
1 评论