也想出现在这里? 联系我们

PHP多字节编码漏洞小结

作者 : 小编 本文共3108个字,预计阅读时间需要8分钟 发布时间: 2021-06-12 共3.13K人阅读
也想出现在这里? 联系我们

如果小结中有理解错误的地方,麻烦大家提出。漏洞本质: php 使用 php_escape_shell_cmd这个函数来转义命令行字符串时是作为单字节处理的而当操作系统设置了GBK、EUC-KR、SJIS等宽字节字符集时候,将 …如果小结中有理解错误的地方,麻烦大家提出。漏洞本质:php 使用 php_escape_shell_cmd这个函数来转义命令行字符串时是作为单字节处理的而当操作系统设置了GBK、EUC-KR、SJIS等宽字节字符集时候,将这些命令行字符串传递给MySQL处理时是作为多字节处理的先看个简单的例子

复制代码

代码如下:

<?php header(\’Content-type: text/html; charset=gbk\’); //连接MySQL $conn = mysql_connect(\”localhost\”, \”root\”, \”\”); //选择数据库 mysql_select_db(\”test\”, $conn); //设置字符集编码 mysql_query(\”SET CHARACTER SET \’gbk\’\”, $conn); //创建DEMO表如果不存在 mysql_query(\”CREATE TABLE IF NOT EXISTS `demo` ( `uid` int(10) NOT NULL AUTO_INCREMENT, `username` varchar(32) NOT NULL, `password` varchar(32) NOT NULL, PRIMARY KEY (`uid`) ) ENGINE=MyISAM DEFAULT CHARSET=gbk AUTO_INCREMENT=1;\”, $conn); //插入个测试数据 mysql_query(\”REPLACE INTO `demo` VALUES(\’\’,\’admin\’,\’admin888\’) \”,$conn); //获取用户输入 $username = isset($_REQUEST[\’username\’]) ? $_REQUEST[\’username\’] : \’\’; //执行查询并且DEBUG $sql = \”SELECT * FROM demo WHERE username = \'{$username}\’ LIMIT 1\”; echo \”sql: \”.$sql.\”\”; $res = mysql_query($sql, $conn); $row = mysql_fetch_array($res); echo \”result: <br/>\”; var_dump($row); ?>

当GPC=OFF时:username未经任何过滤,这是个典型的字符型SQL注入测试地址:http://localhost/gbk.php?username=\’ or 1%23http://localhost/gbk.php?username=\’ or 0%23当然很多情况下GPC=OFF时候都会使用一些函数来过滤用户的输入

复制代码

代码如下:

// 对用户传入的变量进行转义操作 if (!get_magic_quotes_gpc()) { $username = addslashes($username); }

看上去貌似没问题了,但是由于多字节编码问题,同样还是可以注入的测试地址:http://localhost/gbk.php?username=%df%27使用mysql_real_escape_string函数对用户输入进行转义存在同样的问题目前的很多开源的系统都是通过设置客户端的字符集为二进制来防止多字节编码问题的。//使用上面这句来替换DEMO中的 mysql_query("SET CHARACTER SET \’gbk\’", $conn);mysql_query("SET character_set_connection=gbk, character_set_results=gbk, character_set_client=binary", $conn);再次测试:http://localhost/gbk.php?username=%df%27OK,这样一来,多字节编码问题就不存在了吗?不见得当使用mb_convert_encoding、iconv对字符集进行错误的转换时候,漏洞再次的出现了(GPC=ON时问题同样存在)例如:$username = iconv(\’gbk\’,\’utf-8\’,$username);或$username = mb_convert_encoding($username,\’utf-8\’,\’gbk\’);来看下T00ls上看到的ECSHOP 2.6.x/2.7.x GBK版本的漏洞吧漏洞文件在api/checkorder.php line 28

复制代码

代码如下:

$sql = \”SELECT COUNT(*) \”. \” FROM \” . $ecs->table(\’admin_user\’) . \” WHERE user_name = \’\” . trim($_REQUEST[\’username\’]). \”\’ AND password = \’\” . md5(trim($_REQUEST[\’password\’])) . \”\’\”;

我们来看下$_REQUEST[\’username\’] 的获取过程

复制代码

代码如下:

$_REQUEST[\’username\’] = json_str_iconv($_REQUEST[\’username\’]); json_str_iconv()这个函数在includes/lib_base.php中定义,其功能是将非UTF-8编码的字符串进行转换,然后return ecs_iconv(\’utf-8\’, EC_CHARSET, $str); ecs_inonv这个函数也在 includes/lib_base.php中定义,看下函数吧: function ecs_iconv($source_lang, $target_lang, $source_string = \’\’) { static $chs = NULL; /* 如果字符串为空或者字符串不需要转换,直接返回 */ if ($source_lang == $target_lang || $source_string == \’\’ || preg_match(\”/[\\x80-\\xFF]+/\”, $source_string) == 0) { return $source_string; } if ($chs === NULL) { require_once(ROOT_PATH . \’includes/cls_iconv.php\’); $chs = new Chinese(ROOT_PATH); } return $chs->Convert($source_lang, $target_lang, $source_string); }

先是引入了includes/cls_iconv.php这个文件,然后实例化了Chinese这个类,在调用类的Convert的方法见line 127$string = $this->_convert_iconv_mbstring($this->SourceText, $this->config[\’target_lang\’], $this->config[\’source_lang\’]);又调用了另外一个函数_conver_iconv_mbstring见line 278//这里错误的吧字符集从gbk转为了utf8,所以漏洞产生了$return_string = @mb_convert_encoding($string, $target_lang, $source_lang);

1. 本站所提供的源码模板(主题/插件)等资源仅供学习交流,若使用商业用途,请购买正版授权,否则产生的一切后果将由下载用户自行承担,有部分资源为网上收集或仿制而来,若模板侵犯了您的合法权益,请来信通知我们(Email: rayer@88.com),我们会及时删除,给您带来的不便,我们深表歉意!
2. 分享目的仅供大家学习和交流,请不要用于商业用途!
3. 如果你也有好源码或者教程,可以到用户中心发布投稿,分享有金币奖励和额外收入!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务 请大家谅解!
5. 如有链接无法下载、失效或广告,请联系站长,可领回失去的金币,并额外有奖!
6. 如遇到加密压缩包,默认解压密码为"www.zyfx8.cn",如遇到无法解压的请联系管理员!
本站部分文章、资源来自互联网,版权归原作者及网站所有,如果侵犯了您的权利,请及时联系我站删除。免责声明
资源分享吧 » PHP多字节编码漏洞小结

常见问题FAQ

免费下载或者VIP会员专享资源能否直接商用?
本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。

发表评论

Copyright 2015-2020 版权所有 资源分享吧 Rights Reserved. 蜀ICP备14022927号-1
开通VIP 享更多特权,建议使用QQ登录