Discuz vs Phpwind

作者:5up3rh3i
原文链接

这几天领导为了抢病人把我们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一样].

相关日志

抢楼还有机会... 抢座Rss 2.0或者 Trackback

发表评论