聚焦源代码安全,网罗国内外最新资讯!

*声明:《缺陷周话》栏目系列文章由奇安信代码卫士团队原创出品。未经许可,禁止转载。转载请注明“转自奇安信代码卫士 www.codesafe.cn”。

代码审计是使用静态分析发现源代码中安全缺陷的方法,辅助开发或测试人员在软件上线前较为全面地了解安全问题,防患于未然,因此一直以来都是学术界和产业界研究的热点,并已成为安全开发生命周期 SDL 和 DevSecOps 等保障体系的重要技术手段。

奇安信代码卫士团队基于自主研发的国内首款源代码安全检测商用工具,以及十余年漏洞技术研究的积累,推出“缺陷周话”系列栏目。每周针对 CWE、OWASP 等标准中的一类缺陷,结合实例和工具使用进行详细介绍,旨在为广大开发和安全人员提供代码审计的基础性标准化教程。

缺陷周话 • 第40期

JSON 注入         

1、JSON 注入

JSON注入是指应用程序所解析的JSON数据来源于不可信赖的数据源,程序没有对这些不可信赖的数据进行验证、过滤,如果应用程序使用未经验证的输入构造 JSON,则可以更改 JSON 数据的语义。在相对理想的情况下,攻击者可能会插入无关的元素,导致应用程序在解析 JSON数据时抛出异常。本文以JAVA语言源代码为例,分析“JSON注入”漏洞产生的原因以及修复方法。该漏洞的详细介绍请参见 CWE ID 91: XML Injection (aka Blind XPath Injection) (http://cwe.mitre.org/data/definitions/91.html)。

2、JSON 注入的危害

攻击者可以利用JSON注入漏洞在JSON数据中插入元素,从而允许JSON数据对业务非常关键的值执行恶意操作,严重的可能导致XSS和动态解析代码。

从2018年1月至2019年6月,CVE中共有18条漏洞信息与其相关。部分漏洞如下:

CVE 编号 概述
CVE-2018-7951 由于输入验证不充分,某些华为服务器的iBMC(智能基板管理控制器)存在JSON注入漏洞。经过身份验证的远程攻击者可以启动JSON注入来修改管理员的密码。成功利用可能允许攻击者获得系统的管理权限。
CVE-2018-7904 带有V100R005C00软件的华为1288H V5和288H V5存在JSON注入漏洞。经过身份验证的远程攻击者可以使用JSON注入来修改管理员的密码。由于对输入的验证不充分,可以利用它来获得系统的管理权限。

3、示例代码

示例源于 WebGoat-8.0.0.M25  (https://www.owasp.org/index.php/Category:OWASP_WebGoat_Project),源文件名:CSRFFeedback.java。

3.1 缺陷代码

上述示例代码是接收请求参数 feedback 中的 JSON 数据,并将 JSON 数据转换为对象。第35行,声明一个 ObjectMapper 类的实例 objectMapper 用于处理 JSON 数据。第40行在方法 completed 中声明了要获取的参数 feedback,在第42行将请求参数 feedback 的字节数组值和 Map.class 作为参数传入实例 feedbackreadValue() 方法,用于将 JSON 数据转换为 Map 集合类的对象。

由于 JSON 是根据引号、冒号、逗号和花括号区分各字符意义的,当JSON格式为{"username":"admin","password":"adminpassword"}时,程序可正确解析该 JSON 数据。数据为{"username":"admin","password":"admin"password"}时,其中 admin"password 中的引号会破坏整个JSON的结构,导致 JSON 解析失败,无法转换为指定对象。

使用代码卫士对上述示例代码进行检测,可以检出“JSON注入”缺陷,显示等级为高。从跟踪路径中可以分析出数据的污染源以及数据流向,在代码行第42行报出缺陷。如图1所示:

图1:JSON 注入检测示例

3.2 修复代码

在上述修复代码中,使用 com.fasterxml.jackson.core.io 包下的JsonStringEncoder 类来对 JSON 数据进行操作,在第43行获取 JsonStringEncoder 的对象 encoder,调用 quoteAsUTF8 方法将 feedback中的数据按照 JSON 标准处理并编码为 UTF-8,将结果返回为字节数组。将转换后的字节数组作为参数与 Map.class 传入 readValue 方法。使用 JSON 标准对 JSON 数据进行处理,防止 JSON 注入。

使用代码卫士对修复后的代码进行检测,可以看到已不存在“JSON注入”缺陷。如图2所示:

图2:修复后检测结果

4、如何避免 JSON 注入

检查程序逻辑,根据实际需求对数据进行合理过滤和安全校验,以避免产生JSON注入。

推荐阅读

【缺陷周话】第 39期:解引用未初始化的指针

【缺陷周话】第 38期——不安全的反序列化:XStream

【缺陷周话】第 37期:未初始化值用于赋值操作

【缺陷周话】第 36 期:弱验证

【缺陷周话】第 35 期:除数为零

【缺陷周话】第 34 期:重定向

【缺陷周话】第 33期:错误的资源关闭

【缺陷周话】第 32期:弱加密

【缺陷周话】第 31 期:错误的内存释放方法

【缺陷周话】第 30 期:不安全的哈希算法

【缺陷周话】第 29 期:返回栈地址

【缺陷周话】第 28 期:被污染的内存分配

【缺陷周话】第 27 期:不安全的随机数

【缺陷周话】第 26期:被污染的格式化字符串

【缺陷周话】第 25期:硬编码密码

【缺陷周话】第 24期:在scanf 函数中没有对 %s 格式符进行宽度限制

【缺陷周话】第 23期:双重检查锁定

【缺陷周话】第 22期:错误的内存释放对象

【缺陷周话】第 21 期:数据库访问控制

【缺陷周话】第 20 期:无符号整数回绕

【缺陷周话】第19期:LDAP 注入

【缺陷周话】第18 期  XPath 注入

【缺陷周话】第17 期:有符号整数溢出

【缺陷周话】第 16 期 — 资源未释放:流

【缺陷周话】第 15 期 — 资源未释放:文件

【缺陷周话】第 14 期 :HTTP 响应截断

【缺陷周话】第 13期 :二次释放

【缺陷周话】第 12期 :存储型 XSS

【缺陷周话】第 11期 :释放后使用

【缺陷周话】第 10 期 :反射型 XSS

【缺陷周话】第 9 期 :缓冲区下溢

【缺陷周话】第 8 期 :路径遍历

【缺陷周话】第 7 期 :缓冲区上溢

【缺陷周话】第 6 期 :命令注入

【缺陷周话】第5期 :越界访问

【缺陷周话】第4期 :XML 外部实体注入

【缺陷周话】第3期 :内存泄漏

【缺陷周话】第 2 期 :SQL 注入

【缺陷周话】第1期 :空指针解引用

*奇安信代码卫士团队原创出品。未经许可,禁止转载。转载请注明“转自奇安信代码卫士 www.codesafe.cn”。

奇安信代码卫士 (codesafe)

国内首个专注于软件开发安全的产品线。

https防止注入_【缺陷周话】第40期:JSON 注入相关推荐

  1. sqlserver存储过程加锁后怎么解锁_【缺陷周话】第59期:重复加锁

     聚焦源代码安全,网罗国内外最新资讯! *声明:<缺陷周话>栏目系列文章由奇安信代码卫士团队原创出品.未经许可,禁止转载.转载请注明"转自奇安信代码卫士 www.codesafe ...

  2. c语言 空指针解引用,【缺陷周话】第一期:空指针解引用

    代码审计是使用静态分析发现源代码中安全缺陷的方法,能够辅助开发或测试人员在软件上线前较为全面地了解其安全问题,防患于未然,因此一直以来都是学术界和产业界研究的热点,并且已经成为安全开发生命周期 SDL ...

  3. node.js mysql防注入_避免Node.js中的命令行注入安全漏洞

    在这篇文章中,我们将学习正确使用Node.js调用系统命令的方法,以避免常见的命令行注入漏洞. 我们经常使用的调用命令的方法是最简单的child_process.exec.它有很一个简单的使用模式;通 ...

  4. java参数值注入_在springboot中使用注解将值注入参数的操作

    后端的许多管理系统需要登陆者的信息,如shiro登陆后,会将登陆者的信息存储在shiro的session,在使用时需要多行代码获取用户信息.可以把获取在shiro中的登陆者信息封装在一个类中,使用时获 ...

  5. 墨者学院mysql注入_【墨者学院】:SQL注入漏洞测试(delete注入)

    0x00.题目描述: 背景介绍 最近有人匿名给工程师留言说,感谢他的辛勤付出,把墨者学院建设的这么好,不料激发了工程师对留言板的一波操作,轻松查到了这个人的身份. 实训目标 1.熟练掌握留言板的工作原 ...

  6. 禅道测试套件怎么用_易软快报第40期:禅道新增测试套件、报告、用例库功能...

    题图为青岛中山公园樱花大道.每年4月初,单樱盛放.图片来自网络. 本期易软快报,着重向大家推荐一下禅道新版本. 禅道开源版9.1版本和专业版6.1版本,完善了测试视图功能,新增了 测试套件,测试总结报 ...

  7. scheduled 每月最后一天_单周、双周、每月?哪种定投方式收益最高?

    首发在公众号:进入金融界(ID:进入金融界)原创不易,跪谢关注 之前咱们聊了一下周一到周五到底哪天定投收益最高,之后很多朋友留言,想测一下基金定投多长时间一次收益比较高. 一个月定投一次? 双周定投一 ...

  8. 内核二分缺陷_缺陷跟踪

    1. 内核二分缺陷_缺陷跟踪 1.1 二分缺陷 # 利用git log 查看提交的历史记录 root@mouse:~/linux# git log --oneline 56e337f2cf13 (HE ...

  9. service 层注入不同的数据源_.NET 理论基础+实战控制台程序实现AutoFac注入

    (给DotNet加星标,提升.Net技能) 转自:在7楼 cnblogs.com/RayWang/p/11128554.html 简介 该系列共5篇文章,旨在以实战模式,在.NET下的 控制台程序 F ...

最新文章

  1. mysql索引排序算法_MySQL中利用索引对数据进行排序的基础教程
  2. 元素节点、属性节点、文本节点 的节点属性
  3. zynq网络时钟控制寄存器_【干货分享】ZYNQ开发基本流程
  4. Scala _01介绍安装使用
  5. Xcode中Info.plist文件各个键的作用说明【搜藏】
  6. Android下文件的压缩和解压(Zip格式)
  7. 华为云发起美食图片分类大赛!奖品丰厚还可免费使用云资源
  8. 使TextView里面的文字滚动起来
  9. air写文件 SecurityError: fileWriteResource 时报错的解决方法
  10. mysql读写分离实现事务_Mysql读写分离后的事务ce
  11. 师范生计算机期末考试题目,2015年深圳宝安区计算机教师招聘考试试题[师范生发布]无答案...
  12. 异常详细信息: System.ComponentModel.Win32Exception: 拒绝访问。
  13. java中接口与抽象类的区别
  14. 解决navicat连接不上mysql8
  15. 一键安装iis php mysql环境_Windows Server服务器环境配置:一键安装IIS+PHP+MySQL环境...
  16. Atitit 培训之道 attilax著 1. 概念 培训就是及教育 1 1.1. 知识体系化 2 1.2. 组织架构 2 1.3. 人员架构 梯队化培训 2 2. 培训目标,尽可能与项目相关技术点
  17. 面对10倍需求只用 40% 成本,这是一种怎样的体验?
  18. C语言也能干大事第十三节(如鹏基础)
  19. discuz分类信息模版PHP,Discuz 社区分类信息模板使用教程
  20. 设计模式初探之设计模式六大原则(3):依赖倒置原则

热门文章

  1. menu什么意思中文意思_pipeline什么意思
  2. java函数void返回值是,Java中main()函数的返回值是什么( )。A、StringB、intC、c......
  3. html编写输出学生姓名,用C++编写一个学生信息管理系统
  4. creo如何更改打开时显示方式_图纸打开显示问号时的一种快捷更改方法【AutoCAD教程】...
  5. oracle mysql 数据类型对比_Oracle、SQL Server、MySQL数据类型对比
  6. 启动vue项目报错faield at the vue-cli-service serve
  7. ASP.NET MVC 使用 Datatables (1)
  8. 程序员入门--两年养成之路
  9. UE4学习-阶段性总结1
  10. BZOJ 2287 POJ Challenge 消失之物