【问题标题】:Preventing JSON domain spoofing防止 JSON 域欺骗
【发布时间】:2017-01-08 16:12:18
【问题描述】:

这是场景。客户已经有一个电子商务网站,他们正在其中收集送货地址信息和信用卡数据。但是,他们注册了一项 SaaS 服务,使他们能够轻松更改他们的信用卡表格同时收集全名和电子邮件(不是信用卡信息)到营销系统中用于其他目的。因此,他们从 SaaS 服务将 jQuery sn-p 粘贴到他们的页面中,并在他们的表单和表单字段标签中添加一些“数据”属性,以便 SaaS 服务知道要拦截什么以及将数据发布到哪个 SaaS 帐户的位置.

好的,但随后出现安​​全问题。假设我们在那个 SaaS 系统中有两个不同的客户。一个叫 Jack,拥有 jack.com,他的帐户 ID 是 100001。另一个是 Nancy、nancy.com 和 100002。Jack 可以将 sn-p 添加到他的表单中并添加一些“data-”属性,但随后搞砸了,将其中一个数据属性中的帐户 ID 设置为 100002 而不是 100001。这意味着南希会突然在她的帐户中看到杰克的数据。不好!当然,解决方法是在 Jack 的 SaaS 帐户中进行一些设置,以便他只接受来自 jack.com 的数据,而 Nancy 只接受来自 nancy.com 的数据。

但随后发生了潜在的漏洞利用。黑客所要做的就是在他自己的服务器上创建一个欺骗页面,在其中形成类似的 JSON,并通过他工作站上的 /etc/hosts 文件更改,使他看起来像是 jack.com。然后,他可以将成千上万的虚假营销表格信息发送到 Jack 的帐户中,因为 SaaS 服务认为这些信息来自 jack.com。

我可以在 jQuery 代码或 SaaS 服务使用的 PHP 代码中做些什么来确保黑客无法进行这样的欺骗,并且只发送 Jack 的真实客户数据?

已回答的问题

第一季度。 “你如何识别 Jack 和 Nancy?按域?”

A1。 Jack 拥有自己的域名 jack.com。 Nancy 拥有她的域 nancy.com。每个人都使用这种营销 SaaS 服务,但每个人也都选择了他们在注册 SaaS 服务之前已经拥有的电子商务表格。他们在 SaaS 文档中被告知,“只需将 scraper.js 放到您的表单页面中,并将这些数据标签添加到您的表单标签和 html 输入、textarea 和选择标签中,以便 scraper.js 可以暂时拦截这些表单提交,从该表单中收集营销数据(比如说全名和电子邮件),然后让该表单在您已有的工作流程中提交。数据属性将识别要使用的帐户以及营销这些数据应存储在 SaaS 服务中的活动和子活动。”然而,在 scraper.js 的 jQuery 中,它将在 JSON 中传递 location.href 属性,以便它知道使用了哪个域——在这个特定的实例中是 jack.com 或 nancy.com。问题是 - location.href 可以被黑客欺骗,他在他的工作站上为 jack.com 设置了一个 127.0.0.1 的 /etc/hosts 文件条目并运行相同 JSON 代码的副本。

第二季度。 “如果您可以使用从 SaaS.com 到 jack.com 的回调机制会怎样?因此,您的数据属性之一将指定回调函数以从 SaaS.com 接收数据,然后仅在正确时保存数据回应?”

A2。现在这是一个有趣的观点。是的,所以我想在 jack.com 上放置一个额外的 PHP 页面,它会发出“OK”。当 SaaS.com 收到来自 jack.com 的 JSON 数据发布时,它会使用 file_get_contents() 向 jack.com 上的第二个 PHP 回调页面发送请求,以确保它不仅获得 OK 响应,而且还获得 IP 匹配地址和 SSL 证书数据。如果两者不同,则该请求很可能是伪造的黑客请求,并且可以安全记录并拒绝交易。 (我可以轻松地进行 IP 地址验证,但不确定如何在 PHP 中验证相同的两个 SSL 证书,如果允许或可能的话。)当然,IP 地址可以被欺骗。

另一个安全层是第二个 PHP 页面可以使用 SaaS.com 和 jack.com 之间的公钥/私钥交换通信检查,而不是简单地发出“OK”。

第三季度。 “为什么要拦截付款信息并通过 Javascript 发送出去?”

A3。绝对不。从未在此问题中指定发送付款信息。而是说全名和电子邮件之类的东西。是的,为了安全地发送数据,还需要使用 SSL 通信。而且,我们必须使用JSONP to get around the CORS problem

