关于这个自解码机制,我们直接以一个例子(样例0)来进行说明:
<input type="button" id="exec_btn" value="exec" onclick="document.write ('<img src=@ onerror=alert(123) />')" />
我们假设document.write里的值是用户可控的输入,点击后,document.write出现一段img HTML,onerror里的JavaScript会执行。此时陷阱来了,我们现在提供一段HtmlEncode函数如下(样例A):
<script>
function HtmlEncode(str) {
var s = "";
if (str.length == 0) return "";
s = str.replace(/&/g, "&");
s = s.replace(/</g, "<");
s = s.replace(/>/g, ">");
s = s.replace(/\"/g, """);
return s;
}
</script>
<input type="button" id="exec_btn" value="exec" onclick="document.write (HtmlEncode('<img src=@ onerror=alert(123) />'))" />
我们知道HtmlEncode('<img src=@ onerror=alert(123) />')后的结果是:
<img src=@ onerror=alert(123) />
这个样例A点击后会执行alert(123)吗?下面这个呢(样例B)?
<input type="button" id="exec_btn" value="exec" onclick="document.write ('<img src=@ onerror=alert(123) />')" />
在样例A和样例B中,document.write的值似乎是一样的?实际结果是样例A点击不会执行alert(123),而是在页面上完整地输 出<img src=@ onerror=alert(123) />,而样例B点击后会执行alert(123)。
我们要告诉大家的是,点击样例B时,document.write的值实际上不再是:
<img src=@ onerror=alert(123) />
而是:
<img src=@ onerror=alert(123) />
我们可以这样论证:
<input type="button" id="exec_btn" value="exec" onclick="x='<img src=@ onerror=alert(123) />';alert(x);document.write(x)" />
看弹出的x值就知道了,如图6-1所示。
出现这个结果的原因如下:
onclick里的这段JavaScript出现在HTML标签内,意味着这里的JavaScript可以进行HTML形式的编码,这种编码有以下两种。
进制编码:&#xH;(十六进制格式)、&#D;(十进制格式),最后的分号(;)可以不要。
HTML实体编码:即上面的那个HtmlEncode。
在JavaScript执行之前,HTML形式的编码会自动解码。所以样例0与样例B的意义是一样的,而样例A就不一样了。下面我们继续完善这些例子。
上面的用户输入是出现在HTML里的情况,如果用户输入出现在<script>里的JavaScript中,情况会怎样,代码如下:
<input type="button" id="exec_btn" value="exec" />
<script>
function $(id){return document.getElementById(id);};
$('exec_btn').onclick = function(){
document.write('<img src=@ onerror=alert(123)/>');
//document.write('<img src=@ onerror=alert(123) />');
};
</script>
这样是可以执行alert(123)的,如果用户输入的是下面的内容:
<img src=@ onerror=alert(123) />
结果与样例B一样:这段HTML编码的内容在JavaScript执行之前自动解码吗?答案是不会,原因是用户输入的这段内容上下文环境是 JavaScript,不是HTML(可以认为<script>标签里的内容和HTML环境毫无关系),此时用户输入的这段内容要遵守的是 JavaScript法则,即JavaScript编码,具体有如下几种形式。
Unicode形式:\uH(十六进制)。
普通十六进制:\xH。
纯转义:\'、\"、\<、\>这样在特殊字符之前加\进行转义。
比如,用户输入被转义成如下形式:
\<img src\=@ onerror=alert\(123\) \/\>
这样的防御毫无意义,在JavaScript执行之前,这样的转义会自动去转义,alert(123)照样执行。同样,下面这样的JavaScript编码也毫无意义:
<img src=@ onerror=alert(123) />
-->
\u003c\u0069\u006d\u0067\u0020\u0073\u0072\u0063\u003d\u0040\u0020\u006f\u006e\u0065\u0072\u0072\u006f\u0072\u003d\u0061\u006c\u0065\u0072\u0074\u0028\u0031\u0032\u0033\u0029\u0020\u002f\u003e
\x3c\x69\x6d\x67\x20\x73\x72\x63\x3d\x40\x20\x6f\x6e\x65\x72\x72\x6f\x72\x3d\x61\x6c\x65\x72\x74\x28\x31\x32\x33\x29\x20\x2f\x3e
在JavaScript执行之前,这样的编码会自动解码。
通过这几个样例,我们可以知道在HTML中与在JavaScript中自动解码的差异。如果防御没区分这样的场景,就会出问题
具备HtmlEncode功能的标签
上面这些例子中的信息量很大,是理解透DOM XSS的基础,下面我们进一步看看不同标签之间存在的一些差异,看下面这段代码:
<script>function $(id){return document.getElementById(id);};</script>
<input type="button" id="exec_btn" value="exec" onclick="$('i1'). innerHTML='<img src=@ onerror=alert(123) />';alert($('i1').innerHTML);" />
<input type="button" id="exec2_btn" value="exec2" onclick="$('i2'). innerHTML='<img src=@ onerror=alert(123) />';alert($('i2').innerHTML);" />
<textarea id="i1" style="width:600px;height:300px;"></textarea>
<div id="i2"></div>
点击exec_btn和点击exec2_btn的效果一样吗?如图6-2所示。
左图是点击exec_btn的效果,右图是点击exec2_btn的效果,前者进行了HtmlEncode编码。这是由<textarea>标签本身的性质决定的,HTML 在<textarea>中是不解析的。同理可推,这样的标签还有:
<title></title>
<iframe></iframe>
<noscript></noscript>
<noframes></noframes>
这些标签在本章开头部分曾提到过,不过少了以下两个:
<xmp></xmp>
<plaintext></plaintext>
<xmp>没有HtmlEncode功能,<plaintext>在Firefox与Chrome下有差异,Firefox下不会进行HtmlEncode编码,而在Chrome下会,这样的差异有时候会导致安全问题。
注:
上面这个样例不用在IE下测试,因为IE有解析差异,会导致代码不执行。
2009年,我们发现WebKit内核的浏览器有一个安全差异,这个漏洞简述为:
获取textarea标签的innerHTML内容时,内容没有被编码,导致安全隐患产生。
...
如曾经的QQ滔滔做HtmlEncode采取了如下方式:
< script >
function HTMLEncode(s) {
var html = "";
var safeNode = document.createElement("TEXTAREA");
if (safeNode) {
safeNode.innerText = s;
html = safeNode.innerHTML;
safeNode = null;
}
return html;
}
var tmp = '<iframe src=http://baidu.com>';
alert(HTMLEncode(tmp));
</script>
因为textarea在HTML中的权重很高,允许html标签出现在<textarea></textarea >之间,所以这种做法本没有任何问题,但因为WebKit存在此缺陷,导致在Maxthon 3.0极速模式、Chrome和Safari的所有版本中,本应该是绝对安全的代码变成了恶意代码,并可以随意执行XSS语句。
这种差异导致这个网站在WebKit内核的浏览器下出现了DOM XSS漏洞。
相关推荐
在这篇文章中,我们将深入探讨JavaScript中的编码与解码机制,并结合标签“源码”和“工具”来理解其在实际开发中的应用。 首先,我们需要了解基本的字符编码概念。Unicode是国际上广泛采用的字符集,它包含了世界...
4. 浏览器的硬件加速解码机制会自动处理H264的解码工作,然后在Video标签上显示解码后的视频帧。 参考博客链接提到的文章可能会详细介绍如何实现这个过程,包括JavaScript代码示例,以及如何处理WebSocket的数据...
JavaScript是一种广泛用于网页和网络应用的脚本语言,与HTML5结合,可以创建富互联网应用(RIA)。在这个FC NES模拟器中,JavaScript负责解析和执行NES游戏的ROM数据,模拟CPU指令,处理输入,渲染图形,以及播放...
3. **事件处理**:掌握JavaScript事件处理机制,如监听用户行为,响应点击、滚动等事件,这对于实现用户交互功能非常关键。 4. **AJAX和Fetch API**:使用这些异步通信技术可以实现与服务器的无刷新通信,这对于...
浏览器中的HTML自动解码机制能够识别并自动将十六进制编码转换为对应的字符。例如,如果在网页中输入 "\x48\x65\x6c\x6c\x6f",它会被自动转换为 "Hello"。 四、JavaScript编码函数 JavaScript提供了多组编码与解码...
在本案例中,我们关注的是一个专门针对猫眼网反爬虫机制的Python Web爬虫项目,名为"woffxml解码猫眼网反爬虫机制的爬虫"。猫眼网作为一个流行的电影票务平台,为了保护自身数据安全,实施了各种反爬虫策略,这使得...
Swift与JavaScript之间的相互调用和传值是实现跨平台交互的关键技术。通过WKWebView组件,开发者能够在iOS应用中无缝集成JavaScript功能,实现动态内容加载、网页交互等功能。同时,通过WKUserContentController和...
在IT行业中,编码和解码是数据处理的重要...同时,了解各种编码和解码机制也是提升开发者解决实际问题能力的关键。因此,熟练掌握`decode`函数及其相关的编码知识,对于任何从事Web开发工作的人员都是必不可少的技能。
其中,Decoder模块是Burp Suite的一个重要组件,专门用于数据的编码与解码,帮助安全研究人员理解并操纵应用程序中的数据流。 Decoder模块在Burp Suite中扮演着至关重要的角色,因为它能够处理和解析HTTP消息中的...
这个方法的思路与编码类似,也是创建一个临时的`div`元素,并将需要解码的字符串赋值给它的`innerHTML`属性,然后通过读取`innerText`或`textContent`属性获取解码后的字符串。同样,在返回之前要清理临时创建的元素...
这个过程既具有挑战性,也能帮助开发者提升对图像编码、二进制数据处理以及JavaScript底层机制的理解。在实践中,可以参考现有的开源库,如“gift”项目,它们通常已经实现了上述步骤,是学习和研究的好资源。
#### 一、事件处理机制与操作 JavaScript中的事件处理是前端开发中不可或缺的一部分,涉及到用户与页面交互的各种场景。本文档覆盖了事件的多种处理方式,包括事件源对象、捕获释放、按键事件、事件返回值、鼠标...
在JavaScript中,Cookie是一种在客户端存储少量数据的机制,它对于网页应用的用户状态管理和临时存储信息具有重要作用。本文将详细讲解如何封装一个Cookie操作类,实现对Cookie的增删改查功能。 首先,理解Cookie的...
在JavaScript编程中,HTML编码(htmlencode)和解码(htmldecode)是非常常见的需求,主要用于在HTML中安全地处理和显示特殊字符。本文将深入探讨一种另类的JavaScript方法来实现这两个功能,避免传统正则表达式替换...
Base64编码是一种将二进制数据转换为可打印ASCII字符的编码方式,常用于在网络上传输非ASCII字符,如图片或PDF等。在前端开发中,Base64编码经常被用于将...这样的机制使得二进制数据可以在网络上高效、安全地传输。
HTML与Excel交互是Web开发中的常见需求,尤其是在数据导入、导出或在线表格编辑的应用场景。本主题聚焦于使用JavaScript插件将Excel文件的内容读取并显示在HTML页面上,甚至实现将这些数据上传到数据库的功能。我们...
1. **验证(Validation)**:ESAPI提供了一套强大的输入验证机制,可以对用户提供的数据进行严格的检查,确保它们符合预期的格式和安全性。这有助于防止注入攻击,如SQL注入和命令注入。 2. **编码(Encoding)**:...
在浏览器解析过程中,XSS攻击利用了HTML、URL和JavaScript解码的特性,将恶意脚本注入到页面中执行。复合编码是XSS攻击中的策略,通过混合使用HTML实体、URL编码和JavaScript转义序列来绕过过滤机制。 总结来说,...
2. **捕获与释放**:`event.srcElement.setCapture()`和`event.srcElement.releaseCapture()`用于控制事件捕获机制,设置捕获后,所有发生在该元素及其子元素上的事件都会被该元素接收,直到释放捕获。 3. **事件...
JavaScript提供了JSON对象来进行JSON数据的编解码。 10. **错误处理**:JavaScript通过try...catch语句捕获和处理运行时错误,Error对象及其子类提供错误信息。 11. **DOM遍历与选择**:包括getElementById、...