之前提交到某平台的漏洞,现在已经修复
漏洞证明
- 漏洞需要开启后台四方格功能
- 发表新帖子,在帖子标题中设置为payload
<img src=1 onerror=alert(1)>
- 然后在首页鼠标放在帖子准备点击我们刚才的发表的帖子时,触发onmouseover事件,执行我们的代码。
漏洞分析
鼠标放在帖子上准备点击时,触发onmouseover事件。onmouseover事件中调用的showTip函数最终调用到了_showTip函数
_showTip函数中使用getAtrribute取了tip属性值,然后又放入innerHTML。
重点是getAtrribute函数获取属性值时会自动解码实体编码后的值,这样<img src=1 onerror=alert(1)>
就变成<img src=1 onerror=alert(1)>
。
另外此漏洞中的payload只能用<img src=1 onerror=alert(1)>
而不能用<img src=1 onerror=alert(1)>
这是由于Discuz中dhtmlspecialchars函数实现问题。
1 | function dhtmlspecialchars($string, $flags = null) { |
这个差异可以这么解释
1 | htmlspecialchars(htmlspecialchars("<")); 值是"&amp;#x003c;" |
而上面tip属性值就是两次dhtmlspecialchars了标题的值,输入存到数据库一次,输出时一次。
1 | tip=dhtmlspecialchars(dhtmlspecialchars(标题)); |
漏洞总结
- dhtmlspecialchars函数和实际的htmlspecialchars函数有差异
- getAttribute函数会将属性值解码