JSON注入—Web安全深度剖析(7)

发表于:2015-5-15 09:48

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:张炳帅    来源:51Testing软件测试网原创

  10.3.3  JSON注入
  JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它基于JavaScript的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(C、C++、C#、Java、JavaScript、Perl、Python等语言都可以使用JSON),这些特性使JSON成为理想的数据交换语言,易于开发人员阅读和编写,同时也易于程序解析和生成。JSON的出现在某些方面可以说是XML的一大对手。关于JSON更多的详细介绍请参照其官方网址:http://www.json.org/。
  简单地说,JSON可以将JavaScript中的对象转换为字符串,然后在函数、网络之间传递这个字符串。这个字符串看起来有点儿怪异,但是JavaScript很容易解释它,而且JSON可以表示比"Key / Value"更复杂的结构。
  例如,下面一段示例是JSON最简单的Key→Value示例(名称 / 值对,键值对):
  { "UserName": "xxser" }
  这么简单的数据可能并不能太多地表现JSON存在的价值,接着看下面一组JSON数据。
  { "UserName": "xxser", "PassWord":"nike", "email": "root@secbug.org" }
  从语法方面看,与"Key /Value"相比并没有很大的优势,但是在这种情况下,JSON更容易使用,而且可读性更好。
  最重要的是,当需要表示一组值时,JSON不但能够提高可读性,而且可以减少复杂性。例如,假设你希望表示一个管理员列表,在XML中需要许多开始标记和结束标记,较为复杂,而使用JSON却简单明了。
  { "users":[
  { "UserName": "xxser", "PassWord":" xxser ", "email": "xxser@xxser.com" }
  { "UserName": "admin", "PassWord":" admin88 ", "email": "admin@xxser.com" }
  { "UserName": "root", "PassWord":" root 123", "email": "root@xxser.com" }
  { "UserName": "hacker", "PassWord":"nike", "email": "hack@xxser.com" }
  { "UserName": "2cto", "PassWord":"2cto", "email": "xxser@xxser.com" }
  ] }
  在了解了基础的JSON知识后,下面来看JSON中的注入。
  在JSON的基础知识中,我们了解到JSON是根据引号(")、冒号(:)、逗号(,)和花括号({})区分各字符的意义的。如果有恶意用户向JSON中注入恶意字符,那么JSON将解析失败。例如,输入的PassWord值为:
  admin"888
  那么组装成的JSON数据位如下:
  "PassWord":" admin"888"
  在PassWord中的引号将会破坏整个JSON的结构,导致JSON解析失败。JSON注入没有其他几种注入的危害性大,但依然不可小视,笔者一直认为没有低危的漏洞,只是还没碰到可利用的场景,攻击者可能通过这类低危漏洞辅助其他攻击,这时低危漏洞将不再低危。
  如何防御JSON注射呢?方法依然很简单,只需要对其关键字符进行转义即可,如:将"admin"888"转换为"admin\"888",这样JSON的值就可以解析了。如果字符串中出现"\",同样需要将其转义为"\\"。
  如果你不喜欢自己动手去解决这些问题,可以使用一些第三方组件。以Java为例,如图10-22所示,使用了JSON-lib.jar组建JSON数据,可以有效地避免JSON注入。
  
图10-22  使用JSON-lib组建JSON数据
  10.3.4  HTTP Parameter Pollution
  HTTP Parameter Pollution即HTTP参数污染,简称HPP。它就是Web容器处理HTTP参数的问题。看下面一个例子。
  HttpPar.php源码如下:
  <?php
  $str = $_REQUEST['str'] ;
  echo $str ;
  ?>
  这段代码的含义很简单,接收HTTP参数中str的值,并显示在页面中,访问URL:http://www.xxser.com/HttpPar.php?str=hello,显示结果如图10-23所示,图片中的服务器环境为PHP+Apache 2.2。
  
图10-23  显示结果
本文选自《Web安全深度剖析》第十章,本站经电子工业出版社和作者的授权。
版权声明:51Testing软件测试网获电子工业出版社和作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。
41/41234>
价值398元的测试课程免费赠送,填问卷领取吧!

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计

法律顾问:上海漕溪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2023
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号