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

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

缺陷编号:wooyun-2015-0107869

漏洞标题:CSDJCMS系统SQL注入漏洞

相关厂商:chshcms.com

漏洞作者: 路人甲

提交时间:2015-04-21 12:35

修复时间:2015-07-25 12:37

公开时间:2015-07-25 12:37

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

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

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-04-21: 细节已通知厂商并且等待厂商处理中
2015-04-26: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放
2015-06-20: 细节向核心白帽子及相关领域专家公开
2015-06-30: 细节向普通白帽子公开
2015-07-10: 细节向实习白帽子公开
2015-07-25: 细节向公众公开

简要描述:

CSDJCMS系统SQL注入漏洞,官网演示

详细说明:

1.首先定位到漏洞文件app/controllers/user/pay.php。

public function tenpay_return_url() { 

$partner = CS_Tenpay_ID;
$key = CS_Tenpay_Key;
require_once (CSCMSPATH."tenpay/ResponseHandler.class.php");
$resHandler = new ResponseHandler();
$resHandler->setKey($key);
//通知id
$notify_id = $this->input->get_post('notify_id', TRUE);
//商户订单号
$out_trade_no = $this->input->get_post('out_trade_no', TRUE);
//财付通订单号
$transaction_id = $this->input->get_post('transaction_id', TRUE);
//如果有使用折扣券,discount有值,total_fee+discount=原请求的total_fee
$discount = $this->input->get_post('discount', TRUE);
//支付结果
$trade_statess = $_GET['trade_state'];
//交易模式,1即时到账
$trade_mode = $this->input->get_post('trade_mode', TRUE);
//判断签名
if($resHandler->isTenpaySign()) {
if("1" == $trade_mode ) {
if( "0" == $trade_statess){
$row=$this->db->query("select CS_ID,CS_User,CS_RMB from ".CS_SqlPrefix."pay where CS_Dingdan='".$out_trade_no."'")->row();//这里是关注点
if(!$row){
$this->CsdjSkins->Msg_url('验证失败,该定单不存在!',site_url('user'));
}else{
//人民币转金币


2.$out_trade_no来源于 $out_trade_no = $this->input->get_post('out_trade_no', TRUE); 继续跟踪,

function get_post($index = '', $xss_clean = FALSE)
{
if ( ! isset($_POST[$index]) )
{
return $this->get($index, $xss_clean);
}
else
{
return $this->post($index, $xss_clean);
}
}


3.由于CSDJCMS把get_post()函数的第二个参数设置为了TRUE,那就是要进行一个xss_clean的操作。继续跟踪

public function xss_clean($str, $is_image = FALSE)
{
/*
* Is the string an array?
*
*/
if (is_array($str))
{
while (list($key) = each($str))
{
$str[$key] = $this->xss_clean($str[$key]);
}
return $str;
}
/*
* Remove Invisible Characters
*/
$str = remove_invisible_characters($str);
// Validate Entities in URLs
$str = $this->_validate_entities($str);
/*
* URL Decode
*
* Just in case stuff like this is submitted:
*
* <a href="http://%77%77%77%2E%67%6F%6F%67%6C%65%2E%63%6F%6D">Google</a>
*
* Note: Use rawurldecode() so it does not remove plus signs
*
*/
$str = rawurldecode($str);//这里有一个decode的操作
/*
* Convert character entities to ASCII
*
* This permits our tests below to work reliably.
* We only convert entities that are within tags since
* these are the ones that will pose security problems.
*
*/
$str = preg_replace_callback("/[a-z]+=([\'\"]).*?\\1/si", array($this, '_convert_attribute'), $str);
$str = preg_replace_callback("/<\w+.*?(?=>|<|$)/si", array($this, '_decode_entity'), $str);
/*
* Remove Invisible Characters Again!
*/
$str = remove_invisible_characters($str);


4.这里对str有一个urldecode的操作,所以可以进行二次编码,构造payload。但是这里有一个验证过程

//判断签名
if($resHandler->isTenpaySign()) {


5,。本来无计可施,但是CSDJCMS很友好的给我们提供了一个只要输入错误的sign,程序会告诉我们正确的sign是多少。

3.jpg


6.本地构造好payload,见测试代码。

4.jpg


漏洞证明:

4.jpg

修复方案:

亲,你们真的$out_trade_no = $this->input->get_post('out_trade_no', TRUE); 第二个参数必须TRUE吗

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


漏洞回应

厂商回应:

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

忽略时间:2015-07-25 12:37

厂商回复:

漏洞Rank:15 (WooYun评价)

最新状态:

暂无