php抓取网页数据插入数据库( (JSONwithPadding)是什么是JSONP?(组图))

优采云 发布时间: 2021-12-27 12:13

  php抓取网页数据插入数据库(

(JSONwithPadding)是什么是JSONP?(组图))

  

  翻译:shan66

  预计稿费:200RMB

  投稿方式:发送邮件至linwei#,或登录网页版在线投稿

  JSONP 注入是一个鲜为人知但很常见且危险的漏洞。JSONP随着近年来JSON和Web API的迅速兴起以及跨域通信的迫切需求而应运而生。

  什么是 JSONP?

  这里假设大家已经知道JSON,那么我们直接讨论JSONP。JSONP(JSON with Padding)是JSON的一种“使用方式”,可以用来解决主流浏览器的跨域数据访问问题。

  让我们举个例子。我们的网上银行应用程序实现了一个 API 调用,可用于返回当前用户的交易数据。

  这样,通过向端点发送 HTTP 请求,我们就可以得到 JSON 格式的交易数据:

  

  如果我们的报表应用()想要获取交易的详细信息,由于同源策略(主机不同),无法通过AJAX调用该页面。

  

  为了解决这个问题,JSONP应运而生。由于跨域脚本(主要用于加载 JavaScript 库,如 jQuery、AngularJS 等)是允许的,但不推荐,我们可以通过在响应中预先填充回调函数来解决这个问题。

  应该注意的是,当跨域收录

脚本时,脚本将在收录

应用程序的上下文中运行,而不是在脚本的源上下文中运行。

  通过在 API 响应中添加回调函数并将数据封装为 JSON 格式,它允许我们在脚本标签之间加载 API 响应,并允许我们通过定义我们自己的回调函数来处理其内容。

  开发

  下面列出了一些最常见的场景:

  回调函数被硬编码到响应中

  基本函数调用

  对象方法调用

  回调函数是动态的

  可以通过 URL(GET 变量)实现完全控制

  可以通过URL(GET变量)实现部分控制,但需要附加一个数字

  URL(GET变量)是可以控制的,但是最初是不显示在请求中的

  基本函数调用

  一个非常常见的例子是将回调函数 myCallback 硬编码到 JSON 格式的响应数据中:

  

  我们首先需要定义 myCallback 函数,然后在脚本标签中引用 API 调用来轻松利用这一点:

  

  注意:这个函数必须在收录

响应之前定义,否则会调用未定义的函数,无法获取数据。

  当登录的受害者访问我们的恶意页面时,我们可以获得他的数据。为简洁起见,我们将数据显示在当前页面中。

  

  对象方法调用

  这与第一个示例几乎完全相同,您可能会在 ASP 或 ASP.NET Web 应用程序中遇到它。在我们的示例中,System.TransactionData.Fetch 作为回调函数添加到 JSON 格式的数据中:

  

  我们只需要为 TransactionData 对象创建一个 Fetch 方法,它是 System 对象的一部分。

  

  由于结果相同,我们以后不再提供相关截图。

  通过 URL 完全控制(GET 变量)

  这是最常见的情况:回调函数在 URL 中指定,我们可以完全控制它。通过URL中的回调参数,我们可以修改回调函数的名称,所以我们将其设置为testing并在响应中检查其变化:

  

  我们基本上可以使用与之前相同的漏洞利用代码,但在使用脚本标签收录

响应时不要忘记添加参数回调。

  

  通过URL(GET变量)实现部分控制,但需要附加一个数字

  在这种情况下,回调函数名称需要附加一些东西,通常是一个数字。在大多数情况下,我们得到的结果类似于附加一个短数字(例如 jQuery 带有 12345),回调函数名称将变为 jQuery12345。

  

  从逻辑上讲,漏洞利用代码保持不变,我们只需要在回调函数的名称中添加 12345 而不是在收录

