当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2013-020439

漏洞标题:PHPCMS 2008 最新漏洞(第一季)

相关厂商:phpcms

漏洞作者: 西毒

提交时间:2013-03-21 22:47

修复时间:2013-05-05 22:47

公开时间:2013-05-05 22:47

漏洞类型:SQL注射漏洞

危害等级:中

自评Rank:15

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2013-03-21: 细节已通知厂商并且等待厂商处理中
2013-03-24: 厂商已经确认,细节仅向厂商公开
2013-04-03: 细节向核心白帽子及相关领域专家公开
2013-04-13: 细节向普通白帽子公开
2013-04-23: 细节向实习白帽子公开
2013-05-05: 细节向公众公开

简要描述:

先放第一季吧

详细说明:

在include/common.inc.php中 ,这是phpcms的全局要加载的配置文件

$dbclass = 'db_'.DB_DATABASE;
require $dbclass.'.class.php';

$db = new $dbclass;
$db->connect(DB_HOST, DB_USER, DB_PW, DB_NAME, DB_PCONNECT, DB_CHARSET);

require 'session_'.SESSION_STORAGE.'.class.php';
$session = new session();
session_set_cookie_params(0, COOKIE_PATH, COOKIE_DOMAIN);

if($_REQUEST)
{
if(MAGIC_QUOTES_GPC)
{
$_REQUEST = new_stripslashes($_REQUEST);
if($_COOKIE) $_COOKIE = new_stripslashes($_COOKIE);
extract($db->escape($_REQUEST), EXTR_SKIP);
}
else
{
$_POST = $db->escape($_POST);
$_GET = $db->escape($_GET);
$_COOKIE = $db->escape($_COOKIE);
@extract($_POST,EXTR_SKIP);
@extract($_GET,EXTR_SKIP);
@extract($_COOKIE,EXTR_SKIP);
}
if(!defined('IN_ADMIN')) $_REQUEST = filter_xss($_REQUEST, ALLOWED_HTMLTAGS);
if($_COOKIE) $db->escape($_COOKIE);
}
//echo QUERY_STRING;
if(QUERY_STRING && strpos(QUERY_STRING, '=') === false && preg_match("/^(.*)\.(htm|html|shtm|shtml)$/", QUERY_STRING, $urlvar))
{
//var_dump($urlvar[1]);
//echo 'test';
parse_str(str_replace(array('/', '-', ' '), array('&', '=', ''), $urlvar[1]));

}


这里的话首先实例化了这个数据库,产生了一个$db资源句柄,他是用来操作数据库的
然后就是将我们传进来的参数进行变量化
这里有一些小过滤,自己可以看,所以这里传进来的参数就作为了变量
但是接下来这行呢?

if(QUERY_STRING && strpos(QUERY_STRING, '=') === false && preg_match("/^(.*)\.(htm|html|shtm|shtml)$/", QUERY_STRING, $urlvar))
{
//var_dump($urlvar[1]);
//echo 'test';
parse_str(str_replace(array('/', '-', ' '), array('&', '=', ''), $urlvar[1]));

}


看看这里?这里的QUERY_STRING来自前面
这里有个过滤,但是不影响
如果我们在这里进行覆盖这个db变量呢
因为这里 parse_str(str_replace(array('/', '-', ' '), array('&', '=', ''), $urlvar[1]));
可以将我们传进去的/ - 进行替换
所以我们如果提交如下字符
http://localhost/phpcms/index.php?db-5/gid-xd.html
他由于这个db被覆盖就会出错,所以物理路径就爆出来了

1.jpg


在c.php中

$db->query("UPDATE ".DB_PRE."ads SET `clicks`=clicks+1 WHERE adsid=".$ads['adsid']);
$info['username'] = $_username;
$info['clicktime'] = time();
$info['ip'] = IP;
$info['adsid'] = $id;
$info['referer'] = HTTP_REFERER;
$year = date('ym',TIME);
$table = DB_PRE.'ads_'.$year;
$table_status = $db->table_status($table);
//echo 'test';
if(!$table_status) {
include MOD_ROOT.'include/create.table.php';
}
$db->insert($table, $info);


注意这里的HTTP_REFERER这个常量
这里的常量是通过前面的common.inc.php定义好的
define('HTTP_REFERER', isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '');
没有经过任何过滤操作,所以你懂的,我估计很多同学已经发现了,只是没去公布了,所以俺就替你们xxoo了,哈哈...别骂我
然后
$db->insert($table, $info);
我们来看一下它这里的操作
所以你懂的

2.jpg


所以就可以xxoo了,很简单,exp已经写好了
暂时还只看一部分,可能一季一季的放吧
exp 我就放到https://forum.90sec.org 以及www.linux520.com里面去
大家去里面找

漏洞证明:

2.jpg

修复方案:

这个自己过滤吧!

版权声明:转载请注明来源 西毒@乌云


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:10

确认时间:2013-03-24 15:57

厂商回复:

希望还在使用08的朋友们尽快升级到v9。感谢提交问题。

最新状态:

暂无