第81篇:JSONP劫持漏洞获取敏感信息原理、复现与坑点总结

news2024/11/30 6:51:18

712c4db22da49f5a2583f29b4324e472.png

 Part1 前言 

大家好,我是ABC_123。今天我们研究一下JSONP劫持漏洞,早些年这个漏洞主要被攻击者用来窃取个人信息,如姓名、身份证号、家庭住址等,现在更多的用于蜜罐之中,间接溯源红队攻击者的个人身份。好多朋友至今对这个漏洞理解不深刻,能发现能利用,但是就是不明白原理,有时候别人能复现成功,但是自己却怎么都复现成功。今天ABC_123搭建一个tomcat环境,用java代码写了几个servlet复现并讲解一下这个漏洞,收获不少,也踩了不少坑。

注:关于javascript的同源策略问题,我很久之前的一篇文章《第40篇:CORS跨域资源共享漏洞的复现、分析、利用及修复过程》写的很清楚,大家可以重新阅读一下,这里就不过多叙述了。

76f08a90c8cf1f4dba3f2fcbb401e616.jpeg

 Part2 技术研究过程 

  • JSONP基础知识

首先,JSON与JSONP是两个概念,JSON是一种比较流行的数据格式,用于在不同应用程序之间传输和存储数据。JSONP是在CORS出现之前,解决跨域请求的技术,可以让网页从不满足同源策略的其它域名获取数据;JSONP是json的一种使用方式,可以让当前网页跨域从别的域名获取数据,它利用了<script>标签的src属性不受同源策略影响的特性

当网站通过JSONP方式传递用户的敏感数据时,攻击者可以搭建一个第三方网站,网页内部嵌入JSONP链接,并嵌入恶意的JS代码,一旦受害者用户浏览此网站,自己的敏感信息会在毫不知情的情况下被攻击者事先构造好的js代码窃取,这就是今天我们要讲解的JSONP劫持漏洞。

  • 环境搭建过程

首先编写一个servlet页面,可以让用户使用用户名密码登录并会保存cookie,模仿生产环境中用户登录后的状态。JSONP劫持要想获取受害者敏感数据,受害者前提一定要登录过网站,并且没有注销登录,这样在攻击者在实施JSONP劫持攻击时,浏览器会自动带上用户的Cookie,从而获取敏感数据。

1f9e02ccf2744d92e7b5a45a3db0ce1c.png

编写一个GetUserInfo页面,返回JSONP格式的数据,其中包括用户的敏感数据身份证号、姓名、密码等。

6451f6b12ba7d8a963ec98e12219b1b4.png

如下图所示,生成war包并部署到tomcat中,浏览器中输入用户名密码admin:123456,提示登录成功。

90510c2c4c8769893f74d0f16df96470.png

访问以下URL路径,模仿正常网站,返回我们自己填入的个人信息。

http://192.168.237.1:9999/Servlet/GetUserInfo

770675723554d27d08cc5bbb2c035864.png

接下来我们传入callback参数,正式模仿JSONP劫持,发现当前JSONP页面返回了一个符合javascript标准的代码格式,test111()相当于一个JS函数。

a44b87ac59b5661443baf2353d2d042f.png

  • JSONP劫持漏洞测试过程

接下来模仿攻击者构造一个JSONP劫持漏洞测试页面,如下图所示。

fedecedc9dd0cfe11711a0f0f73e7a3d.png

其中user111222是要回调的函数,

<script src=”http://192.168.237.1:9999/Servlet/GetUserInfo?callback=user111222”> 

这里相当于加载了一段JS代码,而这段JS代码就是

user111222({"identitycard":"370688022919880819","password":"P@ssw0rd","username":"李四"})

随后js引擎会继续在当前页面寻找user111222函数,顺便带入执行alert(JSON.stringify(data));代码。

很多文章没有给出上述描述,造成很多新手始终不理解JSONP劫持漏洞原理。于是我们用谷歌浏览器chrome测试一下,发现返回空白页面,并没有弹出用户的敏感数据。

aef998745b12629fb32056a4c368d84b.png

这是为什么呢?ABC_123从头到尾检查了一遍代码,发现应该是没有问题。于是我用抓包软件抓了一下数据包,发现http请求包居然没有cookie,在没有cookie的情况下,当然不会返回敏感数据了。

f01f6bad1116796598544007f10d4a66.png

联想到之前测试CORS跨域资源共享漏洞,猜想是不是谷歌浏览器对JSONP劫持做了防范。于是我换了一个老版本的firefox浏览器测试一下,发现JSONP劫持漏洞测试成功,我作为一个受害者,访问了攻击者的http://192.168.237.128:8888/jsonpHack.html页面,弹出一个信息框,说明我的个人信息可以被获取。

