【Discuz!跨站脚本攻击】--跨站脚本攻击


前言

漏洞简介

漏洞编号:CVE-2018-10297

漏洞名称:Discuz!跨站脚本攻击

漏洞描述:Discuz! <= X3.4版本存在存储型跨站脚本漏洞,允许远程攻击者注入恶意脚本或HTML代码,从而获取敏感信息或劫持用户会话。

危险等级:中级


提示:以下是本篇文章正文内容,下面案例仅供参考

一、漏洞产生过程

1.漏洞生成点

漏洞在于DZ自带的编辑器,该编辑器在门户发布、修改文章,论坛发布、回复帖子均有使用,导致漏洞影响范围广泛。

portal.php

require './source/class/class_core.php';
$discuz = C::app();

$cachelist = array('portalcategory', 'diytemplatenameportal'); $discuz->cachelist = $cachelist; $discuz->init();

require DISCUZ_ROOT.'./source/function/function_home.php';
require DISCUZ_ROOT.'./source/function/function_portal.php';

if(empty($_GET['mod']) || !in_array($_GET['mod'], array('list', 'view', 'comment', 'portalcp', 'topic', 'attachment', 'rss', 'block'))) $_GET['mod'] = 'index';

define('CURMODULE', $_GET['mod']);
runhooks();

$navtitle = str_replace('{bbname}', $_G['setting']['bbname'], $_G['setting']['seotitle']['portal']); $_G['disabledwidthauto'] = 1;

require_once libfile('portal/'.$_GET['mod'], 'module');                 #漏洞存在位置

2.跟进portal_portalcp.php

if (!$_G['inajax'] && in_array($ac, array('index', 'portalblock', 'blockdata', 'category', 'plugin')) && ($_G['group']['allowdiy'] || $_G['group']['allowmanagearticle'] || $admincp2 || $admincp3 || $admincp4 || $admincp6)) {
 $modsession = new discuz_panel(PORTALCP_PANEL);
 if(getgpc('login_panel') && getgpc('cppwd') && submitcheck('submit')) { $modsession->dologin($_G[uid], getgpc('cppwd'), true);
 }
   if(!$modsession->islogin) {
    include template('portal/portalcp_login');
    dexit();
}
}

if($ac == 'logout') { $modsession = new discuz_panel(PORTALCP_PANEL);
 $modsession->dologout();
 showmessage('modcp_logout_succeed', 'index.php');
}

$navtitle = lang('core', 'title_'.$ac.'_management').' - '.lang('core', 'title_portal_management');

require_once libfile('function/portalcp');
require_once libfile('portalcp/'.$ac, 'include');                   #portalcp

3.跟进portalcp_article.php

}
$content = getstr($_POST['content'], 0, 0, 0, 0, 1);                     #可以看到我们通过post提交的文章具体内容进入getstr函数
$content = censor($content);
if(censormod($content) || $_G['group']['allowpostarticlemod']) {
    $article_status = 1;
} else {
    $article_status = 0;
}

4.跟进function_home.php

函数getstr实现了对字符串的过滤,但是html的参数设置导致对字符串进行过滤的不是dhtmlspecialchars()函数,而是一个自定义的正则匹配,该正则并未对单、双引号进行过滤,即未对传入的payload进行任何处理。

function getstr($string, $length = 0, $in_slashes=0, $out_slashes=0, $bbcode=0, $html=0) {
 global $_G;                                      #函数getstr实现了对字符串的过滤,但是html的参数设置导致对字符串进行过滤的不是dhtmlspecialchars()函数,而是一个自定义的正则匹配,该正则并未对单、双引号进行过滤,即未对传入的payload进行任何处理。
$string = trim($string);
$sppos = strpos($string, chr(0).chr(0).chr(0));
if($sppos !== false) {
    $string = substr($string, 0, $sppos);
}
if($in_slashes) {
    $string = dstripslashes($string);
}
$string = preg_replace("/\[hide=?\d*\](.*?)\[\/hide\]/is", '', $string);
if($html < 0) {
    $string = preg_replace("/(\<[^\<]*\>|\r|\n|\s|\[.+?\])/is", ' ', $string);
} elseif ($html == 0) {
    $string = dhtmlspecialchars($string);
}

if($length) {
    $string = cutstr($string, $length);
}

if($bbcode) {
    require_once DISCUZ_ROOT.'./source/class/class_bbcode.php';
    $bb = & bbcode::instance();
    $string = $bb->bbcode2html($string, $bbcode);
}
if($out_slashes) {
    $string = daddslashes($string);
}
return trim($string);
}

