Discuz! 储型跨站脚本(XSS)漏洞
漏洞类型: 存储型XSS
Discuz : 需要启动日志模块 (默认是关闭的)
xss触发 : 注册用户
Discuz : 测试版本最新Discuz! X3.5 (其他版本没测试工具是通杀)
1.代码分析
source/include/spacecp/spacecp_blog.php提交xss $_POST数据,然后把它转交给(blog_post 关键函数) 处理
subject 的表单输入框,也就是“日志标题”。。没有进行任何安全过滤
跟踪 blog_post
程序的执行流程跳转到了 source/function/function_blog.php
调用了 censor() 函数,只会匹配和替换屏蔽脏话、广告词,不会过滤,没有过滤XSS
正确的处理方法 dhtmlspecialchars *(不知道为什么没有写要写个censor)xss写入数据库的数组 赋值给了 $blogarr 中没有过滤
执行数据库 函数调用分析: 这里调用了 C::t('home_blog')->insert()。这个方法会接收 $blogarr 数组,并生成一条SQL INSERT 语句,将数据写入 pre_home_blog 数据表。
html模板
template\default\touch\home\space_blog_view.htm$blog[subject] 前端直接输出没有过滤
后台xss
日志标题可控
pre_home_blog 数据库(标题)里面直接保存,没有做任何修改
source/admincp/admincp_blog.php 路径showtablerow() 函数用于生成 HTML 表格行,它会将传入的字符串参数直接插入到生成的 HTML 中,不会对内容进行自动的 HTML 转义或过滤
2.测试
前台标题插入
<img src=x onerror=alert(1)>
PS:这个漏洞在手上一年多了。今天发出来
TCV:3
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));
}
}
subject 的表单输入框,也就是“日志标题”。。没有进行任何安全过滤
跟踪 blog_post
程序的执行流程跳转到了 source/function/function_blog.php
调用了 censor() 函数,只会匹配和替换屏蔽脏话、广告词,不会过滤,没有过滤XSS
正确的处理方法 dhtmlspecialchars *(不知道为什么没有写要写个censor)
$POST['subject'] = dhtmlspecialchars($POST['subject']);
'subject' => $POST['subject'], <-- xss脚本在这里被放入数组(日志标题)
执行数据库 函数调用分析: 这里调用了 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}-->
后台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>", 直接输出
2.测试
前台标题插入
<img src=x onerror=alert(1)>
PS:这个漏洞在手上一年多了。今天发出来
TCV:3
评论7次
小通杀不错,但是没有太多利用价值
大佬可以的,学xi了
通杀吗?
应该是,可以看下代码
通杀吗?
测的是可以正常测出来,但是就是不知后面的原理,感谢大佬详细的审计分享。
一看大佬就是又新挖了rce。才会公开以前的。恭喜恭喜
PS:说下图片太多了 不知道有没有插错,没办法复制。😪