脚本时添加它。

  

  但是如果数字不是硬编码的呢?如果每个会话的数字是动态的并且不同,该怎么办?如果它是一个相对较短的数字,我们可以以编程方式预定义每个可能的函数。我们假设附加号码的最大数量是 99.999。我们可以通过编程方式创建所有这些函数,因为我们已经知道回调函数的名称,所以只需附加相应的数字即可。下面给出一个示例代码,这里使用一个更简单的回调函数来演示结果:

  

  代码简单介绍:我们硬编码了一个叫jQuery的回调函数,我们设置了函数数量的上限。在第一个循环中,我们在 callbackNames 数组中生成回调函数名称。然后我们循环遍历数组并将每个回调函数名称转换为全局函数。请注意,为了减少代码,我只提醒在第一笔交易中发送的金额。让我们看看它是如何工作的:

  

  在我的机器上,显示alert大约需要5秒,回调函数名称为jQuery12345。这意味着Chrome在5秒内创建了超过10.000个函数,所以我可以大胆地说,这是一个非常可行的利用方法。

  可以控制URL(GET变量),但最初不会显示在请求中

  最后一个场景涉及 API 调用,由于它不使用回调函数,因此没有可见的 JSONP。当开发者留下了与其他软件的“隐式”向后兼容性,或者在重构时没有删除相关代码时,可能会出现这种情况。因此,当你看到一个没有回调函数的API调用,尤其是括号内已经放入了JSON格式的数据时,你可以手动将回调函数添加到请求中。

  如果我们有一个 API 调用,我们可以尝试猜测回调变量:

  尽管这些是最常见的回调函数名称,但您可以继续猜测其他名称。如果在响应中加入我们的回调函数的名称,我们自然可以得到一些数据。

  简单的数据采集技术

  到目前为止,我们只是展示了数据,现在我们将介绍如何将数据发送回来。这是 JSONP 数据抓取的最简单示例,您可以将其用于概念验证。

  

  我们使用数据参数中的应用程序响应(事务数据)向我们的数据采集

器发出 GET 请求。

  注意:确保对数据使用 JSON.stringify(),因为它是一个对象,我们不想在我们的文件中只有 [object Object]。

  注意:如果响应很大,请务必切换到 POST,因为由于 HTTP GET 大小限制,您可能无法接收完整的数据。

  这是我们的grabData.php代码,我们将接收到的数据附加到data.txt文件中:

  

  常见问题

  在寻找具有 JSONP 漏洞的 Web 应用程序时,我们可能会遇到一些问题。在这里,我们将介绍解决这些问题的方法。

  Content-Type 和 X-Content-Type-Options

  如果 API 请求的响应头中 X-Content-Type-Options 设置为 nosniff,则 Content-Type 必须设置为 JavaScript(text/javascript、application/javascript、text/ecmascript 等)。这是因为通过在响应中收录

回调函数,响应不再是 JSON,而是 JavaScript。

  如果您想知道您的浏览器将哪些内容类型解释为 JavaScript,请导航到。

  在本例中,Content-Type 设置为 application/json,X-Content-Type-Options 设置为 nosniff。

  

  最新版本的 Google Chrome、Microsoft Edge 和 Internet Explorer 11 可以成功阻止脚本执行。但是,Firefox 50.1.0(目前最新版本)没有这样做。

  注意:如果未设置 X-Content-Type-Options: nosniff 标头,它将适用于上述所有浏览器。

  注意:较旧的浏览器没有执行严格的 MIME 类型检查,因为 X-Content-Type-Options 是最近才实现的。

  

  响应码

  有时我们可能会得到一些非200的响应码。我在以​​下浏览器上进行了相关测试:

  Microsoft Edge 38.14393.0.0

  Internet Explorer 11.0.38

  谷歌浏览器 55.0.2883.87

  Mozilla Firefox 50.1.0

  测试结果总结如下:

  123456

  响应码相关浏览器 100 继续 Internet Explorer, Microsoft Edge, Google Chrome101 Switching Protocols Google Chrome301 Moved Permanently Google Chrome302 Found Google Chrome304 Not Modified Microsoft Edge

  因此,即使我们没有得到 200 HTTP 代码,该漏洞仍然可以在其他浏览器中使用。

  绕过推荐人检查

  1.使用数据URI方案

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线