当前位置:   article > 正文

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

json注入

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

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

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

{ "name": "admin" }

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

  1. { "user":
  2. [   
  3. { "name": "admin", "email": "admin@example.com" },      
  4. { "name": "test1", "email": "test1@example.com"},      
  5. { "name": "test2", "email": "test2@example.com" }   
  6. ]
  7. }

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注入的情况,提前预防,以防有注入的情况在产品上线后被利用。

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/269668
推荐阅读