跨站脚本(Cross-site scripting,一般简称为XSS)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它容许恶意用户将代码注入到网页上,其余用户在观看网页时就会受到影响。这类攻击一般包含了HTML以及用户端脚本语言。php
XSS攻击一般指的是经过利用网页开发时留下的漏洞,经过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序一般是JavaScript,但实际上也能够包括Java,VBScript,ActiveX,Flash或者甚至是普通的HTML。攻击成功后,攻击者可能获得更高的权限(如执行一些操做)、私密网页内容、会话和cookie等各类内容。html
Discuz 在用户评论处设置了帖子管理员编辑评论的功能,因为前端 JS 代码处理不当致使了通过恶意构造的评论内容在通过交互后造成 XSS 。下面经过 payload 的调试过程来解释该漏洞的造成过程。前端
JS原生去ELEMENT中HTML内容的方法,会将服务端转义过的单双引号实体编码进行反转。后端
payload:[align=”onmouseover=”alert(1)]浏览器
这是一种bbcode语言,多用于bbs,blog中。浏览器不会识别这种语言,只能转换成html实体语言,浏览器才会识别安全
查看源码,发现已被实体编码,不会弹框。服务器
当管理或版主对用户的评论点击管理时,前端JS代码就开始处理,弹出一个编辑框供管理或版主操做。在JS代码处理的过程当中,首先获取用户评论的内容,代码位于当前页面中cookie
而$() 函数是通过封装过的,原型位于 /static/js/common.js 中:xss
使用了原生的 document.getElementById() 函数来获取页面中的对应对象,此处获取的是标有id=”e_textarea” 的对象,其对应的值为用户评论的内容。因为JS原生函数的缘由,被服务器后端转义的引号会被从新是渲染回引号:函数
而后流程继续执行,wysiwyg在前面判断浏览器时已经赋了值
在前面wysiwyg变量的值为1,因此会执行以下代码
newEditor(1, bbcode2html(textobj.value))
其中textobj.value的值为: 2(通过document.getElementById()获取的对象解析了实体编码)
在进行 newEditor() 时,会对传入的内容使用函数bbcode2html()进行编码过滤,其函数原型位于/static/js/bbcode.js,
程序匹配其支持的shortcode而后正则替换为相应的HTML代码,
str = str.replace(/[email=(.[^\[])](.?)[/email]/ig, '$2');
通过正则匹配替换后,str的值会变为: 2
继续跟踪,在当前文件中,直接把刚刚传入的textobj的值,嵌入到html语句中后,直接写入到页面当中。
直接产生xss