作者: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