1.什么是CSRF

CSRF全称Cross-Site Request Forgery,也被称为 one-click attack 或者 session riding,即跨站请求伪造攻击。

当发现网站存在CSRF漏洞时,攻击者会利用网站源码,构建一个存有恶意请求的网站或者是链接,引诱受害者访问,那么当受害者在访问攻击者伪造的网站,同时,又在访问攻击者攻击的目标网站且没有关闭会话,那么攻击者就成功完成了CSRF攻击!

攻击者可以发送请求包,比如:修改邮箱的,上传文件的等等。与XSS不同的是,CSRF只是利用cookie,而不是窃取cookie。

CSRF的高危触发点
论坛交流,用户中心,反馈留言,交易管理,后台管理

2.原理

广义的理解
游览器在你不知道的情况下偷偷的发送了数据包。
核心在于游览器你的cookie得到了游览器的信任,然后通过Ajax异步传输获取信息(通过JS发送了带有恶意代码的请求包)!

狭义的理解
1、受害者打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;

2、在受害者信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时受害者登录网站A成功,可以正常发送请求到网站A;

3、受害者未退出网站A之前,在同一浏览器中请求了攻击者的B网站

4、网站B接收到受害者请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;

5、浏览器在接收到这些攻击性代码后,根据网站B的请求,在受害者不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据受害者的Cookie信息以受害者的权限处理该请求,导致来自网站B的恶意代码被执行。

3.CSRF的分类

A.GET型
我们有的时候会遇到数据修改是通过GET请求来发送的,比如:
/news/index.php?id=1&&email=666@qq.com
此链接是用户id=1将邮箱修改666@qq.com,当我们知道CSRF之后,可以伪造邮箱修改为777@qq.com的链接发送给用户,当用户游览此网页时,点击了链接,邮箱就成功被修改了。这样我们就可以利用邮箱来修改用户的密码。
B.POST型
假如一个网站的用户密码修改功能存在CSRF,我们可以通过修改密码时抓包,伪造一个相同的数据包,发给正在访问密码修改功能的用户,当用户访问链接时,写入自动提交的JS代码,这样用户的密码将自动更改!
Burp可以帮助我们伪造数据包,例如:


JS自动提交的代码

<script>document.getElementByld('标签名').submit();
</script>

4.条件

a.用户已经登录了站点 A,并在本地记录了 cookie;

b.在用户没有登出站点 A 的情况下(也就是 cookie 生效的情况下),访问了恶意攻击者提供的引诱危险站点 B (B 站点要求访问站点A);

c.站点 A 没有做任何 CSRF 防御;

5.CSRF检测方法

a.抓取一个正常请求的数据包,如果没有Referer字段和token,那么极有可能存在CSRF漏洞;

b.如果有Referer字段,但是去掉Referer字段后再重新提交,如果该提交还有效,那么基本上可以确定存在CSRF漏洞;

c.利用工具进行CSRF检测。如:CSRF TESTER,CSRF REQUEST BUILDER等;

6.防御方法

a.验证HTTP Referer字段

HTTP请求头中的referer字段记录了请求来源的地址,可以验证请求来源是用户自己,还是黑客!因为黑客构造的拦截或者是网站,用户访问后产生的数据包里的Referer肯定是指向黑客的!

b.在请求地址中添加 token 并验证(Anti-CSRF token)

CSRF攻击主要是黑客伪造了网站相似的链接或者是页面,只要在数据包中加入让黑客无法运算出的随机值,并且每次接收时都要验证该值,即可抵制黑客伪造的数据包!

该方法有一个缺点是难以保证 token 本身的安全。特别是在一些论坛之类支持用户自己发表内容的网站,黑客可以在上面发布自己个人网站的地址。由于系统也会在这个地址后面加上 token,黑客可以在自己的网站上得到这个 token,并马上就可以发动 CSRF 攻击。为了避免这一点,系统可以在添加 token 的时候增加一个判断,如果这个链接是链到自己本站的,就在后面添加 token,如果是通向外网则不加。不过,即使这个 csrftoken 不以参数的形式附加在请求之中,黑客的网站也同样可以通过 Referer 来得到这个 token 值以发动 CSRF 攻击。这也是一些用户喜欢手动关闭浏览器 Referer 功能的原因。

c.在 HTTP 头中自定义属性并验证

这种方法也是使用 token 并进行验证,和上一种方法不同的是,这里并不是把 token 以参数的形式置于 HTTP 请求之中,而是把它放到 HTTP 头中自定义的属性里。通过 XMLHttpRequest 这个类,可以一次性给所有该类请求加上 CSRFToken 这个 HTTP 头属性,并把 token 值放入其中。这样解决了上种方法在请求中加入 token 的不便,同时,通过 XMLHttpRequest 请求的地址不会被记录到浏览器的地址栏,也不用担心 token 会透过 Referer 泄露到其他网站中去。

然而这种方法的局限性非常大。XMLHttpRequest 请求通常用于 Ajax 方法中对于页面局部的异步刷新,并非所有的请求都适合用这个类来发起,而且通过该类请求得到的页面不能被浏览器所记录下,从而进行前进,后退,刷新,收藏等操作,给用户带来不便。另外,对于没有进行 CSRF 防护的遗留系统来说,要采用这种方法来进行防护,要把所有请求都改为 XMLHttpRequest 请求,这样几乎是要重写整个网站,这代价无疑是不能接受的!

