CSRF 漏洞学习笔记

news2024/9/25 23:22:44

什么是 CSRF 漏洞

CSRF(Cross Site Request Forgery,跨站请求伪造,也叫 XSRF)漏洞是由于未校验请求来源,导致攻击者可在第三方站点发起 HTTP 请求,并以受害者的目标网站登录态(cookie、session 等)请求,从而执行一些敏感的业务功能操作,比如更改密码、修改个人资料、关注好友。
在这里插入图片描述

从以上可以得知,漏洞比较依赖业务功能。有时虽然存在 CSRF 但并没有实际危害,也不能算是真正意义上的 CSRF 漏洞。比如常规的登录账号功能,如果你不知道密码就无法登录,而如果知道了,那还需要构造 CSRF 请求吗?如果是为了实现多次登录失败,令目标账号暂时无法登录,那么也不需要用 CSRF。如果是一些发消息、发微博的功能,那同样可以产生蠕虫效果,比如微博就曾发生过好多次此类 CSRF 蠕虫漏洞。

CSRF 分类

从漏洞利用角度来分类的话,CSRF 可以分为 CSRF 读与 CSRF 写。

  • CSRF 读:通过伪造请求来获取返回的敏感信息,比如用户资料;常见的就是 JSON 劫持,以及利用 Flash API加载页面获取敏感信息。
  • CSRF 写:通过伪造请求去修改网站数据,比如修改密码、发表文章、发送消息等操作。

CSRF 的攻击手法

以 DVWA 中的 CSRF 题目(Security Level 设置为 Low)为例
在这里插入图片描述
输入密码提交的同时抓包。此处直接用 Chrome 的 Network 功能,抓包后发现只是个 GET 请求,那利用起来就简单了:直接构造以下链接发给受害者,受害者点击后就会被修改密码为你设置的密码。如下所示:
http://127.0.0.1/vulnerabilities/csrf/?password_new={你设置的密码}&password_conf={你设置的密码}&Change=Change

像这种 GET 型的 CSRF 漏洞利用就是仅需要修改下原 GET 的参数值,构造个链接发给对方就可以了;甚至直接使用图片链接嵌入到受害者可能访问的页面(博客、论坛、邮件等等),也可以实现漏洞的利用,这种利用方式更加隐蔽。
如果是 POST 请求,就需要编写利用代码,用 JS 脚本去实现自动提交表单,然后把它放在自己控制的服务器上。假设存放地址为 http://hacker.com/exploit.html ,再生成短网址 http://dwz.date/d74a 发给受害者。
在这里插入图片描述
exploit.html 利用代码如下:

<html>
<form name = "test" action = "http://127.0.0.1/vulnerabilities/csrf" method = "post" >
<input type = "hidden" value="hacker" name="password_new" >
<input type = "hidden" value="hacker" name="password_conf" >
<input type = "hidden" value="Change" name="Change" >
</form>
<script>document.test.submit();</script>
</html>

这里是就模拟原网站的表单提交内容设置的,每个 input 都添加 type=“hidden” 的属性是为了不在网页中显示,最后再利用 document.test.submit() 去自动提交表单,其中 “test” 是指 form 名单。
如果受害者访问上述包含 exploit.html 的 http://dwz.date/d74a ,就会发起以下请求:
在这里插入图片描述

上述的利用方式主要介绍的是 POST 类型的利用手法。

JSON 劫持攻击

JSON(JavaScript Object Notation,JavaScript 对象符号)是一种可以序列化任意数据,并能被 JavaScript 注释器直接处理的简单数据交换格式。我们来看一段 JSON 格式的包含用户信息的数据:

{ 
  "people":[ 
    {
      "name": "Brett",
      "email":"Brett@qq.com"
    },
    {
      "name":"Jason",
      "Jason@qqx.com"
    }
  ]
}

JSON 劫持是一种特殊的 CSRF 攻击方式,本质上也是未对请求来源做有效校验导致的,它主要是用来窃取服务器返回的敏感信息。
实现 JSON 劫持主要有两种攻击方式:覆写数据构造器和执行回调函数。

