开发安全之:JSON Injection

这篇具有很好参考价值的文章主要介绍了开发安全之:JSON Injection。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Overview

在 XXX.php 的第 X 行中,responsemsg() 方法将未经验证的输入写入 JSON。攻击者可以利用此调用将任意元素或属性注入 JSON 实体。

Details

JSON injection 会在以下情况中出现:

1. 数据从一个不可信赖的数据源进入程序。

2. 将数据写入到 JSON 流。 在这种情况下,由 XXX.php 的第 X 行的 json_decode() 编写 JSON。 应用程序通常使用 JSON 来存储数据或发送消息。用于存储数据时,JSON 通常会像缓存数据那样处理,而且可能会包含敏感信息。用于发送消息时,JSON 通常与 RESTful 服务一起使用,并且可以用于传输敏感信息,例如身份验证凭据。 如果应用程序利用未经验证的输入构造 JSON,则可以更改 JSON 文档和消息的语义。

在相对理想的情况下,攻击者可能会插入无关的元素,导致应用程序在解析 JSON 文档或请求时抛出异常。在更为严重的情况下,例如涉及 JSON Injection,攻击者可能会插入无关的元素,从而允许对 JSON 文档或请求中对业务非常关键的值执行可预见操作。还有一些情况,JSON Injection 可以导致 Cross-Site Scripting 或 Dynamic Code Evaluation。

例 1:以下 PHP 代码将非特权用户(这些用户具有“默认”角色,与之相反,特权用户具有“管理员”角色)的用户帐户身份验证信息从用户控制的 URL 参数 username 和 password 序列化为位于 ~/user_info.json 的 JSON 文件:

$username = $_GET['username']; $password = $_GET['password']; $user_info_json_string = '{"role":"default","username":"' . $username . '","password":"' . $password . '"}';

$user_info_json_file = fopen('~/user_info.json', 'w');

fwrite($user_info_json_file, $user_info_json_string);

fclose($user_info_json_file);文章来源地址https://www.toymoban.com/news/detail-810420.html

但是,由于 JSON 序列化使用字符串串联来执行,将不会对 username 和 password 中的不可信赖数据进行验证以转义与 JSON 相关的特殊字符。这样,用户就可以任意插入 JSON 密钥,可能会更改已序列化的 JSON 的结构。在本例中,如果非特权用户 mallory(密码为 Evil123!)将 %22,%22role%22:%22 附加到其用户名中,并将该值传递到 username URL 参数,则最终保存到 ~/user_info.json 的 JSON 将为: { "role":"default", "username":"mallory", "role":"admin", "password":"Evil123!" } 如果之后使用 PHP 的本地 json_decode() 函数对已序列化的 JSON 文件进行反序列化,如下所示:

$user_info_json_string = file_get_contents('user_info.json', 'r');

$user_info_json_data = json_decode($user_info_json_string);

$user_info_json_data 中 username、password 和 role 的最终值将分别为 mallory、Evil123! 和 admin。在没有进一步验证反序列化 JSON 中的值是否有效的情况下,应用程序会错误地为用户分配 mallory“管理员”特权。

Recommendations

在将用户提供的数据写入 JSON 时,请遵循以下准则:

1.不要使用从用户输入派生的名称创建 JSON 属性。

2. 确保使用安全的序列化函数(能够以单引号或双引号分隔不可信赖的数据,并且避免任何特殊字符)执行对 JSON 的所有序列化操作。

示例 2:以下 PHP 代码实现的功能与Example 1 相同,但会使用 json_encode() 而不是字符串连接来对数据进行序列化,从而确保正确地分隔和转义任何不可信数据:

$username = $_GET['username'];

$password = $_GET['password'];

$user_info_array = array('role' => 'default', 'username' => $username, 'password' => $password);

$user_info_json_string = json_encode($user_info_array);

$user_info_json_file = fopen('~/user_info.json', 'w');

fwrite($user_info_json_file, $user_info_json_string);

fclose($user_info_json_file);

