作者:王文大博士_924 | 来源:互联网 | 2023-05-18 00:13
宽字节注入源于程序员设置MySQL连接时的错误配置,如下:setcharacter_set_clientgbk这样的配置会引发编码转换从而导致绕过某些防护实现注入漏洞。具体分析一
宽字节注入源于程序员设置MySQL连接时的错误配置,如下:
set character_set_client=gbk
这样的配置会引发编码转换从而导致绕过某些防护实现注入漏洞。具体分析一下原理:
-
正常情况下GPC开启或者使用addslashes函数过滤GET或POST提交的参数时,我们测试输入的',就会被转义为\';
-
若存在宽字节注入,输入%df%27时,经过单引号的转义变成了%df%5c%27,之后再数据库查询语句进行GBK多字节编码,即一个中文占用两个字节,一个英文同样占用两个字节且在汉字编码范围内两个编码为一个汉字。然后MySQL服务器会对查询语句进行GBK编码即%df%5c转换成汉字"運",单引号逃逸出来,从而绕过转义造成注入漏洞。
现在基本都会将mysql的连接配置设置为:
[set character_set_client=binary]
来解决这个问题,这篇博客将介绍php中因为编码或字符编码转换导致的注入问题。
mysql中的宽字符注入
测试搭建学习的环境利用了phithon内容管理系统,看代码
已经报错,看到报错,说明sql语句出错,看到出错说明可以注入。报错的原因就是多了一个单引号,而单引号前面的反斜杠不见啦。这就是mysql的特性,因为gbk是多字节编码,它认为两个字节代表一个字符,所以%df和后面的%5c变成了汉字“運”,而’逃逸了出来。
因为是两个字节代表一个汉字,我们尝试%df%df%27
不报错了,因为%df%df组成了汉字"哌",%5c%27不是汉字,仍然是\'
mysql如何判断一个字符是不是一个汉字,根据gbk编码,第一个字节的ascii码大于128,基本上就行,若不用%df而用%a1也可以
%a1%5c虽然不是一个汉字,但一定会被mysql认为是一个宽字符,所以就能让后面的%27逃逸出来,构造一个exp,查询管理人员的账号密码。
![](https://img.php1.cn/3cd4a/1eebe/cd5/7494af3c1cda418d.webp)
我们若解决需要做的指定php连接mysql的字符集。我们需要在执行sql语句之前调用一下mysql_set_charset
函数,设置当前的字符集为gbk,来避免问题
![](https://img.php1.cn/3cd4a/1eebe/cd5/eec57030b649a106.webp)
报错说明我们錦被iconv从utf-8转换成gbk后,变成了%e5%5c,而后面的'被addslashes变成了%5c%27,这样组合起来就是%e5%5c%5c%27,两个%5c就是\,正好把反斜杠转义了,导致'逃逸出单引号,产生注入。利用的是将\转移掉。
利用iconv将gbk转换成utf-8,则可以直接用宽字节注入的姿势来。gbk汉字2字节,utf-8汉字是3字节,若把gbk转换成utf-8,则php会每两个字节一转换。所以,如果\’前面的字符是奇数的话,势必会吞掉\,’逃出限制。
总结
-
gbk编码造成的宽字符注入问题,解决方法是设置character_set_client=binary。
-
矫正人们对于mysql_real_escape_string的误解,单独调用set name=gbk和mysql_real_escape_string是无法避免宽字符注入问题的。还得调用mysql_set_charset来设置一下字符集。
-
谨慎使用iconv来转换字符串编码,很容易出现问题。只要我们把前端html/js/css所有编码设置成gbk,mysql/php编码设置成gbk,就不会出现乱码问题。不用画蛇添足地去调用iconv转换编码,造成不必要的麻烦。
代码审计实战
对骑士cms审计时发现在plus/ajax_street.php
![](https://img.php1.cn/3cd4a/1eebe/cd5/eec57030b649a106.webp)
然后利用union的查询语句爆出可利用的列为4,8,exp:
http://localhost/74cms/upload/plus/ajax_street.php?act=key&key=-%e9%8c%a6' union select 1,2,3,4,5,6,7,8,9-- -),
然后是爆出数据库和用户名等相关信息
![](https://www.#.com/imgs/8/7/2/4/66/ed80bdd976caeb1d3b09cee9561abf0d.jpe)
补充
GBK编码中的两个字符是一个汉字,第一个字符需要大于128
----------------文章转载自微信公众号---信安之路