JSON劫持漏洞分析

什么是JSON劫持

单从字面上就可以理解的出来,JSON是一种轻量级的数据交换格式,而劫持就是对数据进行窃取(或者应该称为打劫、拦截比较合适。恶意攻击者通过某些特定的手段,将本应该返回给用户的JSON数据进行拦截,转而将数据发送回给恶意攻击者,这就是JSON劫持的大概含义。一般来说进行劫持的JSON数据都是包含敏感信息或者有价值的数据。

造成JSON劫持漏洞的成因

正所谓无风不起浪,无根不长草,要发动一次成功的JSON劫持攻击必须要有这些先决条件

1、受攻击的网站URL返回一个JSON对象或者数组,并且返回的数据有重要的价值,也就是敏感的数据。(PS:JSON Hijacking 里说只支持数组,但是对象也是可以进行劫持的,具体在下面的流程中会说明)
2、受攻击的网站地址支持GET请求的响应(PS:其实POST请求也可以做到JSON劫持,只不过需要对受害人进行诱导提及表单以发送POST请求。相比GET请求来说十分麻烦
3、受害人的浏览器没有禁用javascript(PS:现在一般也不会禁用js,毕竟目前许多网站都依赖于脚本所展现的强大功能和绚丽的效果)

4、受害人浏览了钓鱼/恶意网站,并且受害人在受攻击的网站中,保存在COOKIE中的身份验证信息尚未清除。(PS:除非受攻击的站点没有做任何的身份验证!一般响应重要数据的JSON服务都是需要做身份验证的)
5、受攻击的站点没有做相关的防御措施

JSON劫持攻击的流程和手段

一、进行JSON劫持的第一步就是恶意攻击者要确定攻击的网站,一般会挑选大众常去的网站或者有价值的网站(购票网站、网购网站、论坛等)。由于大部分使用JSON作为数据传输的网站往往会使用到AJAX技术,而AJAX作为前端脚本,存在着透明性和公开性。这样导致的结果是增加了攻击层面和入口,为攻击者添加了更多的选择和便捷。

所以恶意攻击者常常浏览网站的脚本来寻找漏洞进行攻击,一但确定网站存在JSON劫持漏洞,即某个JSON服务或者接口返回有价值的敏感的JSON数组数据,那么攻击者就会针对这个网站进行JSON劫持攻击。(这里假设我们要攻击的站点地址是:http://vulnerable.shiyousan.com/Home/GetJson,PS:该URL假设是一个JSON服务和接口,会返回一个敏感的JSON数组数据)

服务器的代码如下:

[HttpGet]
   [Authorize]
   public ActionResult GetJson()
   {
       //这里使用了隐式类型的数组,C#3.0的新特性
       var result=new[]{new {Id=1,Name="张三"},new {Id=2,Name="李四"}};
       return Json(result, JsonRequestBehavior.AllowGet);
   }

另外可以看到这里设置了JsonRequestBehavior.AllowGet参数,如果不设置会提示如下错误:“此请求已被阻止,因为当用在 GET 请求中时,会将敏感信息透漏给第三方网站。若要允许 GET 请求,请将 JsonRequestBehavior 设置为 AllowGet。

我们可以看到现在ASP.NET MVC默认是禁止使用GET请求来获取JSON数据的,微软默认已经为JSON劫持做了防御措施。(详情点击此链接

二、在第一步明确了要攻击的站点后,恶意攻击者第二步就是要诱骗受害人点击和进入到钓鱼/恶意网站,这点是十分重要的,所以恶意攻击者常常在网络上通过各种方式诱骗受害人进入到他们精心布置的陷阱中。

常用的方式有以下几种:

1、通过邮件群发,发送大量垃圾/钓鱼邮件等待受害者点击邮件中的链接。一般此类邮件的标题和内容往往是十分吸引人的,比如:点击这个链接看美女/点击链接观看超级有趣的视频/揭秘某某明星的秘密之类的链接。当然,这里的只是随便举例,真正高明的欺诈师往往在内容上会做一定的处理,让你神不知鬼不觉的进入到恶意网站中。

2、通过社交软件和网站发送链接,随着各种社交软件和网站的崛起,在信息传播方面也变得更加便捷与迅速。与此同时也给恶意攻击者提供了更加便捷的钓鱼和攻击方式。

3、还有其他的各种方式,比如论坛发帖啦,前阵子的超级手机病毒蝗虫(通过短信诱骗受害人下载病毒),还有各种即时通讯工具(QQ群或者陌生人的链接不要乱点)等。


三、一旦受害人点击了恶意链接进入到钓鱼网站中,那么接下的第三步就是劫持受害人的数据了。结合我所查阅的资料,在受害人进入到恶意钓鱼网站后,恶意网站会进行下面这些流程:

1、首先会向进行攻击的目标网站发送一个GET请求(如第一步所说的,假设攻击的URL是http://vulnerable.shiyousan.com/Home/GetJson,这个URL会返回一些重要的JSON数组数据),只要在网页中放置这句代码,就会自动朝目标发送一个HTTP GET请求:

<script src="http://vulnerable.shiyousan.com/Home/GetJson"></scirpt>

如果目标URL地址只支持POST请求,那么攻击者可能要费一番功夫,诱导受害人点击提交表单,从而发生一次POST请求。

另外就向上面所说的JSON劫持形成的先决条件那样,敏感数据的获取都是需要进行身份验证的,这也是JSON劫持的另一个特殊点。受害人一进入钓鱼网站,就向受攻击的网站发送GET请求,而由于GET请求是从受害人的浏览器发出的,所以请求发送的同时也会将受害人在网站中身份验证信息的cookie一同发送给受攻击的站点,这样一来就等于是恶意攻击者伪装成受害人,伪装成一个合法的用户。而受攻击的网站因为这个合法的身份,就会将敏感的JSON数组数据响应给钓鱼/恶意网站。

PS:这里额外说明下,一般身份验证信息在COOKIE中保存的只是一个会话ID,而真正的会话是保存在服务器上的,但是攻击者只要获取到这个会话ID并发送给网站,就可以匹配到受害者的身份验证会话,即等于成功的伪装成受害者,这其实也是一种CSRF(跨站请求伪造)攻击。

2、恶意网站成功发送一个带有身份验证信息的GET请求后,成功的获取到了攻击站点返回的数据,响应的数据需要是JSON数组或者JSON对象。一般都是返回JSON数组,如果返回JSON对象网站需要经过特殊处理,比如返回{"Id":1, "Name":"张三"}这样的JSON对象,浏览器会提示非法标签错误,所以服务器上需要在返回的JSON上添加小括号:({"Id":1, "Name":"张三"})。

到了这一步是最关键的地方,攻击者接下要做的就是将响应到钓鱼网站的数据发送到自己服务器的数据库上,这就是将数据劫持了。因为此攻击是针对JSON格式的数据,所以也称为JSON劫持。

那么攻击者是如何将数据劫持走的呢?这里就需要用到JS中的方法覆盖的特性或者使用JS的特殊方法__defineSetter__(__defineSetter__存在浏览器兼容问题,所以一般是使用JS的方法覆盖)。具体的原理可以查看这篇文章:《Javascript方法的覆盖和重写》。攻击者通过javascript中可以覆盖掉其他方法的特性,将响应给恶意网站的JSON数组或者对象进行构造函数的替换。

具体代码如下:

   <script type="text/javascript">
        function Array() {
            //这里假设返回的JSON数组是:[{ "Id": 1, "Name": "张三" }, { "Id": 2, "Name": "李四" }]
            var jsonData = this;
            var message = '[';
            for (var index in jsonData) {
                message += '{"Id":' + jsonData[index].Id + ',"Name":"' + jsonData[index].Name + '"}';
            }
            message += ']';
            /*
            * 弹出返回的数据,这里我们只是将劫持到数据弹出,
            * 而恶意攻击者则会在这里将劫持到的JSON数据传送到他们的服务器中
            */
            alert(message);
        }
    </script>

当JSON数据响应给网站时,浏览器立即会调用数组或者对象的构造函数。正是利用这一点,把构造方法替换成恶意代码,在构造方法中添加将JSON数据发送给第三方即攻击者的代码。到了这里就成功的完成了整个JSON劫持攻击的流程!!!


如何防御JSON劫持

防御要从两方面着手,一是网站方面必须做好防御机制,二是用户也需要提高警惕。

先从网站方面来说,其实JSON劫持是一种变相的CSRF(跨站请求伪造)攻击,所以使用通常应对CSRF攻击的常规手段就可以很好的防御住此类攻击,通常是使用访问令牌,token机制就可以较好的防御住攻击,在发送请求的时候必须将token令牌也发送给JSON服务,这样基本可以杜绝此类攻击。

还有敏感和重要数据的请求入口一定要设置身份验证,而且最好限制只能POST请求,虽然这不能完全的防御住攻击(基本上可以杜绝大部分攻击),但是可以为攻击者添加难度,ASP.NET MVC中只需要在控制器的Action中声明[HttpPost]特性就可以了。此外最好能判断请求的来源,设置请求的黑白名单,这样能极大的提高安全性。

另外从用户方法来说,提高网络安全意识也是很重要的。程序中总会存在各种各样的漏洞,漏洞无处不在,只有还未修复和破解的漏洞,只有还未发现和产生的漏洞。所以我们适当的提供一点安全意识,不随意点击来路不明的链接,这样可以减少进入钓鱼网站的概率。

除此之外,还要注意保护自己的相关信息不被非法窃取和利用,毕竟如果黑客不知道我们的任何联系方式(包括邮箱,手机号,QQ等即时通讯工具号),那么就会减少被黑客盯上的概率。

<think>首先,用户查询是关于“JSON权限提升漏洞”的信息,包括原理、表现和解决方案。用户提到参考了几个站内引用,所以我需要整合这些引用来构建回答。 回顾引用: - 引用[1]:提到JSON漏洞,涉及JSON劫持问题。 - 引用[2]:关于输入验证漏洞,给出了解决方案如白名单验证、限制输入长度和使用Bean Validation。 - 引用[3]:描述了一个MongoDB Driver中的反序列化漏洞,强调输入验证缺失可能导致远程代码执行。 - 引用[4]:关于Zabbix漏洞修复,但没有直接相关JSON权限提升。 - 引用[5]:提到服务端开发中的安全漏洞,如SQL注入,但未直接涉及JSON权限提升。 用户的问题是“JSON权限提升漏洞”,但引用的内容中没有直接提到“JSON权限提升”。相反,引用[1]提到“JSON劫持”,引用[3]提到反序列化漏洞可能导致权限提升(如远程代码执行会导致权限提升)。 所以,我需要推断“JSON权限提升漏洞”可能指的是什么: - JSON劫持JSON Hijacking):这是一种Web安全漏洞,攻击者利用浏览器机制窃取JSON数据。 - 反序列化漏洞(Deserialization Vulnerability):在JSON反序列化过程中,恶意输入可能导致代码执行,从而提升权限。 在引用[3]中,描述了MongoDB Driver的漏洞,其中通过构造恶意JSON数据执行任意代码,这会导致权限提升。 因此,我应该将“JSON权限提升漏洞”解释为JSON反序列化漏洞JSON劫持,可能导致权限提升。 结构化回答: 1. **原理**:解释漏洞如何工作。 2. **表现**:描述漏洞的表现形式。 3. **解决方案**:提供修复措施。 使用引用支持: - 从引用[3]:漏洞原理涉及反序列化用户提供的数据时缺少验证,攻击者可利用Gadget链执行代码。 - 从引用[1]:JSON劫持问题。 - 从引用[2]:通用输入验证方案,如白名单和Bean Validation。 回答结构: - 清晰、逐步解释。 - 使用中文。 - 末尾添加相关问题。 - 在引用段落末尾添加引用标识,例如:[^数字]。 确保LaTeX格式正确:用户查询中没有数学表达式,所以可能不需要使用LaTeX。如果有公式,我会插入,但这里可能不需要。 最终回答: 1. 开头介绍JSON权限提升漏洞。 2. 原理部分。 3. 表现部分。 4. 解决方案部分。 5. 结尾生成相关问题。 </think>### JSON权限提升漏洞的原理、表现及解决方案 基于您提供的站内引用和网络安全知识,我将逐步解析“JSON权限提升漏洞”的信息。这个术语通常指与JSON数据处理相关的安全漏洞,可能导致攻击者提升权限(如执行任意代码或获取未授权访问)。常见的类型包括JSON反序列化漏洞(可能导致远程代码执行)和JSON劫持(可能导致数据泄露)。以下内容整合了引用中的关键点,并确保真实可靠。 #### 1. **漏洞原理** JSON权限提升漏洞的核心原理是:应用程序在处理JSON数据时,由于输入验证不足或反序列化过程的缺陷,攻击者能够注入恶意负载,从而触发权限提升操作(如提升到管理员权限或远程执行代码)。具体机制包括: - **反序列化漏洞原理**:当JSON数据被反序列化成对象时,如果应用程序未对用户输入进行严格验证,攻击者可以构造恶意JSON字符串来利用序列化框架(如.NET的`MongoDB.Driver`)中的Gadget链。这会导致反序列化过程中的代码执行,例如通过漏洞链调用恶意方法(如`System.Object`类型的属性),从而实现权限提升。引用[3]强调了此类漏洞在特定条件下(如使用未验证的`_t`字段)的风险。 - **JSON劫持原理**:攻击者利用浏览器的跨域机制(如通过`<script>`标签加载JSON数据),在用户不知情的情况下窃取敏感JSON响应(如认证令牌)。一旦JSON数据被劫持,攻击者可结合其他漏洞(如跨站请求伪造)提升权限。引用[1]提到JSON劫持问题可能与JSON漏洞相关。 - **通用输入验证缺失**:漏洞的根本原因是用户输入未被充分验证(引用[2])。例如,缺少白名单或长度限制,允许攻击者注入操纵权限的JSON载荷(如包含特权操作的特殊格式字符串)。 #### 2. **漏洞表现** 这类漏洞在实际运行中可能表现为多个可观测的迹象: - **权限提升行为**:攻击者通过恶意JSON载荷执行未授权操作,例如普通用户提升为管理员(如修改数据库权限或执行系统命令)。引用[3]指出,攻击者需具备数据库插入权限才能利用漏洞链,实现远程代码执行。 - **异常数据泄露**:应用程序返回的JSON响应可能被非法读取(如劫持后显示在攻击者的控制界面),导致敏感信息(如用户凭证或权限令牌)泄露。引用[1]提到安全扫描检测到JSON劫持漏洞。 - **系统崩溃或拒绝服务**:恶意JSON输入可能导致服务瘫痪(如反序列化错误触发缓冲区溢出)。引用[3]提到漏洞可能造成拒绝服务(DoS)。 - **安全扫描告警**:在漏洞扫描中(如引用[1]所述),日志可能显示“JSON反序列化风险”或“权限提升攻击”告警,具体表现为异常输入验证错误(引用[2])。 #### 3. **解决方案** 修复JSON权限提升漏洞需结合输入验证、库升级和安全编码实践。基于引用内容,提供以下可靠方案: - **升级依赖库**:及时更新有漏洞JSON处理库或框架。例如: - MongoDB驱动漏洞(引用[3])可通过升级到修复版本(如`MongoDB.Driver@2.19.0+`)解决。 - JSON库(如Jackson或Newtonsoft.Json)应保持最新版本,引用[1]建议提高包等级未完全解决问题,升级到安全版本更有效。 - **强化输入验证**: - 实施白名单验证:只允许特定字符或格式的JSON输入(引用[2])。示例代码使用Bean Validation(JSR-303): ```java public class User { @NotBlank(message = "用户名不能为空") @Size(min = 5, max = 20, message = "用户名长度必须在5到20之间") private String username; // 其他字段使用类似注解 } ``` 在控制器中验证输入: ```java @PostMapping("/api/data") public ResponseEntity<String> handleJson(@Valid @RequestBody User data, BindingResult result) { if (result.hasErrors()) { return ResponseEntity.badRequest().body("输入无效:" + result.getAllErrors().get(0).getDefaultMessage()); } // 安全处理JSON } ``` - 限制输入长度:设置JSON载荷的最大字节大小,防止缓冲区溢出(引用[2])。 - **禁用危险特性**:在反序列化配置中关闭不安全的特性(如.NET中的`TypeNameHandling`),避免Gadget链利用。引用[3]建议严格验证`_t`字段。 - **输出编码和CORS策略**:防止JSON劫持: - 在响应头中添加`X-Content-Type-Options: nosniff`和`Content-Type: application/json`。 - 启用CORS(跨源资源共享)白名单,限制JSON数据仅被可信域加载(引用[1])。 - **安全扫描和测试**:定期使用工具(如OWASP ZAP或SAST扫描器)检测漏洞。引用[4]展示了漏洞验证过程(如API测试),可应用于JSON端点。 - **最小权限原则**:确保应用程序运行时使用最低数据库权限(如限制插入操作),减少漏洞影响(引用[3])。 #### 总结 JSON权限提升漏洞源于JSON处理中的验证缺失(引用[2])或反序列化缺陷(引用[3]),可能导致严重的安全事件。修复需综合输入验证、库升级和编码规范(引用[1])。实践中,建议遵循OWASP JSON安全指南,并监控官方公告(引用[4])。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值