到了这里,关于开发安全之:JSON Injection的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 安全基础 --- JSON + 函数声明

    格式:JSON(JavaScript Object Notation缩写)是一种用于数据交换的文本格式,目的是取代繁琐笨重的 XML 格式。 (1)规定 复合类型的值只能是数组或对象,不能是函数、正则表达式对象、日期对象。 原始类型的值只有四种:字符串、数值(必须以十进制表示)、布尔值和 null (

    2024年02月09日
    浏览(25)
  • webgoat-(A1)injection

    概念 This lesson describes what Structured Query Language (SQL) is and how it can be manipulated to perform tasks that were not the original intent of the developer. 课程目标是描述什么是SQL以及SQL如何执行那些非开发者本意的任务。 目标 The user will have a basic understanding of how SQL works and what it is used for 用户将会理

    2024年02月05日
    浏览(32)
  • Langchain框架 prompt injection注入

    Prompt Injection 是一种攻击技术,黑客或恶意攻击者操纵 AI 模型的输入值,以诱导模型返回非预期的结果 LangChain 是一个基于大语言模型进行应用开发的框架。 所谓大语言模型(Large Language Models, LLMs),是指基于海量语料训练、参数动辄数十亿上百亿的语言模型。除了大家熟知

    2024年02月01日
    浏览(34)
  • 什么是依赖注入(Dependency Injection)?

    依赖注入(Dependency Injection,简称DI)是一种设计模式,用于实现类之间的解耦和依赖关系的管理。它通过将依赖关系的创建和维护责任转移到外部容器中,使得类不需要自己实例化依赖对象,而是由外部容器动态地注入依赖。 传统的对象创建方式往往由类自身负责创建和管

    2024年02月15日
    浏览(30)
  • DVWA-Command Injection

    各种脚本语言都有可以调用系统命令的方法,如PHP语言中的system()、exec()等命令执行函数,可以执行系统命令,命令注入攻击,是指攻击者构造特殊的语句,将系统命令拼接到正常的用户输入,进而传递到命令执行函数的参数中,造成系统命令被执行的攻击方式。 安全漏洞从

    2024年02月08日
    浏览(20)
  • uniapp开发小程序 app.json 文件内容错误 --未找到app.json

    使用uniapp开发小程序时遇到的小坑。 uniapp运行代码出现app.json文件内容错误 在某些或者第一次运行 uniapp 运行微信小程序时,会触发未找到app.json,在项目根目录未找到app.json 报错如图: 解决方法:在project.config.json后面加入一下代码即可

    2024年02月11日
    浏览(33)
  • 深入解析 JWT(JSON Web Tokens):原理、应用场景与安全实践

    JWT(JSON Web Tokens)是一种开放标准(RFC 7519),用于在各方之间安全地传输信息作为 JSON 对象。由于其小巧和自包含的特性,它在 Web 应用程序和服务之间尤其流行用于身份验证和信息交换。JWT 的主要优点和特性包括: 自包含(Self-contained): JWT 本身包含了所有必要的信息。

    2024年02月04日
    浏览(40)
  • 进阶测试知识学习之Fault Injection

    这种方法的基本思想是人为地在系统中引入错误,然后观察系统的反应。这可以帮助测试人员了解系统是否能够恰当地处理错误,并在错误发生时保持正常运行。故障注入可以用来测试各种类型的错误,比如硬件故障、操作系统错误、网络错误,甚至是编程错误。 故障注入可

    2024年02月09日
    浏览(39)
  • Injection of autowired dependencies failed

    问题描述 报错信息 application.yml 问题修复

    2024年03月18日
    浏览(31)
  • Understanding Dependency Injection for angular

    Angular https://angular.io/guide/dependency-injection Denpendency Injection,  or DI, is one of fundamental concepts for angular, DI is writed by angular framework and allows classes with  Angular decorators,  such as Components, directives, Piples and Injectables , to configure dependencies that they need.  Two main roles exists in DI system: dependency

    2024年02月10日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包