Discuz 排行页面存储型XSS漏洞 分析

栏目: 编程工具 · 发布时间: 5年前

内容简介:2018年10月12日,某CMS官方修复了一处XSS漏洞:source/module/misc/misc_ranklist.php:166

2018年10月12日,某CMS官方修复了一处XSS漏洞:

Discuz 排行页面存储型XSS漏洞 分析

简要分析

source/module/misc/misc_ranklist.php:166

<?php 

function getranklist_members($offset = 0, $limit = 20) {
    require_once libfile('function/forum');
    $members = array();
    $topusers = C::t('home_show')->fetch_all_by_unitprice($offset, $limit, true);

    foreach($topusers as $member) {
        $member['avatar'] = avatar($member['uid'], 'small');
        $member['note'] = dhtmlspecialchars($member['note']);
        $members[] = $member;
    }
    return $members;
}

Dz在此处获取到 $member['note'] 后调用了 dhtmlspecialchars 进行过滤,在source/function/function_core.php:203 会对'&', '"', '<', '>'进行实体编码。

<?php 

function dhtmlspecialchars($string, $flags = null) {
    if(is_array($string)) {
        。。。
    } else {
        if($flags === null) {
            $string = str_replace(array('&', '"', '<', '>'), array('&', '"', '<', '>'), $string);

        } else {
            。。。
    }
    return $string;
}

getranklist_members 返回后 source/include/misc/misc_ranklist_index.php:113

<?php 
。。。
if($ranklist_setting['member']['available']) {
    $memberlist = getranklist_members(0, 27);
}
。。。
include template('diy:ranklist/ranklist');

进行模板的渲染在 data/template/1_diy_ranklist_ranklist.tpl.php:32

<?php if($memberlist) { ?>
<a href="home.php?mod=space&uid=<?php echo $memberlist['0']['uid'];?>&do=profile" target="_blank" id="bid_<?php echo $memberlist['0']['uid'];?>" class="hm" <?php if($memberlist['0']['note']) { ?> onmouseover="showTip(trhis)" tip="<?php echo $memberlist['0']['username'];?>: <?php echo $memberlist['0']['note'];?>"<?php } ?>><?php echo avatar($memberlist[0][uid],middle);?></a>
<?php } ?>

可以看到在 tip 属性中输出了 $memberlist['0']['note'] 。在之前有一个 onmouseover 事件,跟入 showTip(trhis) 在 static/js/common.js:1062

function showTip(ctrlobj) {
    $F('_showTip', arguments);
}

跟入 _showTip ,在 static/js/common_extra.js:912

function _showTip(ctrlobj) {
    if(!ctrlobj.id) {
        ctrlobj.id = 'tip_' + Math.random();
    }
    menuid = ctrlobj.id + '_menu';
    if(!$(menuid)) {
        var div = document.createElement('div');
        div.id = ctrlobj.id + '_menu';
        div.className = 'tip tip_4';
        div.style.display = 'none';
        div.innerHTML = '<div class="tip_horn"></div><div class="tip_c">' + ctrlobj.getAttribute('tip') + '</div>';
        $('append_parent').appendChild(div);
    }
    $(ctrlobj.id).onmouseout = function () { hideMenu('', 'prompt'); };
    showMenu({'mtype':'prompt','ctrlid':ctrlobj.id,'pos':'12!','duration':2,'zindex':JSMENU['zIndex']['prompt']});
}

通过 ctrlobj.getAttribute('tip') 获取tip属性的值,由于 getAttribute 获取的内容会自动反转义,即前面在 dhtmlspecialchars 编码过的内容又被解码了一次。此后拼接到div标签的 innerHTML 中,最后输出到页面上造成了xss

关于 getAttribute ,可以用下面代码测试:

<html>
<div name="<a>" id="div">test</div>
<script>
div1 = document.getElementById("div");
align = div1.getAttribute("name");

alert(align); 
</script>

漏洞复现

该CMS中,排行榜功能是默认开启的。在地址 http://127.0.0.1/misc.php?mod=ranklist&type=member 的上榜宣言中输入payload(拒绝伸手党)

Discuz 排行页面存储型XSS漏洞 分析

http://127.0.0.1/misc.php?mod=ranklist 当鼠标移动到头像上触发 onmouseover 事件,执行xss

Discuz 排行页面存储型XSS漏洞 分析

修复方案

Discuz 排行页面存储型XSS漏洞 分析

多增加一次 dhtmlspecialchars


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

区块链:定义未来金融与经济新格局

区块链:定义未来金融与经济新格局

张健 / 机械工业出版社 / 2016-6-18 / 49.00

从构建价值互联网的角度看,区块链的出现意味着从0到1。正因如此,本书章节结构与常见的体例不同,从第0章开始。第0章从文字与货币的起源出发,通过论述人类信息传递和价值传输手段的进步,说明区块链技术诞生的必然性。第1章用深入浅出的语言讲解区块链的本质、运行原理、颠覆性潜力以及区块链技术的现状与未来;第2章宏观讲述了区块链技术带来的新产品和新机遇,包括数字货币、互联网金融、物联网,以及新一代的基础设施;......一起来看看 《区块链:定义未来金融与经济新格局》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试