2018年10月12日,Discuz官方修复了一处XSS漏洞:
简要分析
source/module/misc/misc_ranklist.php:166
Dz在此处获取到$member['note']
后调用了dhtmlspecialchars
进行过滤,在source/function/function_core.php:203 会对’&’, ‘“‘, ‘<’, ‘>’进行实体编码。
从getranklist_members
返回后 source/include/misc/misc_ranklist_index.php:113
进行模板的渲染在 data/template/1_diy_ranklist_ranklist.tpl.php:32
可以看到在tip
属性中输出了$memberlist['0']['note']
。在之前有一个onmouseover
事件,跟入showTip(trhis)
在 static/js/common.js:1062
跟入_showTip
,在 static/js/common_extra.js:912
通过ctrlobj.getAttribute('tip')
获取tip属性的值,由于getAttribute
获取的内容会自动反转义,即前面在dhtmlspecialchars
编码过的内容又被解码了一次。此后拼接到div标签的innerHTML
中,最后输出到页面上造成了xss
关于getAttribute
,可以用下面代码测试:
漏洞复现
该CMS中,排行榜功能是默认开启的。在地址 http://127.0.0.1/misc.php?mod=ranklist&type=member 的上榜宣言中输入payload(拒绝伸手党)
在 http://127.0.0.1/misc.php?mod=ranklist 当鼠标移动到头像上触发onmouseover
事件,执行xss
修复方案
多增加一次dhtmlspecialchars
。