Webkit内核浏览器解析Textarea innerHTML问题

作者:Xeye Team

这个简述为:获取Textarea标签的innerHTML内容时,内容没有被编码,导致安全隐患产生。  []

为了分析问题我们直接来看webkit的webcore代码吧,通过看Textarea的赋值以及innerHTML方法的绑定来定位问题 —— 因为这两个地方的任意一个地方做处理都会避免问题的发生。

Textarea的赋值实现:html/HTMLTextAreaElement.cpp

WWW.



注意这个过程中除了:  "华西黑客联盟"

normalizedValue.replace("rn", "n");//这个处理虽然简单,但是比较人性化
normalizedValue.replace('r', 'n');

处理之外,并没有进行htmlenocde等格式化,不过这不是问题所在。  [内容来自"华西黑客联盟"]

再来看innerHTML的取值实现:html/HTMLElement.cpp

HTMLElement类产生方法innerHTML:

String HTMLElement::innerHTML() const
{
return createMarkup(this, ChildrenOnly);
}
此调用过程为: 内容来自"华西黑客联盟"

(html/HTMLElement)innerHTML ---> (editing/markup)createMarkup ---> appendMarkup ---> takeResult ---> return m_result

这个方法是所有elements通用方法,因此并不需要htmlencode,这也不是问题。 内容来自"华西黑客联盟"

textarea的innerHTML方法实例化:html/HTMLElement.cpp

[内容来自"华西黑客联盟"]

首先增加标签到tagList:  [内容来自"华西黑客联盟"]



然后添加innerHTML等方法: 内容来自"华西黑客联盟"



这样textarea就具有了innerHTML方法。 www.

因为Textarea的innerHTML是应该被htmlencode的,无论是trident(IE)内核、gecko(FF)内核、presto(OP)内核都证明了这一点,所以此处是一个安全风险点。  []

测试代码如下:

<textarea id='txt'><img src='#'></textarea>
<input value='click' οnclick='doit()' type='button'>

<script>
function doit(){
var t = document.getElementById("txt");
alert('value:'+t.value+'ninnerText'+t.innerText+'ninnerHTML'+t.innerHTML);
}
</script>

所以一些站点如果信任了Textarea的innerHTML返回结果,将会带来很明显的跨站安全隐患或者是挂马隐患。

譬如某大网站做htmlencode采取了如下方式:

<script>
function HTMLEncode(s) {
var html = "";
var safeNode = document.createElement("TEXTAREA");
if (safeNode) {
safeNode.innerText = s;
html = safeNode.innerHTML;
safeNode = null;
}
return html;
}

www.

var tmp = '<iframe src=http://baidu.com>';
alert(HTMLEncode(tmp));
</script>

[]



因为Textarea在html中的权重很高,允许Html标签出现在<textarea></textarea>之间,所以这种做法本没有任何问题,但因为webkit存在此缺陷,导致在Maxthon3.0极速模式、Chrome和Safari所有版本中,本来应该是绝对安全的代码变成了恶意代码并可以随意执行XSS语句。

这也警告一些程序员不要过分追求花哨的语句,还是老老实实地做replace稳妥。这类安全风险是由于不同的浏览器内核对dom的处理不同而造成的,在dom层面上,要警惕这类问题(eg: dom xss)的出现。

感谢byttee爆料!

monyer

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值