af7d8bd4251509acc16ef3e911b9ec16.png

此时我们用抓包软件抓取一下数据包,发现对于Firefox老版本的浏览器,会自动带上cookie的。

1d879b74d849352479e89f845a9998fc.png

接下来再测试一下IE11,发现仍然JSONP劫持漏洞仍然可以测试成功。

1b06fcc24c76fdeae894312ebe4f82c6.png

综上所述我们发现,对于JSONP劫持漏洞,较新的浏览器或者部分浏览器从根源上进行了防范,这种漏洞的危害性在不久的将来会逐步减低。


  • JSONP劫持漏洞修复建议

1.  接受请求时检查referer来源。

2.  在请求中添加token并在后端进行验证。

3.  严格过滤callback函数名及JSON里数据的输出。

4.  使用CORS替换JSONP跨域功能。

5.  严格过滤callback函数名及JSON里数据的输出防止产生XSS漏洞。

6.  严格安装JSON格式标准输出Content-Type及编码( Content-Type : application/json; charset=utf-8 )。

7.  在callback输出之前加入其他字符(如:/**/、回车换行)这样不影响 JSON 文件加载,又能一定程度防御JSONP劫持攻击。

99e7e83337974248d5ce05e126cd47be.png

 Part3 总结 

1.  最新版的谷歌浏览器Chrome对于JONSP劫持攻击做了防范,这也是为啥很多JSONP劫持漏洞别人能复现成功,而有的人却始终复现不成功的原因。这标志着JSONP劫持和CORS跨域资源共享漏洞危害性会逐步降低。

2.  想要理解一些web漏洞原理,还是得自己搭建环境,自己写代码从头到尾梳理一遍,从根源上理解这个漏洞,踩过坑后才发现原来是这么回事。


7d5fe37827c8732bade5909bb9bf111b.png

公众号专注于网络安全技术分享,包括APT事件分析、红队攻防、蓝队分析、渗透测试、代码审计等,每周一篇,99%原创,敬请关注。

Contact me: 0day123abc#gmail.com

