术语JSON注入可用于描述两种主要类型的安全性问题:

  • 当服务器不对来自不受信任来源的数据进行清理并直接写入JSON流时,就会发生服务器端JSON注入。
  • 如果不使用JavaScript直接对来自不受信任的JSON来源的数据进行清理和解析,则会发生客户端JSON注入 eval function.

什么是JSON

JSON(JavaScript对象表示法)是一种轻量级的数据交换格式,用于在应用程序之间进行通信。它类似于XML,但更简单,更适合由JavaScript处理。

许多Web应用程序都使用这种格式在它们之间进行通信并序列化/反序列化数据。一些Web应用程序还使用JSON存储重要信息,例如用户数据。 JSON通常用于RESTful API和AJAX应用程序中。

JSON注入攻击的示例

可以在PHP中执行简单的服务器端JSON注入,如下所示:

  1. 服务器将用户数据存储为包含帐户类型的JSON字符串
  2. 用户和密码直接从用户输入中获取,无需清理
  3. JSON字符串是通过简单的串联形成的: $json_string = '{"account":"user","user":"'.$_GET['user'].'","pass":"'.$_GET['pass'].'"}';
  4. 恶意用户会将数据附加到其用户名:  约翰 %22,%22account%22:%22administrator%22
  5. 结果JSON字符串为:{   "account":"user",   "user":" 约翰 ",   "account":"administrator",   "pass":"password" }
  6. When reading the stored string, the JSON parser (json_decode) encounters two account 进入并接受最后一个,授予  约翰  管理员权限。注意,行为 json_decode is not incorrect –  RFC-7159  声明“对象内的名称  应该  be unique” (not  必须 ),为解释打开了大门。

可以按以下方式执行简单的客户端JSON注入:

  1. JSON字符串与上面的示例相同
  2. 服务器从不受信任的来源获取JSON字符串
  3. 客户端使用解析JSON字符串 eval:var result = eval("(" + json_string + ")"); document.getElementById("#account").innerText = result.account; document.getElementById("#user").innerText = result.name; document.getElementById("#pass").innerText = result.pass;
  4. 这 account value is: user"});alert(document.cookie);({"account":"user
  5. eval函数执行 alert.
  6. 解析结果为 跨站点脚本(XSS) attack (document.cookie is disclosed).

JSON注入与JSON劫持

尽管JSON劫持(跨站点脚本包含项– XSSI的子集)也与JSON表示法相关,但这是一种稍微不同的攻击,在某些方面类似于 跨站请求伪造(CSRF)。对于JSON劫持,攻击者旨在拦截从Web服务器发送到Web应用程序的JSON数据。

  1. 攻击者会创建一个恶意网站并嵌入一个 script 标记,以尝试从受攻击的Web应用程序访问JSON数据。
  2. 诱使登录到受攻击的Web应用程序的用户访问恶意网站(通常使用社交工程)。
  3. 自从  原产地政策(SOP) 允许在任何其他网站的上下文中包含并执行来自任何网站的JavaScript,用户可以访问JSON数据。
  4. 恶意网站劫持了JSON数据。

JSON注入预防

与大多数注入漏洞一样,维护Web应用程序安全性和防止JSON注入的关键是清理数据。这适用于服务器端和客户端JSON注入。

为了防止服务器端JSON注入,请先清除所有数据,然后再将其序列化为JSON。例如,如果您使用Java,则清理JSON数据的一个不错的选择是使用 OWASP JSON消毒剂.

这 best method to prevent client-side JSON injections is never to use the eval function to evaluate JSON data. If you use the eval function and the untrusted data contains JavaScript code, that code will be executed. To avoid this, use JSON.parse。您还可以实施内容安全政策, 默认情况下,禁止使用 eval.

来源: //www.acunetix.com/blog/web-security-zone/what-are-json-injections/