百度首页 | 百度空间
 
查看文章
 
Discuz vs Phpwind
2008-08-08 00:52
Discuz vs Phpwind

这几天领导为了抢病人把我们120急救中心搬到院外,本来偷偷在院长办公室接来的网线现在也用不上了.到外面了就没办法上网了...没想到dz vs pw的进一步升级.
.最开始pw的'冰封浪子'在他的blog上发了一个dz sql注射的隐藏日志,结果被ring04h黑了,结果传来传去到处都是... dz的'剑心'看到并且证实了该漏洞..于是'冰封浪子'
就公布了他的exp,但是很奇怪的是Phpwind也存在类似的漏洞[虽然Phpwind6补丁了,但是以前的版本并没有补丁],于是被'剑心'抓到了..........

现在时间回到几年前,dz的'小戴'还是很有眼光的,'剑心'和'9xiao'黑了dz后,然后把'剑心'引进了dz,并且负责dz的安全,这样dz就偷偷的补丁了很多bug :) 并且安全部门
得到发展,同时他们利用'业余时间',发布了很多Phpwind的漏洞... Phpwind在安全上一直处于下风,到了phpwind6把代码结构重新整理,并且加强了安全性,到了今年才引进专门的安全人员[一切都是被逼的~~~~~~~~~被逼的]

感叹下,杂看别人的代码都那么厉害呢? :)

最后我们来具体说说这个漏洞的一些细节[Thx Ryat]

具体原理还是宽字节编码之间转换导致的安全问题.

这里看个代码:

<?php
//gpc=on
$id1=mb_convert_encoding($_GET['a'], 'utf-8', 'gbk');
$id2=iconv('gbk//IGNORE', 'utf-8', $_GET['a']);
$id3=iconv('gbk', 'utf-8', $_GET['a']);

print "select * from test where id='$id1'";
print "select * from test where id='$id2'";
print "select * from test where id='$id3'";
?>

提交a=%bf%27 然后查看原代码可以看到:

select * from test where id='縗''
select * from test where id='縗''
select * from test where id='縗''

以上gbk转utf-8导致安全问题,但是dz不完全是这样.

\wap\index.php里

if($_POST && $charset != 'utf-8') {
    $chs = new Chinese('UTF-8', $charset);// 这里是utf-8转gbk
    foreach($_POST as $key => $value) {
        $$key = $chs->Convert($$key);
    }
    unset($chs);
}

include\chinese.class.php里:

    function Chinese($SourceLang, $TargetLang) {
        $this->config['SourceLang'] = $this->_lang($SourceLang);
        $this->config['TargetLang'] = $this->_lang($TargetLang);

        if(function_exists('iconv')) {
            $this->iconv_enabled = true; //如果存在iconv()就使用iconv
        } else {
            $this->iconv_enabled = false; //如果不存在dz就自己实现了一个转换,但是这个转换导致的bug
            $this->OpenTable();
        }
    }
   
    .........
   
    ($this->iconv_enabled) {
            if($this->config['TargetLang'] <> 'UNICODE') {
                return iconv($this->config['SourceLang'], $this->config['TargetLang'], $SourceText); //使用iconv转换
            } else {
                $return = '';
                while($SourceText) {
                    if(ord(substr($SourceText, 0, 1)) > 127) {
                        $retur
    ..........
   

于是我们看看php手册对iconv的描叙:

安装

To use functions provided by this module, the PHP binary must be built with the following configure line: --with-iconv[=DIR].

Note to Windows(R) Users: In order to enable this module on a Windows(R) environment, you need to put a DLL file named iconv.dll or iconv-1.3.dll (prior to 4.2.1) which is bundled with the PHP/Win32 binary package into a directory specified by the PATH environment variable or one of the system directories of your Windows(R) installation.

This module is part of PHP as of PHP 5 thus iconv.dll and php_iconv.dll is not needed anymore.

也就是说在win系统上php5以后系统默认就有iconv(),但是php4需要设置php.ini,对于*uix系统,自己编译php不管是5 都需要自己设置php.ini加载iconv.so才行,而dz上面那个漏洞的条件是目标系统上不支持iconv才行.这个也是很多人测试不成功的原因.[并不是人家给的假的exp,而且需要登陆后才触发].

对于dz和pw不知道是代码抄写还是怎么的,很多功能和代码很类似,所以导致的漏洞也类似[可以参考我以前的blog],下面我看看phpwind5的代码:

\wap\global.php里

if($charset != 'utf8'){
    $chs = new Chinese('UTF8',$charset);
    foreach($_POST as $key=>$value){
        $$key=$chs->Convert($$key);
    }
}

但是\wap\chinese.php里并没有使用iconv,而是完全自己写的代码实现[代码基本和dz一样].


类别:默认分类 | 添加到搜藏 | 浏览() | 评论 (6)
 
最近读者:
 
网友评论:
1
2008-08-08 10:12
都是“逼”出来的~!
 
2
2008-08-08 12:51
说实在的ring04h就是一个傻B,那个叫什么sunware的也是个傻B,明明是菜逼老是要装牛逼,
何苦呢?
 
3
2008-08-08 16:40
说到底都是WAP惹的祸。。
 
4
2008-08-08 17:28
这个漏洞基本和wap没太多关系
 
5
2008-08-09 09:49
2楼人品有问题? 啥都不知道就做出攻击性的评论。
 
6
2008-08-09 22:52
我没看明白变量存在全局没有初始化这个问题也就是这个$db_wapifopen变量吧,不是在data/bbscache/config.php里有初始化吗?
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码:
 

     

©2008 Baidu