JSON 劫持是指利用网页浏览器的跨域策略来窃取来自 JSON 响应中的敏感数据的一种安全漏洞。JSON,全称为 JavaScript 对象表示法,是一种轻量级的数据交换格式,广泛用于 web 应用中的客户端和服务器之间的通信。
JSON 劫持通过以下步骤实现:
从其他域获取数据:当一个 web 应用使用 JavaScript 从其他域获取数据时,通常会向一个 API 端点发送请求,该端点以 JSON 数据作为响应。
跨域请求:为了防御跨站请求伪造 (CSRF) 攻击,许多 web 应用允许 JSON 数据的跨域请求。
操控浏览器:攻击者通过诱使受害者的浏览器向目标域发送包含受害者身份验证凭据(如 cookie)的请求,来利用这种跨域策略。
拦截和数据访问:攻击者的服务器拦截请求并获取 JSON 数据,而这些数据通常包含敏感信息。
为降低 JSON 劫持的风险,您可以遵循以下预防提示:
在服务器上实现跨域资源共享 (CORS):CORS 允许您指定哪些域可以访问 JSON 数据。通过正确配置 CORS,您可以限制访问仅限于受信任和被授权的域。
避免在 JSON 响应中包含敏感数据:确保诸如身份验证令牌或个人身份信息 (PII) 等敏感信息不包含在 JSON 响应中。将敏感数据与 JSON 数据分开,能降低被攻击者访问的风险。
使用加密和标记化保护敏感数据:在通过 JSON 响应传输敏感数据之前对其进行加密,为其添加一层保护。标记化也可用于用标记替换敏感数据,从而进一步降低数据曝光的风险。
避免使用 document.write
方法处理 JSON 响应:document.write
方法可能引入安全漏洞,因为它允许攻击者将恶意内容注入页面中。相反,请考虑使用更安全的方法在您的 web 应用中动态呈现 JSON 数据。
2007 年,Twitter 的网站发现了一个 JSON 劫持漏洞。该漏洞允许攻击者通过操控来自服务器的 JSON 响应窃取用户的私信。
该攻击涉及诱使受害者访问一个精心设计的网页,该网页向 Twitter 的 API 发出跨域 JSON 请求。当收到响应时,攻击者的 JavaScript 代码即可访问 JSON 数据,包括用户的私信。
Twitter 迅速通过实施对策解决了这一漏洞,例如使用 while(1);
前缀来防止 JSON 劫持攻击。
带填充的 JSON (JSONP) 是一种基于 JSON 的通信的替代方法,但易受 JSON 劫持攻击。
JSONP 允许包含从其他域提供的外部 JavaScript 文件。攻击者可以利用这种机制将恶意代码注入 JSONP 响应中,可能会损害用户浏览器和数据的安全性。
为了降低与 JSONP 相关的风险,必须在服务器端验证和清理 JSONP 响应,并确保只有受信任的来源才被允许提供 JSONP 回调。
JSON 劫持主要是一个客户端安全问题,需多个漏洞结合才能成功实施。近年来,浏览器安全的改进,如 SameSite cookie 和更严格的 CORS 策略,使这类攻击更具挑战性。
值得注意的是,“JSON 劫持”这个术语在安全社区中并不常用,而是通常被称为“JSONP 劫持”或“跨域 JSON 劫持”。
有些人认为防范 JSON 劫持的责任不应完全落在 web 应用开发者身上。网页浏览器和网页标准也应在执行更严格的安全措施以缓解此类漏洞中发挥作用。
跨站脚本攻击 (XSS):一种在其他用户查看的网页中注入恶意脚本的攻击类型。
跨域资源共享 (CORS):一种允许从另一个域请求资源的机制。
跨站请求伪造 (CSRF):一种迫使终端用户在已认证的 web 应用上执行不需要的操作的攻击。