漏洞分享Discuz存储型xss
Posted 安钛信安
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了漏洞分享Discuz存储型xss相关的知识,希望对你有一定的参考价值。
漏洞证明
1.漏洞需要开启后台四方格功能
2.发表新帖子,在帖子标题中设置为payload
1 |
<img src=1 onerror=alert(1)> |
3.然后在首页鼠标放在帖子准备点击我们刚才的发表的帖子时,触发onmouseover事件,执行我们的代码。
漏洞分析
鼠标放在帖子上准备点击时,触发onmouseover事件。onmouseover事件中调用的showTip函数最终调用到了_showTip函数
_showTip函数中使用getAtrribute取了tip属性值,然后又放入innerhtml。
重点是getAtrribute函数获取属性值时会自动解码实体编码后的值,这样
1 |
<img src=1 onerror=alert(1)> |
就变成
1 |
<img src=1 onerror=alert(1)> |
另外此漏洞中的payload只能用
1 |
<img src=1 onerror=alert(1)> |
而不能用
1 |
<img src=1 onerror=alert(1)> |
这是由于Discuz中dhtmlspecialchars函数实现问题。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
function dhtmlspecialchars($string, $flags = null) { if(is_array($string)) { foreach($string as $key => $val) { $string[$key] = dhtmlspecialchars($val, $flags); } } else { if($flags === null) { $string = str_replace(array('&', '"', '<', '>'), array('&', '"', '<', '>'), $string); if(strpos($string, '&#') !== false) { $string = preg_replace('/&((#(\d{3,5}|x[a-fA-F0-9]{4}));)/', '&\\1', $string); } //在这一行又将 & 解码成 &,导致htmlspecailchars和php中的htmlspecailchars函数差异 } else { if(PHP_VERSION < '5.4.0') { $string = htmlspecialchars($string, $flags); } else { if(strtolower(CHARSET) == 'utf-8') { $charset = 'UTF-8'; } else { $charset = 'ISO-8859-1'; } $string = htmlspecialchars($string, $flags, $charset); } } } return $string; } |
这个差异可以这么解释
1 2 |
htmlspecialchars(htmlspecialchars("<")); 值是"&amp;#x003c;" dhtmlspecialchars(dhtmlspecialchars("<")); 值是"<" |
而上面tip属性值就是两次dhtmlspecialchars了标题的值,输入存到数据库一次,输出时一次。
1 |
tip=dhtmlspecialchars(dhtmlspecialchars(标题)); |
漏洞总结
1.dhtmlspecialchars函数和实际的htmlspecialchars函数有差异
2.getAttribute函数会将属性值解码
*来自 91Ri
*如有侵权,请联系我们删除
653994643
sectimes
以上是关于漏洞分享Discuz存储型xss的主要内容,如果未能解决你的问题,请参考以下文章