覆写数据构造器

若服务端返回的 JSON 数据中包含一个序列化数组,那攻击者就可以重定义数组构造器,以实现 JSON 数据的访问。比如 2006 年的 Gmail 就曾出现过 JSON 劫持联系人列表的漏洞,漏洞 CGI 位于:
http://mail.google.com/mail/?url_scrubbed

它会返回联系人列表的 JSON 数据。
[[“ct”,“Your Name”,“foo@gmail.com”], [“ct”,“Another Name”,“bar@gmail.com”] ]

因此,可通过覆盖数组构造器来读取 JSON 数据。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从以上代码中我们可以总结整个攻击流程:

 - 通过<script>加载目标 JSON 对象到页面中;
 - 覆写 Array 对象,并设置数组元素的 setter 为 getNext 函数,有时也可以使用Object.prototype.__defineSetter__来覆盖 setter;
 - getNext 函数读取包含联系人信息的 JSON 信息。

执行回调函数

不同域名之间传递数据时,无法通过 JavaScript 直接跨域访问,因此需要在访问脚本的请求中指定一个回调函数,用于处理 JSON 数据。正因如此,攻击者也可以利用它来劫持其他域返回的数据。这种攻击方式是当前 JSON 劫持中最为常见的方式。
以前的 QQ 网购就曾出现过这种 JSON 劫持漏洞,其利用代码如下:

<html>
<body>
<script>
  function any(obj){
    alert(obj);	
  }
</script>
<script src='http://act.buy.qq.com/w/newbie/queryisnew?callback=any' ></script>
</body>
</html>

通过 callback 参数指定返回数据的处理函数 any,在 any 函数中,你可以根据 JSON 数据内容执行特定的处理,获取你想要的数据然后回传到自己控制的服务器上。
CSRF 检测方法:
通过前面对 CSRF 原理的讲解,测试思路就很容易了:

  1. 抓包记录正常的 HTTP 请求;
  2. 分析 HTTP 请求参数是否可预测,以及相应的用途;
  3. 去掉或更改 referer 为第三方站点,然后重放请求;
  4. 判断是否达到与正常请求的同等效果,若是则可能存在 CSRF 漏洞,反之则不存在。

自动化的测试思路也是一样的实现方法,只不过很多时候不知道请求参数的实际用途,比较难评估其危害和价值。正如前面所说的,CSRF 的危害取决于参数用途,这也导致很多时候需要人工验证,不然很容易误报。我个人认为,目前没有特别好的自动化 CSRF 检测工具,大多是一些半自动的辅助类工具,比如 BurpSuite 上的 CSRF PoC 生成功能。

防御 CSRF

防御 CSRF 的关键思路就是令请求参数不可预测,所以常用的方法就是在敏感操作请求上使用 POST 代替 GET,然后添加验证码或 Token 进行验证。
这里不推荐 referer(即请求头中的来源地址)限制方法,因为通过 javascript:// 伪协议就能以空 referer 的形式发起请求,很容易绕过限制。如果你直接禁止空 referer,一些移动 App 上的请求又可能无法完成,因为移动 App 上的 http/https 请求经常是空 referer。

验证码

在一些重要的敏感操作上设置验证码(短信、图片等等),比如更改密码(此场景下也可要求输入原密码,这也是不可预测值)、修改个人资料等操作时。

Token 验证

对于 CSRF 的防御,Token 验证无疑是最常用的方法,它对用户是无感知的,体验上比验证码好太多了。
在提交的表单中,添加一个隐藏的 Token,其值必须是保证不可预测的随机数,否则没有防御效果。下面是服务器生成并返回给当前用户的:

提交表单后,会连同此 Token 一并提交,由服务器再做比对校验。
生成 Csrf Token 的算法,常常会取登录后 cookie 中的某值作为输入,然后采用一些加密/哈希算法生成,这也是为了方便后台校验和区分用户。
除了 Cookie Token,还可以使用伪随机值的 Session Token,即服务端生成一个伪随机数,存储到 $_SESSION 中,然后返回给用户的页面中隐藏此 Token;等用户提交后,再拿它与存储在 $_SESSION 的 Token 值比较。这是当前比较常用的 Token 生成与校验方式。