5.跟进存储型payload和数据库交互的地方

portalcp_article.php

发布文章则进入插入的代码块,否则进入更新的代码块。跟进执行插入操作的代码块,其中涉及C::t(‘portal_article_content’),可以知道是引入pre_portal_article_content类,对应的操作表为pre_portal_article_content表。

foreach($dbcontents as $key => $value) {
 C::t('portal_article_content')->update($value['cid'], array('title' => $pagetitle[$key], 'content' => $contents[$key], 'pageorder' => $key+1));
 unset($pagetitle[$key], $contents[$key]);
 }
if($cdbcount < $cpostcount) {
    foreach($contents as $key => $value) {
        C::t('portal_article_content')->insert(array('aid' => $aid, 'id' => $setarr['id'], 'idtype' => $setarr['idtype'], 'title' => $pagetitle[$key], 'content' => $contents[$key], 'pageorder' => $key+1, 'dateline' => TIMESTAMP));
    }
    $pagecount = $cpostcount;

6.跟进discuz_database

跟进其中调用的insert方法,最终调用的是/upload/source/class/discuz/discuz_database.php文件里discuz_database类中的insert方法

public static function insert($table, $data, $return_insert_id = false, $replace = false, $silent = false) {
    $sql = self::implode($data);
    $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
    $table = self::table($table);
    $silent = $silent ? 'SILENT' : '';
    return self::query("$cmd $table SET $sql", null, $silent, !$return_insert_id);
}

二、漏洞利用

1.漏洞触发方式

漏洞触发点有两个:

1)在开启论坛功能的情况下,触发反射型XSS;
2)开启门户功能的前提下,通过发布文章实现存储型XSS。

2.漏洞触发方式反射型XSS:

先创建用户xx,以xx的身份发布一篇文章,标题内容随意:
在这里插入图片描述
在网络图片地址中输入payload:

z" onerror=alert(1)=

3.提交后审查元素

提交后,F12查看元素,可以发现刚刚输入的payload被页面解析为img标签

在这里插入图片描述

4.漏洞利用存储型XSS

存储型XSS利用前提:目标网站开启门户功能,且所在用户组有发表文章的权限。
切换至管理员用户:/dir_SC_UTF8/upload/admin.php

管理员用户名:admin;密码:论坛创建时设置的管理员用户密码。

门户功能:全局—>站点功能—>门户

在这里插入图片描述
发布文章:首页—>门户管理—>xx(频道名称)—>发布文章
在这里插入图片描述
在网络图片地址中输入payload:http://xxx.xxx.xx.x/1.png"οnclick=alert(document.cookie) = (高度、宽度随机),点击提交,即可将我们生成的文章内容插入数据库

查看内容得到url:/upload/portal.php?mod=view&aid=1

可以看到payload已经被拼接成一个符合正常语法的img标签和a标签,成功存入数据库

5.进行内容审查

查看一下数据库内容:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

查看文章中的图片会出现弹窗
在这里插入图片描述
弹窗内容为cookie信息
在这里插入图片描述


跨站脚本攻击

1.什么是跨站脚本攻击

跨站脚本(Cross-site scripting,简称为 CSS , 但这与层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,因此,跨站脚本攻击缩写为XSS)是一种网站应用程序的安全漏洞攻击

XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序,这些恶意网页程序通常是JavaScript,但实际上也可以使Java, VBScript、 LiveScript、ActiveX、 Flash 或者甚至是普通的HTML ,攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作),私密网页内容,会话和cookie等各种内容。

2.XSS类型

常见XSS类型
常见的分类:反射型(非持久型)XSS、存储型(持久型)XSS、DOM型XSS、通用型XSS、突变型XSS。

3.常见攻击手段

XSS平台:可以用来构造一些payload语句,然后在该平台会显示你所要获得的信息

Beef

Cookie:用户凭据,可以用来证明身份信息,cookie和用户登录有关,存储在本地,小中型网站

想要通过xss获取cookie:

①:存在xss跨站漏洞

②:对方浏览器不拦截

③:对方有登录过

④:对方会触发

⑤:对方未过滤

4.常见攻击流程

Ⅰ:找注入点
找到数据输入的地方
判断回显位置—输入的数据在什么地方输出
如果输入的数据能够在前端进行输出,则可以证明输入的前段恶意代码在没有安全性处理的情况下能够输出前端,从而造成风险。
Ⅱ:构造基础的payload
病毒通常会做一些有害的或者恶性的动作。在病毒代码中实现这个功能的部分叫做“有效负载”(payload)。
Ⅲ:进行提交payload
分析响应状况
如果成功解析则XSS存在
反之考虑绕过
Ⅳ:确认漏洞
如果响应达到了预期,则说明漏洞存在,反之不存在。

