一、背景与介绍
JSON 劫持,也称为“JavaScript 对象表示不法劫持”。当应用程序没有适当地防范此类攻击时,此漏洞允许攻击者从受害者的浏览器中窃取敏感数据。 JSON 劫持利用同源策略,这是一种安全措施,可防止网页向与提供网页的域不同的域发出请求。
这是通过查询资料找到关于什么"JSON劫持"的解释.
这个JSON劫持一般发生与JSONP、CSRF跨站伪造请求有点异曲同工之处。我们都知道CSRF攻击,本质还是利用了浏览器针对站点颁发的Cookie,如果客户端浏览器有这个站点的Cookie,那么每次请求这个站点的HTTP请求,都会携带上Cookie.
那么经典的CSRF攻击场景是怎么样的呢?
1、某黑客利用当前比较热门的话题,例如xx视频观看,某某文章爆料,或者具备诱惑的内容,制作了一个调用网址页面,引诱你点他的链接
2、之后,黑客在他的页面内容写了一些恶意JS代码或者html标签,例如淘宝taobao.com大家用得比较多,有一些活动,例如这个GET请求,就是给黑客的账号充钱/充积分. 假设链接地址是https://www.taobao.com/activity?id=101&user_id=100, 101是活动id, user_id=100, 只要你登录了taobao.com,并且访问这个链接,那就代表你给这个user_id=100充钱或者默认赠送你账号上的积分之类的。 (这里只是举例子,taobao也不是吃干饭的,不会这么沙雕)
假设user_id=100正是这个黑客的账号。 那么当你进到黑客网页, 黑客网页有一个img标签或者script标签,指向这个URL地址, 那么你的浏览器会自动访问这个URL, 并且携带了你的淘宝Cookie, OK, 你有可能就被悄无声息的转账或者转积分给黑客了。
画个图大家理解下原理:
二、JSONP劫持
1、劫持场景举例
JSONP劫持也是类似, 黑客站点可以直接通过<script>标签等手段,越过浏览器CORS跨域机制,访问到你站点(还是taobao.com举例)的JSONP接口,传递回调函数callback=p, 最后你的这个JSONP接口返回数据为 p({"name":"xx", "age":"xx", "account": ""}), 回调执行了黑客前端的Javascript p函数,拿到JSONP数据。
假设这个JSONP接口,返回一些敏感信息,如姓名、身份证信息、手机号等等, 那么黑客在自己的网页再将JSONP拿到的数据传输到自己的后台存储分析,那么你的隐私数据是不是就被泄露了。
2、JSON劫持的核心逻辑
上面我们发现JSONP的核心逻辑还是返回的回调数据被浏览器自动执行了。 一旦响应回来,就自动执行了 p({"name":"xx", "age":"xx", "account": ""}) 这个函数, 这个p函数就是黑客的js回调函数。
那么如果要粉碎黑客的阴谋, 我们肯定就是让这个p({"name":"xx", "age":"xx", "account": ""})函数不能如愿的执行。 寻找某种方法,让浏览器不执行这个回调函数
3、JSONP添加while(1);解决
参考资料,发现Google是这么解决这个问题的。在接口响应返回数据的时候,在前面加一句代码while(1);。 最终响应内容是: while(1);p({"name":"xx", "age":"xx", "phone": ""})
一旦响应到浏览器进行js代码解析,发现while(1);有一个死循环,哈哈哈, 那么黑客的js回调函数p({"name":"xx", "age":"xx", "phone": ""})就得不到执行了。 防止了JSONP的劫持问题
三、总结
1、不要点击陌生链接,特别是邮箱收到的、短信收到的等等。 必须看下域名信息是不是正常的,多留个心眼
2、做开发的时候,后端如果有这种JSONP的接口,那么特别小心,通过while(1);的方式可以避免JSON劫持问题。 Golang的Gin框架,可以使用SecureJSON() 输出接口内容,自带while(1);
3、如果能通过POST请求实现的,尽量不要暴露更多这种GET的JSONP请求接口了。