深入理解JavaScript Hijacking原理javascript

最近在整理关于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的攻击代码:

在用户访问恶意网站时:

(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脚本:

它的作用就是发送受害者的私隐信息到恶意站点的。

这里可能有人不理解,我大概说一下:

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


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值