文章作者:大师傅
团队交流群:673441920
-----------------------------------------------------------
1.1复现条件
环境:windows7+phpstudy2018+php5.2.17+apache
程序框架:Discuz_X3.2_TC_BIG5 2014.6
特点:存储型DOM_XSS bbcode 实体编码绕过 技巧分析
1.2复现漏洞
注册一个账号,发表一篇内容为[email=7"οnmοuseοver="alert(7)]7[/email] (tip:payload为bbcode标记语言写法)的帖子, 然后使用拥有修改权限的账号,点击如图1-1所示箭头所指的地方“编辑” 移动至编辑框内的“7”,
图1-1
而后弹框漏洞复现成功,如图1-2所示。
图1-2
1.3 url链接构造
以帖子链接为例:
链接1:http://localhost/test7/forum.php?mod=viewthread&tid=3&extra=page=1
链接2:http://localhost/test7/forum.php?mod=post&action=newthread&fid=2&extra=&topicsubmit=yes
我们可以看到参数名是mod,action,tid等,mod、action的作用是引入相关脚本
mod参数
以链接1为例在入口文件forum.php中, 在h71 执行了代码 require DISCUZ_ROOT.'./source/module/forum/forum_'.$mod.'.php'; mod引入的是功能模块/source/module/forum/下的脚本,如mod=viewthread 引入的就是/source/module/forum/forum_viewthread.php。
action 参数
链接2是根$action是引入/source/include/下的名为mod参数目录下的mod参数_action参数.php,
链接2引入的就是/source/module/post/post_newthread.php
tid参数 表示帖子id
1.4漏洞利用代码剖析
可控参数入库过程
我们可以看到如图1-3 所示
录入的数据库的数据 没有进行XSS过滤 就被存入数据库。
图1-3
②: 可控参数输出
当点击 “编辑” 时 请求链接是http://localhost/test7/forum.php?mod=post&action=edit&fid=2&tid=11&pid=11&page=1
当我们移动到输入的数据上之后就弹框执行payload代码。
由于直接查看代码视图模板页面不方便,这里我们直接在漏洞产生页面使用右键查看源代码方式进行代码分析(tip:当前笔者使用的是谷歌浏览器)。
图1-4
在如图1-4所示的h294 可以看到我们的payload代码中的双引号被html实体编码为" 在h301 变量textobj的值是 $('e_textarea') (Tip:这里提示一个知识要点: JS原生取element中html内容的方法,会将服务端转义过的单双引号实体编码进行反转, $('e_textarea') ,$()方法代码如下function $(id){ return !id? null : document.getElementById(id); }
效果如图5-4-4中h294的值被转化为如图1-5所示,"被还原为原生双引号 ) ,。
图1-5
图1-4中的 h302 变量wysiwyg的值我们可以使用 谷歌浏览器查看元素的 console。
如图1-6所示,wysiwyg的值为1。
图1-6
而后我们搜索 "textobj "看其进行了什么操作,通过搜索定位到图1-7所示内容。
图1-7
因为wysiwyg=1,所以执行h647的代码newEditor(1, bbcode2html(textobj.value));
textobj.value 为 [email=7"οnmοuseοver="alert(7)]7[/email] 在/static/js/bbcode.js 中先找到bbcode2html方法。
代码中有str = str.replace(/[email=(.[^[]*)](.*?)[/email]/ig, '<a href="mailto:$1" target="_blank">$2</a>'); 代码执行时,payload代码由
[email=7"οnmοuseοver="alert(7)]7[/email] 转换为图1-8所示画框的样式,(tip:bbcode2html方法是将bbcode标记语言转化为能浏览器可识别的html语言)。
图1-8
再找到newEditor方法 在/static/js/editor.js中,代码如图1-9所示。
图1-9
在进行if判断时 因为wysiwyg为1 所以执行了图1-9所示中画框的代码。isUndefined(initialtext)的值如图1-10所示为false。
图1-10
所以值为图1-8画框的值(tip:被bbcode2html方法处理过的值,也就是转化为html语言而非bbcode语言),而后值被带入writeEditorContents方法中输出页面,使payload被成功执行。
1.5Payload构造思路
通过代码分析我们可知,在帖子里的代码未经过滤,只是在bbcode2html方法中 将bbcode写法转换成html语言写法,使payload被成功运行,在编写payload的时候主要通过分析bbcode2html方法来进行编写。看一下怎么写payload可以转换成html语言而且正好嵌入原来的html页面中被执行。
推荐一下小密圈
分享WEB安全,漏洞类型,漏洞原理,防御策略,内网渗透,代码审计与安全编码规范,渗透冷门小技巧的小密圈,扫描即可加入 。