第四季度。 “那不需要 jack.com 将所有内容都保存在数据库中以供验证吗?如果是这样,为什么还要麻烦 SaaS 应用程序?”

A4。没有。一点也不。查看答案 A2。使用该机制,SaaS 应用程序接收数据,但在发生 2 件事之前不信任它:

  1. 它将 jack.com 回调到第二个页面,并确保它返回的响应与最初发送表单数据的 IP 地址具有相同的 IP 地址。

    李>
  2. 它会在第二页中进行公钥/私钥交换检查(除非他们具有服务器访问权限,否则黑客显然无法进行欺骗),以确保没有发生 IP 欺骗。

    李>

Q5。等一下。 A2 和 A4 有问题。初始发送请求的 IP 地址将来自用户的工作站,而不是服务器。因此,您无法以这种方式验证 IP。您必须使用另一种机制来验证是否有人在 jack.com 上填写了表单,并且该表单不是来自欺骗 jack.com 的黑客。

A5。你是绝对正确的。我猜是因为我在另一个项目上稍微分心了。我得再考虑一下。

【问题讨论】:

  • 你如何识别杰克和南希?按域?
  • @cetver 我编辑了问题以反映该答案。
  • 您可以向 SaaS 发送额外的数据属性吗? SaaS 提供回调(用户请求 -> 您的回调 -> 根据回调返回值保存数据)?您可以对 SaaS 中保存的文档执行 CRUD 操作吗?
  • Google Analytics 经常以这种方式受到攻击,将垃圾链接放入您的推荐跟踪中。我不确定你能做些什么。用户可以访问欺骗内容所需的所有代码。
  • 如果您在谈论使用 javascript 集成,请求的 IP 地址将始终来自最终用户,而不是某个 PHP 服务器。

标签: php jquery security hash public-key


【解决方案1】:

TL;DR:如果您使用的是纯粹的客户端集成(只是 javascript),则无法完全保护请求。

意外/故意向错误的客户端发送数据

您可以通过使用非连续、随机的 UUID 作为帐户 ID 来缓解这种情况。例如,如果帐户 ID 看起来像 100001,那么有人可能会尝试使用帐户 ID 100002;但是,如果帐户 ID 看起来像 c3f80e491d44cd91664a0459a0777ed01,那么从统计上来说,某人不太可能向未知帐户发送数据。

故意的垃圾邮件/虚构提交

这是在互联网上存储数据的任何形式的问题;如果没有一些服务器端代码的帮助,我不知道有任何解决方法。

您可以生成一个一次性令牌以包含在 json 有效负载中 - 这可以是通过 HMAC 保护的过时 JWT 令牌,或者使用共享密钥加密的一组消息,然后由SAAS 服务器。

如果您要开始涉及服务器端编程,那么这个额外的协商过程就会变得有点无关紧要 - 只需给电子商务网站一个 API 密钥,然后让他们将客户信息发布到当他们收到订单时。

【讨论】:

  • 啊,那么我们可以告诉开发人员不仅要在他们的页面中添加 jQuery sn-p 并在某些标签上添加一些 data- 属性,而且 jQuery 必须针对我们提供的 PHP 脚本就像jack.com 一样。然后,这将加密数据(公钥/私钥加密)并将其发送到 SaaS.com,或者至少使用公钥/私钥散列进行 SSL HTTP POST,以便 SaaS.com 信任数据并且不黑客来欺骗它(或 MTM)。
  • @Volomike 是什么阻止了某人多次运行 jQuery 调用?
  • 啊,好点子。所以黑客创建了一些 jQuery 来触发对 jack.com 的 PHP 脚本的一堆请求。我想我们必须添加一个系统,该系统在一天或一小时内只允许每个 IP 地址的这么多请求。我们可能还必须在表单中添加一个随机数,我猜这需要另一个 PHP 脚本。
  • @Volomike 是的。然后有人带着僵尸网络出现了。
  • 一种技术可以是频繁地切换他们的 API 密钥,尽管这意味着编辑表单的 HTML 以便您使用新的 API 密钥进行注册。这种让黑客有点沮丧,对洋葱安全来说又是一层。这不是万无一失的,但对黑客来说又是一层挫败感。
猜你喜欢
  • 2017-01-12
  • 2017-05-14
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
  • 2017-11-21
  • 2017-01-19
  • 2012-11-01
  • 1970-01-01
相关资源
最近更新 更多