Discuz!–漏洞修复方式

  1. 重写编辑器;
  2. 存储型XSS:将/upload/source/include/portalcp/portalcp_article.php中的
    在这里插入图片描述
    改为
`$content =getstr($_POST['content'], 0, 0, 0, 0, 0);`

修复测试:

修复后的数据库数据:
在这里插入图片描述

总结

从开发者角度:

来自应用安全国际组织OWASP的建议,对XSS最佳的防护应该结合以下两种方法:验证所有输入数据,有效检测攻击;对所有输出数据进行适当的编码,以防止任何已成功注入的脚本在浏览器端运行。

从用户角度:

更改浏览器安全设置,建议在浏览器设置中关闭JavaScript。如果使用IE浏览器,将安全级别设置到“高”。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Discuz! X3.4 在继承和完善 Discuz! X3.3 的基础上,去除了云平台的相关代码,其他功能保持不变,如果您的论坛不需要云平台可以选择安装或更新到此版本。 主要更新功能为: 1、完善视频解析播放 2、HTTPS兼容性优化 3、修复各类已知BUG和漏洞 修复与优化的问题列表: 1、对备案号的网址进行更新 2、修复 一处PHP5.3不兼容的写法 3、修复 目前系统内存在的部分小Bug 4、清除文本格式功能 增强 5、因视频认证已无法使用,去掉用户的个人空间 - 个人资料页的:“视频认证:未认证”。 6、修复 版块页未判断是否可发帖就显示验证码的问题 7、修复UC后台文件里的目录路径获取方式,方便站长更换入口名称 8、优化 语音验证码通过HTML5播放,放弃Flash 9、修复 系统内存在的部分小Typo 10、修复 小黑屋页面“更多”按钮行为异常的问题 11、修复主题发布页,当没有可修复数据时,点击修复数据的提示框类型不正常 12、修复新版本chrome下帖子列表页加载按钮行为异常的问题 13、修复 语言包的spacecp中积分代码有误的问题 14、修复 系统无法阻止某些无法正常登录的特殊符号用于注册用户名的问题 15、修复 HTML5通知功能在现代浏览器不可用的问题 16、修正官方拼写错误导致用户资料中的 【加入的群组】 无显示问题 17、修复 在部分情况下高亮功能导致页面卡死的问题 18、修复 chrome下编辑器插入链接功能无法立即使用的问题 19、修复 开启内存缓存时,forum_forumfield 表没被缓存导致的主题分类消失、版块规则消失、访问权限无效等问题 20、删除用户无法删除 用户记录表(home_doing)数据 21、修复 默认关闭非安全请求升级,保证HTTP外域资源正常显示 22、修复 IE11及firefox在使用编辑器按钮的时候出现的bug 23、修复 个人资料页点击放大签名档图片时样式缺失的问题 24、修复 帖子列表页点击长条形下一页按钮时加载出的帖子后方图标样式异常的问题 25、修复 IE9及以上在多处出现的css错位问题 26、修复 补全IN_DISCUZ相关代码 27、修复 云平台插件降级工具无法降级一部分云平台插件的问题 28、修复 使用花括号做数组被废弃导致在部分服务器配置下产生提示信息导致程序功能异常的Bug 29、优化 HTTPS兼容性优化 30、图片宽高一样时,无法缩放 31、修复 在PHP 5.3下内存缓存报错的Bug 32、修复 开启“关闭session机制”后,论坛验证码即使正确也会弹出错误提示 33、修复 并发任务可能产生的刷分问题 34、防止并发评分与道具的接口产生的刷分等问题 35、【轻量级 PR】:修复 HTTPS下二维码不显示BUG 36、修复 部分发送邮件场景下信任HTTP_HOST所带来的安全隐患 37、修复 UCenter任意文件包含Bug 38、【轻量级 PR】:修复 msapplication-task 字段的笔误 39、【轻量级 PR】:修复 界面 ? 风格管理中新增操作结果混乱的问题 40、修复 IE6、IE7等浏览器提示common.js报错的Bug 41、修复 前台充值卡密页面不显示验证码和同一卡密充值2次成功的Bug 42、【轻量级 PR】:修复门户”模块管理“菜单高亮相关BUG 43、【轻量级 PR】:修复target书写错误问题 44、【轻量级 PR】:修复 在宽屏模式下点击切换配色时,宽屏状态被破坏且无法切换的问题 45、【轻量级 PR】:修复 在PHP 5.3下核心报错的Bug 46、修复 当开启顶部导航固定、头像区域固定时,滚动页面出现页面、元素跳动,及元素闪烁等问题 47、修复 dintval BUG 48、优化 HTTPS兼容性优化 49、修复 目前系统内存在的部分小Bug 50、【轻量级 PR】:修复 一处后台点击后会出现双层frame的问题 51、修复部分页面游客无法看见关键字、描述的BUG 52、修复 通知提醒页面分页链接错误的BUG 53、【轻量级 PR】:优化 去除Manyou残余代码 54、修复 道具中心列表页在部分情况下排序异常的Bug 55、附件下载500错误修复 56、优化 放松视频网站链接解析标准 57、修复 交易贴买家卖家评价数据展示异常的问题、交易贴模板不支持自适应展示的问题 58、修复 由于调用顺序问题导致MIME Type设置无法生效的问题 59、优化 触屏版支持视频在线播放、新增 AcFun和哔哩哔哩等网站的视频解析 60、修复 邮件验证链接有效期内可以强制修改用户邮箱的Bug 61、优化 支持论坛、日志模块部分音视频格式、部分网站的HTML5播放 62、优化 回帖回收站支持自定义单页面审
第1步:上传 使用FTP软件登录您的服务器,建立一个单独的目录,或选择合适的位置,确保存放在此位置的文件能够被web请求所访问到,并且该目录中具有执行PHP代码的权限。将Discuz!文件包的./upload目录中的全部文件和目录结构上传到服务器(注意是上传upload目录中的文件和目录,而不是上传包含upload目录本身的目录和结构)。 如果您仍然不了解应该上传哪些内容,请参考《文件及目录结构》中的说明。 Discuz!要求使用FTP软件上传php文件时,使用二进制(BINARY)方式进行,否则将无法正常使用。有关二进制上传的具体细节,请参考《安装常见问题》中的说明。 第2步:设置目录属性 如果您的服务器使用Windows操作系统,可跳过这一步。 您在正式安装以前,需要设置相关的目录属性,以便数据文件可以被Discuz!正确的读写。使用FTP软件登录您的服务器,将服务器上以下的目录属性设置为777。 ./templates ./templates/default ./templates/default/*.* ./attachments ./customavatar ./forumdata ./forumdata/cache ./forumdata/templates ./forumdata/threadcaches ./forumdata/logs 如果您仍不了解那些目录或文件需要设置属性,请参考《文件及目录结构》中的说明。 如果您不了解应该如何设置属性,请参考《安装常见问题》中的说明。 第3步:配置数据库信息 使用编辑器打开您本地机器上的默认配置文件(config.inc.php),看到以下的内容: $dbhost='localhost';//databaseserver //数据库服务器 $dbuser='dbuser';//databaseusername //数据库用户名 $dbpw='dbpw';//databasepassword //数据库密码 $dbname='discuz';//databasename //数据库名 $adminemail='admin@your.com';//adminemail //论坛系统Email $dbreport=0;//senddberrorreport?1=yes //是否发送数据库错误报告?0=否,1=是 请依据以上的注释配置空间服务商提供的数据库服务器、用户名、密码及数据库名。如果您使用自己安装的服务器环境,我们建议您在可能的情况下,尽量不要使用root账号,而依据Discuz!及服务器上其他软件的需要,单独为每个程序分配账号和数据库,以减少安全问题发生的可能。 请您了解:数据库参数我们也无法告诉您如何设置,需要根据服务器账号的实际情况而定。如果您不了解,请咨询您的空间服务商,他们会完整的告诉您具体的设置方法。 配置好参数设置后,请保存该文件(config.inc.php),并不要忘记将其上传到服务器上的论坛目录中,覆盖原有的默认配置文件。 第4步:执行安装脚本 请在浏览器中运行install.php,即访问http://您的域名/论坛目录/install.php。 安装脚本会检查您的服务器系统环境、剩余空间、数据库环境,并具备一定的纠错功能。如果您在之前某一步骤操作有问题,通常安装脚本会发现并作以提示,请您根据提示再对安装过程进行检查。如果没有提示出问题,请您按照其中的说明,完成最后的安装。使用中的问题,请参考《使用指南》。 第5步:运行快速设置向导 现在进行到最后一步,如果您了解整个论坛的设置则不必运行此向导。 请在浏览器运行admincp.php,即访问http://您的域名/论坛目录/admincp.php,进行设置,此向导将根据您论坛的类型批量设置相关参数,您可以在运行完后,再进入详细设置进行微调。 安装成功后,请通过FTP删除安装脚本(install.php),以避免被再次安装。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值