Discuz! 储型跨站脚本(XSS)漏洞

2025-06-17 18:35:58 7 414 1
漏洞类型: 存储型XSS
Discuz : 需要启动日志模块 (默认是关闭的)
xss触发 : 注册用户
Discuz : 测试版本最新Discuz! X3.5 (其他版本没测试工具是通杀)

1.代码分析

source/include/spacecp/spacecp_blog.php
        require_once libfile('function/blog');
        if($newblog = blog_post($_POST, $blog)) {
                if(empty($blog) && $newblog['topicid']) {
                        $url = 'home.php?mod=space&uid='.$_G['uid'].'&do=topic&topicid='.$newblog['topicid'].'&view=blog&quickforward=1';
                } else {
                        $url = 'home.php?mod=space&uid='.$newblog['uid'].'&do=blog&quickforward=1&id='.$newblog['blogid'];
                }
                if($_GET['modblogkey']) {
                        $url .= "&modblogkey={$_GET['modblogkey']}";
                }
                dsetcookie('clearUserdata', 'home');
                showmessage('do_success', $url);
        } else {
                showmessage('that_should_at_least_write_things', NULL, array(), array('return'=>1));
        }
}
提交xss $_POST数据,然后把它转交给(blog_post   关键函数) 处理



subject 的表单输入框,也就是“日志标题”。。没有进行任何安全过滤

跟踪  blog_post


程序的执行流程跳转到了 source/function/function_blog.php



调用了 censor() 函数,只会匹配和替换屏蔽脏话、广告词,不会过滤,没有过滤XSS

正确的处理方法  dhtmlspecialchars   *(不知道为什么没有写要写个censor)
$POST['subject'] = dhtmlspecialchars($POST['subject']);
'subject' => $POST['subject'],     <-- xss脚本在这里被放入数组(日志标题)
xss写入数据库的数组 赋值给了 $blogarr 中没有过滤





执行数据库 函数调用分析: 这里调用了 C::t('home_blog')->insert()。这个方法会接收 $blogarr 数组,并生成一条SQL INSERT 语句,将数据写入 pre_home_blog 数据表。


html模板

template\default\touch\home\space_blog_view.htm
<div class="viewthread">
        <div class="view_tit">
                <!--{if $classarr['classname']}-->
                        <em>[<a href="home.php?mod=space&uid=$blog['uid']&do=blog&classid=$blog['classid']&view=me">{$classarr['classname']}</a>]</em>
                <!--{/if}-->
                <!--{if $blog[catname]}-->
                        <em>[<a href="home.php?mod=space&do=blog&view=all&catid=$blog['catid']">$blog['catname']</a>]</em>
                <!--{/if}-->
                $blog['subject']
                <!--{if $blog['status'] == 1}--><span>({lang pending})</span><!--{/if}-->
$blog[subject]  前端直接输出没有过滤


后台xss
日志标题可控
pre_home_blog   数据库(标题)里面直接保存,没有做任何修改

source/admincp/admincp_blog.php 路径
$blog['subject'] = cutstr($blog['subject'], 30);   关键代码   ======日志标题可控,直接输出,没有转义
"<a href=\"home.php?mod=space&uid={$blog['uid']}&do=blog&id={$blog['blogid']}\" target=\"_blank\">{$blog['subject']}</a>",   直接输出
showtablerow() 函数用于生成 HTML 表格行,它会将传入的字符串参数直接插入到生成的 HTML 中,不会对内容进行自动的 HTML 转义或过滤

2.测试

前台标题插入

<img src=x onerror=alert(1)>









PS:这个漏洞在手上一年多了。今天发出来

TCV:3


关于作者

小雨xyu16篇文章506篇回复

评论7次

要评论?请先  登录  或  注册