7.CSRF的危害

  • 伪造HTTP请求进行未授权操作
  • 篡改、盗取目标网站上的重要用户数据
  • 未经允许执行对用户名誉或者资产有害的操作,比如:散播不良信息、进行消费等
  • 如果通过使用社工等方式攻击网站管理员,会危害网站本身的安全性
  • 作为其他攻击向量的辅助攻击手法,比如配合反射性XSS打一套组合拳拿到cookie
  • 传播CSRF蠕虫

CSRF(跨站请求伪造)详解相关推荐

  1. CSRF(Cross-site request forgery)跨站请求伪造详解(好文章,美团技术团队)

    背景 随着互联网的高速发展,信息安全问题已经成为企业最为关注的焦点之一,而前端又是引发企业安全问题的高危据点.在移动互联网时代,前端人员除了传统的 XSS.CSRF 等安全问题之外,又时常遭遇网络劫持 ...

  2. CSRF(跨站请求伪造)漏洞

    CSRF(Cross-site request forgery) 跨站请求伪造,由客户端发起,是一种劫持受信任用户向服务器发送非预期请求的攻击方式,与XSS相似,但比XSS更难防范,常与XSS一起配合 ...

  3. Web框架之Django_09 重要组件(Django中间件、csrf跨站请求伪造)

    摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于 ...

  4. CSRF 跨站请求伪造 为什么b网站请求a网站的地址能带上a网站的cookie

    知道csrf后的问题:CSRF 跨站请求伪造 为什么b网站请求a网站的地址能带上a网站的cookie 答:script.image.iframe的src都不受同源策略的影响.

  5. 8中间件,csrf跨站请求伪造,auth模块

    昨日内容回顾  多对多三种创建方式   1.全自动    完全依赖于ManyToMany让django orm自动创建第三张表    优势:不需要你创建第三张表  自动创建    不足:第三张表扩展性 ...

  6. python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页)...

    python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页) 一.ajax登录示例 新建项目login_ajax 修改urls.py,增加路径 fro ...

  7. XSS跨站脚本攻击与CSRF跨站请求伪造攻击的学习总结。

    之前就了解过这方面的知识,但是没有系统地总结.今天在这总结一下,也让自己在接下来的面试有个清晰的概念. XSS跨站脚本攻击: xss 跨站脚本攻击(Cross Site Scripting),为了不和 ...

  8. XSS跨站脚本攻击与CSRF跨站请求伪造攻击的学习总结

    转载:https://blog.csdn.net/baidu_24024601/article/details/51957270 XSS跨站脚本攻击与CSRF跨站请求伪造攻击的学习总结. <di ...

  9. CSRF 跨站请求伪造攻击

    1.概念 全称是CSRF 跨站请求伪造攻击,攻击者利用用户已登陆的账号,诱导用户访问已构造好的恶意链接或页面,在用户不之情的情况下,做一些违反用户本意的一些违法操作. 同源策略:协议相同,域名相同,端 ...

最新文章

  1. python访问多个网站_Python多并发访问网站
  2. mongodb导入bson文件_Python爬虫进阶教程(七):MongoDB数据库
  3. 本人真实经历:面试了20家大厂之后,发现这样介绍项目经验,显得项目很牛逼!...
  4. visual studio无法更新_微软发布 VS Code Python 四月更新
  5. awk bc命令 linux_linux之awk命令(转载)
  6. 电脑故障维修:新手必看的修电脑技巧!
  7. 递归算法(二)-分治法
  8. lamp mysql大小限制_LAMP 调优之:MySQL 服务器调优
  9. jremind V0.1.3.0添加透明
  10. 转:c#委托事件实现窗体传值通信
  11. openstack mariadb服务启动不了_在CentOS8或者RHEL8系统上体验MariaDB
  12. bzoj 1072: [SCOI2007]排列perm(状压dp)
  13. RTX游戏本助你玩转一线游戏 畅快过大年
  14. 统计学怎么求加权指数_统计学课程作业(统计指数)
  15. 微软模拟飞行2020服务器多少内存,《微软模拟飞行2020》到底有多大?我们的硬盘装得下吗?...
  16. 白盒测试用例设计方法(语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖、路径覆盖、基本路径覆盖)
  17. 【Lintcode】507. Wiggle Sort II
  18. 高通骁龙450智能模块msm8953 android 4G
  19. java fuoco车架_为速度而生 JAVA Fuoco铝合金气动公路
  20. PROCESS_INFORMATION

热门文章

  1. openjudge 1.7.15 整理药名
  2. 亚马逊云科技 Build On 第二季物联网(AIoT)专场实验心得(附踩坑大全)
  3. VB.net小技巧——VB中利用TreeView控件和Box控件做知识备忘
  4. python多线程、多进程
  5. 为何穷人玩股票绝大多数会赔钱?
  6. Fred Chow 讲义--1
  7. 在即将欢度春节的日子里,七大姑八大姨们问我程序员是啥子,我应该怎么介绍?
  8. E签宝的接口对接PHP代码演示
  9. Laravel Database——查询构造器与语法编译器源码分析 (上)
  10. 怎么在微信里呼起手淘