搜狐首页 科技 欢乐颂2

手机搜狐

SOHU.COM

JSONP注入解析

前言

JSONP注入是一个不太常见但影响非常广泛且极危险的漏洞,由于最近几年对JSON,webAPIs以及跨域通信的需求增多,不得不引起我们的重视。

什么是JSONP

这里我们假设大家都了解JSON为何物,以此为基础我们来谈谈JSONP。JSONP全名为JSON with Padding,其存在的意义便有绕过诸如同源策略强制执行(AJAX requests)。

举个例子,我们的网上银行应用verysecurebank.ro,实现了以API调用返回当前用户的交易记录。

向verysecurebank.ro/getAccountTransactions发起一个HTTP请求,在客户端上以JSON格式进行呈现:

若我们另一个用于展示交易记录报告的站点reports.verysecurebank.ro需要获取详细的交易记录,由于受同源策略的限制(主机不同),AJAX是无法调用该页面的。

为了解决该问题,于是JSONP就登上了历史舞台。由于跨域脚本包含(Cross-domain inclusion,主要用于外部加载jQuery, AngularJS等Java库)是被允许的,但我们并不推荐这么做,聪明一点的做法便是:预先以一个回调(callback)进行响应。

注意:值得一提的是,当其中包含一个跨域脚本时,它会在包含应用的环境下运行,而非源环境下运行。

向API响应增加一个回调函数,封装JSON格式数据,允许我们在标签中加载该API响应并且能够通过我们自己定义的回调函数获取其内容进行处理。

利用

以下为较为场景的利用场景:

  1. 1.在响应中回调函数被硬编码

  • 2.动态调用回调函数

  • 基础函数调用 如下即为一个常见的例子,myCallback回调函数被硬编码进响应中,混杂在JSON格式数据中:

    我们首先可以通过定义myCallback函数,之后在标签中引用该API来进行简单的利用:

    注意:确保在包括响应之前已定义好该函数,否则就成了调用未定义的函数,无法抓取数据。当已经成功登录的用户访问恶意页面,我们就能抓取到他的数据。为了更简洁,在当前页面中我们仅显示了部分数据。

    精选