总结下,先由服务端生成随机数作为 Token,然后存储到 Session 中,不一定都非要存储到 Cookie 中,然后在返回给用户的表单中插入隐藏的 Token,用户提交后,由服务器来比对提交的 Token 与 Session 中的 Token 是否一致,以此判断请求是否合法。

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

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

相关文章

ImmunoChemistry艾美捷自噬试验,红色解决方案

ImmunoChemistry艾美捷ICT的自噬测定&#xff0c;红色使研究人员能够检测和监测活细胞中自噬的体外发育。自噬探针是细胞渗透性的&#xff0c;插入自噬体和自溶体的脂质膜时发出红色荧光。可以使用流式细胞仪读取结果。 自噬是一种保守的溶酶体循环过程&#xff0c;细胞通过该过…

Linux——文件描述符(fd)与重定向、dup/dup2

目录 一.文件描述符 &#xff08;一&#xff09;.含义 &#xff08;二&#xff09;.使用 &#xff08;三&#xff09;.标准输入/输出/错误 二.重定向与dup/dup2 &#xff08;一&#xff09;.dup/dup2 &#xff08;二&#xff09;.重定向 一.文件描述符 &#xff08;一…

MCE | 淀粉样蛋白沉积或是阿尔茨海默症发展“驱动者”

近日&#xff0c;Cell 在线发表的论文 “Spatial Transcriptomics and In Situ Sequencing to Study Alzheimer’s Disease” 中&#xff0c;研究团队在 AD 小鼠模型中&#xff0c;利用空间转录组学研究淀粉样斑块周围直径 100 μm 的组织结构域的转录变化&#xff0c;证明了丰…

Web(二)html5基础-文档头部(知识训练和编程训练)

web知识训练_html5_文档头部标签及属性 web编程训练_html5_文档头部 第1关_页面标题及字符集的设置 <!DOCTYPE html> <html> <head><!-- ********* Begin ********* --><meta charset"utf-8"><title>设置标题</title>&…

《传统文化典藏馆》前端模板

一个基于多种插件的前端二次开发——弘扬中华传统文化的前端模板&#xff0c;内容丰富&#xff0c;可做学习前端技术使用。 主要技术实现&#xff1a;HTML、CSS、JavaScript 下载链接&#xff1a; 弘扬中华传统文化前端模板-Javascript文档类资源-CSDN下载《传统文化典藏馆》…

图像分割 - 分水岭算法

目录 1. 介绍 2. 分水岭算法的实现 距离变换 连接连通分量 3. 代码 1. 介绍 图像是由x&#xff0c;y表示的&#xff0c;如果将灰度值也考虑进去的话&#xff0c;那么一幅图像需要一个三维的空间去表示。 这样就可以把x&#xff0c;y轴比作大地&#xff0c;将灰度值的z轴…

产品流程图设计

一个产品设计之初&#xff0c;必先从流程图做起&#xff0c;流程图可以用来表达产品各式各样的流程&#xff0c;好的流程图&#xff0c;可以快速让整个团队熟悉理解业务&#xff0c;并优化业务。 一、常用的流程图图标含义 流程图通常由起止框、处理框、流程线、判断框、输出输…

使用HTML制作静态网站 中国传统文化 丝绸之路 (学生网页设计作业源码)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

HummerRisk V0.5.2:升级对象存储、云检测、云审计和K8s资源态势等

HummerRisk V0.5.2发布&#xff1a;对象存储增加风险检测和操作、云检测支持七牛云、操作审计支持 AWS&#xff0c;提升 K8s 资源态势&#xff0c;并支持在线/离线升级漏洞库。 感谢社区中小伙伴们的反馈&#xff0c;你们的认可是我们前进的动力。 HummerRisk 保持高速的迭代…

Web App、Hybrid App、Native App 横向对比

