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

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

缺陷编号:wooyun-2015-0107120

漏洞标题:tipask问答社区xss定向getshell

相关厂商:tipask问答社区

漏洞作者: Aug0st

提交时间:2015-04-13 13:15

修复时间:2015-07-14 14:08

公开时间:2015-07-14 14:08

漏洞类型:命令执行

危害等级:高

自评Rank:20

漏洞状态:已交由第三方合作机构(cncert国家互联网应急中心)处理

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-04-13: 细节已通知厂商并且等待厂商处理中
2015-04-15: 厂商已经确认,细节仅向厂商公开
2015-04-18: 细节向第三方安全合作伙伴开放
2015-06-09: 细节向核心白帽子及相关领域专家公开
2015-06-19: 细节向普通白帽子公开
2015-06-29: 细节向实习白帽子公开
2015-07-14: 细节向公众公开

简要描述:

tipask问答社区某工功能xss可以导致getshell,其实只要构造好了问题,不用定向问管理员,只要管理员把问题点了,就能触发导致getshell

详细说明:

tipask问答社区定向提问处未做过滤,导致xss,然后台出可以写文件,然后用前台的提问去提问管理员,管理员前台点开问题即可触发getshell,不需要管理后台交互。其实只要构造好了问题,不用定向问管理员,只要管理员把问题点了,就能触发导致getshell.

漏洞证明:

1.首选来看这个xss,这个应该会和此人的这个有重合, WooYun: tipask xss漏洞打包,可任意指定用户获取cookie ,但是我看不到他的具体细节。(其实此人我认识)
来看,问题出现在了提问处

28.png


来看代码,

function onadd() {
$navtitle = "提出问题";
if (isset($this->post['submit'])) {
$title = htmlspecialchars($this->post['title']);
$description = $this->post['description'];//未做处理
$cid1 = $this->post['cid1'];
$cid2 = $this->post['cid2'];
$cid3 = $this->post['cid3'];
$cid = $this->post['cid'];
$hidanswer = intval($this->post['hidanswer']) ? 1 : 0;
$price = abs($this->post['givescore']);
$askfromuid = $this->post['askfromuid'];
$this->setting['code_ask'] && $this->checkcode(); //检查验证码
$offerscore = $price;
($hidanswer) && $offerscore+=10;
(intval($this->user['credit2']) < $offerscore) && $this->message("财富值不够!", 'BACK');
//检查审核和内容外部URL过滤(此处也不是处理特使字符,只是审核和检查有没有外部url)
$status = intval(1 != (1 & $this->setting['verify_question']));
$allow = $this->setting['allow_outer'];
if (3 != $allow && has_outer($description)) {
0 == $allow && $this->message("内容包含外部链接,发布失败!", 'BACK');
1 == $allow && $status = 0;
2 == $allow && $description = filter_outer($description);
}
//检查标题违禁词(这也不是处理)
$contentarray = checkwords($title);
1 == $contentarray[0] && $status = 0;
2 == $contentarray[0] && $this->message("问题包含非法关键词,发布失败!", 'BACK');
$title = $contentarray[1];
//检查问题描述违禁词(也不是)
$descarray = checkwords($description);
1 == $descarray[0] && $status = 0;
2 == $descarray[0] && $this->message("问题描述包含非法关键词,发布失败!", 'BACK');
$description = $descarray[1];
/* 检查提问数是否超过组设置 */
($this->user['questionlimits'] && ($_ENV['userlog']->rownum_by_time('ask') >= $this->user['questionlimits'])) &&
$this->message("你已超过每小时最大提问数" . $this->user['questionlimits'] . ',请稍后再试!', 'BACK');
$qid = $_ENV['question']->add($title, $description, $hidanswer, $price, $cid, $cid1, $cid2, $cid3, $status);


so弹了

29.png

,所以此处证明有xss,其实还有好多处,咱用这一处。
2,下来再看后台可以写shell的证明,在此处

30.png


来看代码
function onucenter() {
if (isset($this->post['submit'])) {
$this->setting['ucenter_open'] = intval(isset($this->post['ucenter_open']));
$_ENV['setting']->update($this->setting);
if ($this->post['ucenter_config']){
$ucconfig = "<?php\n";
$ucconfig.=tstripslashes($this->post['ucenter_config']);
writetofile(TIPASK_ROOT . '/data/ucconfig.inc.php',$ucconfig);
}
//连接ucenter服务端,生成uc配置文件
$message = 'UCenter设置完成!';
}
include template('setting_ucenter', 'admin');
来看这个函数tstripslashes
function tstripslashes($string) {
if (is_array($string)) {
foreach ($string as $key => $val) {
$string[$key] = tstripslashes($val);
}
} else {
$string = stripslashes($string);
}
return $string;
}
看到stripslashes想到了什么哈哈没错
所以是可以写进去shell的
好了,咱们看两者结合,构造如下.

31.png


,提交。管理登陆。

32.png


显然我们的js已经加载了。然后看看文件写成功了没。

33.png

,文件写入成功。菜刀连接

34.png

成功。
3.再附一处程序bug

35.png


修复方案:

你们更专业

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:10

确认时间:2015-04-15 14:07

厂商回复:

CNVD未直接复现所述漏洞情况,暂未建立与软件生产厂商(或网站管理单位)的直接处置渠道,待认领。

最新状态:

暂无