应用安全系列之六:JSON注入

本系列文章主旨在于介绍一些漏洞类型产生的基本原理,探索最基础的解决问题的措施,不排除有些语言或者系统提供的安全的API可以更好地更直接地解决问题,也不排除可以严格地输入验证来解决。

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。JSON采用完全独立于语言的文本格式。JSON 可以表示比“名称/值对”更复杂的结构。例如,可以表示数组和复杂的对象,而不仅仅是键和值的简单列表。

按照最简单的形式,可以用下面这样的JSON表示“名称/值对”:

{ "name": "admin" }

复杂一点的可以表示对象数组,如下:

{ "user": 
	[   
	    { "name": "admin", "email": "admin@example.com" },   	  
		{ "name": "test1", "email": "test1@example.com"},   	  
		{ "name": "test2", "email": "test2@example.com" }   
	]
}

JSON虽好,但是在处理数据时也要注意,JSON是根据引号(")、冒号(:)、以及逗号(,)和大括号({})来区分值的,如果一个用户输入的内容里还有引号这样的特殊字符,会破坏本身的数据结构,如果精心构造一些数据,可以导致额外的数据注入。所以,对于这些特殊字符必须在转换成JSON之前进行处理,特别是引号(")。

例如,一个登录请求提交的数据为{"name":"user","password":"Test@123","role":"normal"},如果,输入的password的数据为:Test@123","role":"admin,直接组装成JSON数据,结果为:{"name":"user","password":"Test@123","role":"admin","role":"normal"},就会篡改JSON的数据结构,当然,一般的登录请求不会这么写,这里只是做一个例子说明JSON注入的过程以及结果。

处理的方法有两种:

第一种方法,是最简单的,也是最直接的,直接将双引号使用反斜杠\转义,例如:Test " Test1 =》Test \" Test1,组装成JSON就是:{ "name": "Test \" Test1" },而反斜杠\本身也要转义,转义为两个反斜杠\\。

第二种方法,就是使用XSS文章所说的JavaScript编码,编码方法如下:

特殊字符JavaScript编码值
"\x22
\\x5c

无论采用哪一种方法,再组装JSON时,只要采用统一的方法,就可以避免JSON注入问题。

一般现在的Javascript框架都会自动避免JSON注入,不过,如果能够理了解JSON注入的原理,也可以在自己写JSON组装的代码时或者使用别人的代码时,可以关注是否存在JSON注入的情况,提前预防,以防有注入的情况在产品上线后被利用。

如果有不妥之处,希望可以留言指出。谢谢!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值