加入收藏 | 设为首页 | 会员中心 | 我要投稿 | 在线留言 | RSS
成网科技业务包括域名空间企业网站制作
 
国际域名com/net/org仅售80元/年
1G独立空间(PHP+MYSQL)仅售600元/年
您当前的位置:首页 > 技术交流 > 网络安全 > 脚本攻防

PHP多字节编码漏洞小结

时间:2014-08-02 12:04:57  来源:互联网  作者:佚名  点击:

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


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

当GPC=OFF时:Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
username未经任何过滤,这是个典型的字符型SQL注入Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
测试地址:Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
http://localhost/gbk.php?username=' or 1%23Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
http://localhost/gbk.php?username=' or 0%23Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
 Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
当然很多情况下GPC=OFF时候都会使用一些函数来过滤用户的输入Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设


复制代码代码如下:Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
// 对用户传入的变量进行转义操作 Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
if (!get_magic_quotes_gpc()) Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
{ Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
$username = addslashes($username); Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
}Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

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


复制代码代码如下:Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
$sql = "SELECT COUNT(*) ". Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
" FROM " . $ecs->table('admin_user') . Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
" WHERE user_name = '" . trim($_REQUEST['username']). "' AND password = '" . md5(trim($_REQUEST['password'])) . "'";Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

我们来看下$_REQUEST['username'] 的获取过程Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设


复制代码代码如下:Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
$_REQUEST['username'] = json_str_iconv($_REQUEST['username']); Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
json_str_iconv()这个函数在includes/lib_base.php中定义,其功能是将非UTF-8编码的字符串进行转换,然后return ecs_iconv('utf-8', EC_CHARSET, $str); Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
ecs_inonv这个函数也在 includes/lib_base.php中定义,看下函数吧: Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
function ecs_iconv($source_lang, $target_lang, $source_string = '') Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
{ Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
static $chs = NULL; Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
/* 如果字符串为空或者字符串不需要转换,直接返回 */Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
if ($source_lang == $target_lang || $source_string == '' || preg_match("/[/x80-/xFF]+/", $source_string) == 0) Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
{ Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
return $source_string; Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
} Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
if ($chs === NULL) Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
{ require_once(ROOT_PATH . 'includes/cls_iconv.php'); Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
$chs = new Chinese(ROOT_PATH); Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
} Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
return $chs->Convert($source_lang, $target_lang, $source_string); Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
}Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

先是引入了includes/cls_iconv.php这个文件,然后实例化了Chinese这个类,在调用类的Convert的方法见line 127Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
$string = $this->_convert_iconv_mbstring($this->SourceText, $this->config['target_lang'], $this->config['source_lang']);Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
 Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
又调用了另外一个函数_conver_iconv_mbstring见line 278Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
//这里错误的吧字符集从gbk转为了utf8,所以漏洞产生了Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设
$return_string = @mb_convert_encoding($string, $target_lang, $source_lang);Jnu成网科技_开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设

成网科技 www.it28.com竭诚为您服务!
开平网站建设_开平网站制作_开平企业网站_开平网页设计_江门网站建设_成网科技

更多
 


来顶一下
返回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
推荐资讯
相关文章
    无相关信息
栏目更新
栏目热门