读书频道 > 安全 > Web前端黑客技术揭秘
6.2.1 HTML与JavaScript自解码机制
2013-01-23 11:28:13     我来说两句 
收藏    我要投稿   

本文所属图书 > Web前端黑客技术揭秘

Web 前端的黑客攻防技术是一门非常新颖且有趣的黑客技术,主要包含Web 前端安全的跨站脚本(XSS)、跨站请求伪造(CSRF)、界面操作劫持这三大类,涉及的知识点涵盖信任与信任关系、Cookie安全、Flash 安全、...  立即去当当网订购

关于这个自解码机制,我们直接以一个例子(样例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, "&amp;");
    s = s.replace(/</g, "&lt;");
    s = s.replace(/>/g, "&gt;");
    s = s.replace(/\"/g, "&quot;");
    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) />')后的结果是:
&lt;img src=@ onerror=alert(123) /&gt;

这个样例A点击后会执行alert(123)吗?下面这个呢(样例B)?
<input type="button" id="exec_btn" value="exec" onclick="document.write ('&lt;img src=@ onerror=alert(123) /&gt;')" />

在样例A和样例B中,document.write的值似乎是一样的?实际结果是样例A点击不会执行alert(123),而是在页面上完整地输出<img src=@ onerror=alert(123) />,而样例B点击后会执行alert(123)。

我们要告诉大家的是,点击样例B时,document.write的值实际上不再是:
&lt;img src=@ onerror=alert(123) /&gt;

而是:
<img src=@ onerror=alert(123) />

我们可以这样论证:
<input type="button" id="exec_btn" value="exec" onclick="x='&lt;img src=@ onerror=alert(123) /&gt;';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('&lt;img src=@ onerror=alert(123) /&gt;');
};
</script>

这样是可以执行alert(123)的,如果用户输入的是下面的内容:
&lt;img src=@ onerror=alert(123) /&gt;

结果与样例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中自动解码的差异。如果防御没区分这样的场景,就会出问题。

点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:6.2 神奇的DOM渲染
下一篇:6.2.2 具备HtmlEncode功能的标签
相关文章
图文推荐
2.9.3 静态可信根与
2.8 远程管理
2.7.6 微内核中的安
2.7.3 直通技术
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站