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软件测试网获电子工业出版社和作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。