移动端的开发方式三分天下&#xff1a;纯原生&#xff08;Native App&#xff09;、混合开发&#xff08;Hybird App&#xff09;、网页应用&#xff08;Web App&#xff09;。 纯原生&#xff08;Native App&#xff09;&#xff1a;是在 Android、iOS 等移动平台上利用提供的…

2023第三届中国数字化人才国际峰会

会议背景 中商产业研究院预测&#xff0c;2022年我国数字经济规模将增至48.9万亿元&#xff0c;数字经济在GDP中的比重将超过40%。随着中国经济数字化转型不断深入的同时&#xff0c;数字化人才缺口却近1100万。中国信息通信研究院发布的《数字经济就业影响研究报告》指出&…

数学统计:均值、标准差、方差、协方差

均值:均值描述的是样本集合的中间点,它告诉我们的信息是很有限的。 标准差:标准差给我们描述的则是样本集合的各个样本点到均值的距离之平均。以这两个集合为例,[0,8,12,20]和[8,9,11,12],两个集合的均值都是10,但显然两个集合差别是很大的,计算两者的标准差,前…

蓝牙运动耳机什么品牌性价比高,六款值得推荐的运动耳机分享

音乐是运动健身的伴侣&#xff0c;两者合在一起就能让运动变得更加有劲。运动耳机怎么选&#xff0c;想要找到一款不错的运动耳机&#xff0c;首先一定要牢固舒适&#xff0c;其次防水性能越高越好&#xff0c;最后音质偏低音&#xff0c;如果在户外跑步的话&#xff0c;放着大…

Android App开发网络通信中使用okhttp下载和上传图片、文件讲解及实战(超详细实现用户注册信息上传 附源码)

需要源码请点赞关注收藏后评论区留言并且私信~~~ 一、使用okhttp下载图片 okhttp不但简化了HTTP接口的调用过程&#xff0c;连下载文件都变得简单了&#xff0c;对于一般的文件下载&#xff0c;按照常规的GET方式调用流程&#xff0c;只要重写回调方法onResponse&#xff0c;在…

C++:指针:void*指针(跳跃力未定的指针)

先分享一段代码&#xff0c;觉得很有意思 #include<iostream> void* say_hello(void* args){std::cout<< "Hello world"<< std::endl;return 0; } 上面这段代码&#xff0c;我们看到函数的返回值类型竟然是 void* ,形参也是 void* &#xff0c…

限时开源,一份“扭转乾坤”的与时俱进的1700页Java八股文

今天在某客看到一个程序员自述&#xff0c;内容如下&#xff1a; 人到三十&#xff0c;公司效益不好被裁员&#xff0c;两个月时间面了三十几家&#xff0c;一直不是很顺利&#xff0c;面试问八股&#xff0c;根本答不上来。前期不信邪&#xff0c;正常投简历正常面试&#xf…

如何借助现有股票量化交易平台编写策略和回测分析

每个交易日的股票都会上涨或者下跌&#xff0c;在这个过程中笔者们偶尔会想针对部分股票进行股价的涨跌幅进行监控&#xff0c;或者自动进行交易&#xff0c;在这个需求前提下&#xff0c;现有券商、股票分析软件都会带有机器人自动交易策略功能&#xff0c;大部分都需要收费或…

web网页大作业——基于HTML+CSS+JavaScript制作摄影之家网站

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

OAuth2 的授权流程

文章目录&#x1f4d6; OAuth2 的授权流程&#x1f4d1; 参与的角色&#x1f4d1; 授权流程&#x1f4d1; 授权许可 Authorization Grant&#x1f4d1; 直白话 OAuth2 流程&#x1f4d6; OAuth2 的授权流程 &#x1f4d1; 参与的角色 1️⃣ Resource Owner资源所有者&#xf…

如何监听电脑屏幕是否发生切换

目录 1.屏幕监听的原理&#xff1a; 2.创建项目 3.离开计时 1.屏幕监听的原理&#xff1a; 为什么可以监听浏览器窗口的切换呢&#xff1f;那就是利用了浏览器的visibilitychange属性&#xff0c;MDN的介绍对visibilitychnge的介绍是&#xff1a; 当其选项卡的内容变得可见或…