(replace # with @)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1253597.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构 / 计算机内存分配

1. Linux 32位系统内存分配 栈(stack): 先进后出, 栈区变量先定义的后分配内存, 栈区地址从高到低分配堆(heap): 先进先出, 栈区变量先定义的先分配内存, 堆区地址从低到高分配堆栈溢出: 表示的是栈区内存耗尽, 称为溢出. 例如: 每次调用递归都需要在栈区申请内存, 如果递归太深…

【深度学习笔记】04 概率论基础

04 概率论基础 概率论公理联合概率条件概率贝叶斯定理边际化独立性期望和方差模拟投掷骰子的概率随投掷次数增加的变化 概率论公理 概率&#xff08;probability&#xff09;可以被认为是将集合映射到真实值的函数。 在给定的样本空间 S \mathcal{S} S中&#xff0c;事件 A \m…

OpenCV快速入门:相机标定——单目视觉和双目视觉

文章目录 前言一、相机标定的基本原理1.1 相机模型与坐标系1.1.1 相机模型1.1.2 坐标系 1.2 相机内参与外参1.2.1 内部参数1.2.2 外部参数 1.3 镜头畸变1.4 透视变换1.5 标定的重要性和应用场景 二、单目视觉2.1 单目视觉的原理2.1.1 单目视觉的原理2.1.2 单目视觉的公式2.1.3 …

Feign 远程调用

目录 代码架构 feign-api 模块解析 架构 依赖 定义接口类 lead-news-article模块 架构 yml配置 依赖 实现类 启动类 lead-news-wemedia模块 架构 调用 启动类 代码架构 feign-api 模块解析 架构 依赖 <dependency><groupId>org.springframework.clo…

vue+elementui如何实现在表格中点击按钮预览图片?

效果图如上&#xff1a; 使用el-image-viewer 重点 &#xff1a; 引入 import ElImageViewer from "element-ui/packages/image/src/image-viewer"; <template><div class"preview-table"><el-table border :data"tableData" …

【计算机网络笔记】多路访问控制(MAC)协议——随机访问MAC协议

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

Linux操作系统之apt常用命令记录

文章目录 apt 命令apt 语法apt 常用命令列出所有可更新的软件清单命令升级软件包列出可更新的软件包及版本信息升级软件包&#xff0c;升级前先删除需要更新软件包安装指定的软件命令&#xff1a;安装多个软件包&#xff1a;更新指定的软件命令显示软件包具体信息,例如&#xf…

3. 内存单元

1位的内存单元 对于一个内存单元需要有:1个锁存器,数据输入,可写控制,是否读取(也是是否输出), 行和列(内存地址), 数据输出这几部分组成写入: 当行和列, 数据输入,可写全为1时则写入,(行 & 列 & 输入 & 可写)读出(输出): 当 行,列, 是否读取(也是是否输出) ( 行 …

C语言进阶之路-运算符小怪篇

目录 一、学习目标 二、运算符详谈 算术运算符 关系运算符 逻辑运算符 位运算符 特殊运算符 条件运算符 sizeof 运算符 打怪实战 三、控制流 二路分支 多路分支 const while与 do…while循环 语法&#xff1a; for循环 break与continue goto语句&#xff08…

应用Web3.0的5种方法提升你的点击量

Web3.0早已成为互联网的全新方向标&#xff0c;为用户带来全新的手机上网感受。它也变成吸引住点击量疯涨的秘密武器。我们将要详细介绍Web3.0的五种使用方法&#xff0c;帮助你更好的了解并应用Web3.0技术性&#xff0c;以提升你的点击量。 1.可靠的身份认证Web3.0技术性提供了…

GIS入门,开源 JavaScript二维地图引擎OpenLayers介绍

VueOpenLayers中文教程推荐&#xff0c;不同于OpenLayers官方文档使用htmljs原生原生教程&#xff0c;博主专栏包含大量vue整合案例和实际开发案例&#xff0c;非常适合地图开发小白快速入门。 vue整合OpenLayers6入门教程&#xff1a; 《VueOpenLayers入门教程汇总目录》vue整…

MySQL MHA高可用架构搭建

快捷查看指令 ctrlf 进行搜索会直接定位到需要的知识点和命令讲解&#xff08;如有不正确的地方欢迎各位小伙伴在评论区提意见&#xff0c;博主会及时修改&#xff09; MySQL MHA高可用架构搭建 MHA&#xff08;Master HA&#xff09;是一款开源的 MySQL 的高可用程序&#xf…

STM32_8(DMA)

一、DMA DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取DMA可以提供外设和存储器或者存储器和存储器之间的高速数据传输&#xff0c;无须CPU干预&#xff0c;节省了CPU的资源12个独立可配置的通道&#xff1a; DMA1&#xff08;7个通道&#xff09;&#xff…

11-25碎片小知识

一.strlen补充 strlen函数返回值是size_t&#xff0c;即无符号整型&#xff0c; size_t有头文件&#xff0c;是stdio.h 由于strlen函数返回值是无符号整型&#xff0c;所以下面代码要注意 -3会被转换成无符号的 实现my_strlen 法一&#xff1a;指针减指针 #define _CRT_S…

Spring Cache框架,实现了基于注解的缓存功能。

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ Spring Cache框架 简介Spring Cache 环境准备S…

RedLock底层源码分析

RedLock底层源码分析 一、Redlock红锁算法 https://redis.io/docs/manual/patterns/distributed-locks/官网说明 1、为什么要学习这个&#xff1f;怎么产生的&#xff1f; ​ 一个很直接的问题&#xff0c;当我使用redis锁的那台机器挂了&#xff0c;出现了单点故障了&#…

源 “MySQL 8.0 Community Server“ 的 GPG 密钥已安装,但是不适用于此软件包。请检查源的公钥 URL 是否配置正确。

源 “MySQL 8.0 Community Server“ 的 GPG 密钥已安装&#xff0c;但是不适用于此软件包。请检查源的公钥 URL 是否配置正确。yum install mysql-server --nogpgcheck

【深度学习】因果推断与机器学习的高级实践 | 数学建模

文章目录 因果推断因果推断的前世今生&#xff08;1&#xff09;潜在结果框架&#xff08;Potential Outcome Framework&#xff09;&#xff08;2&#xff09;结构因果模型&#xff08;Structual Causal Model&#xff0c;SCM&#xff09; 身处人工智能爆发式增长时代的机器学…

VCenter6.7 Web访问提示503 Service Unavailable

PS&#xff1a;本文分享VMware Vcenter在web登录的时候报错&#xff1a;503 Service Unavailable&#xff0c;对于6.7.x版本比较适用&#xff0c;其他版本需自行测试。 简单来讲就是需要重启一下vsphre-client服务&#xff0c;如重启该服务仍无法解决&#xff0c;可以尝试重启一…

Windows系统管理之备份与恢复

本章目录&#xff1a; 一. 本章须知&#xff1a; 前置条件 需要创建一个新的磁盘 前置条件2 给新添加的磁盘分盘 二. 了解开启并学会使用Windows sever backup 如何使用备份与恢复“备份计划”“一次性备份”“恢复” 最后是用命令行“一次性备份命令 ”完成一次备份 话不多说 …