DVWA学习记录系列(四)SCRF 跨站伪造请求模块

提示:本文主要针对于SCRF 跨站伪造请求全等级的分析以及相应的破解。


前言

      本次主要针对于DVWA当中的跨站伪造请求模块进行学习。主要进行的是dvwa的low、medium、high级别进行破解,由于impossible模块难度过高所以都将不进行impossible的实验。本次CSRF的high级别将会放至之后的存储xss漏洞中进行讲解。


一、CSRF是什么?

      CSRF,全称Cross-site request forgery,翻译过来就是跨站请求伪造,是指利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害者的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作(如转账、改密等)。CSRF与XSS最大的区别就在于,CSRF并没有盗取cookie而是直接利用。

如图展示:
在这里插入图片描述 CSRF攻击实例


      受害者 Bob 在银行有一笔存款,通过对银行的网站发送请求 http://bank.example/withdraw?account=bob&amount=1000000&for=bob2 可以使 Bob 把 1000000 的存款转到 bob2 的账号下。通常情况下,该请求发送到网站后,服务器会先验证该请求是否来自一个合法的 session,并且该 session 的用户 Bob 已经成功登陆.

      黑客 Mallory 自己在该银行也有账户,他知道上文中的 URL 可以把钱进行转帐操作。Mallory 可以自己发送一个请求给银行:http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory。但是这个请求来自 Mallory 而非 Bob,他不能通过安全认证,因此该请求不会起作用。

       这时,Mallory 想到使用 CSRF 的攻击方式,他先自己做一个网站,在网站中放入如下代码: src=”http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory ”,并且通过广告等诱使 Bob 来访问他的网站。当 Bob 访问该网站时,上述 url 就会从 Bob 的浏览器发向银行,而这个请求会附带 Bob 浏览器中的 cookie 一起发向银行服务器。大多数情况下,该请求会失败,因为他要求 Bob 的认证信息。但是,如果 Bob 当时恰巧刚访问他的银行后不久,他的浏览器与银行网站之间的 session 尚未过期,浏览器的 cookie 之中含有 Bob 的认证信息。这时,悲剧发生了,这个 url 请求就会得到响应,钱将从 Bob 的账号转移到 Mallory 的账号,而 Bob 当时毫不知情。等以后 Bob 发现账户钱少了,即使他去银行查询日志,他也只能发现确实有一个来自于他本人的合法请求转移了资金,没有任何被攻击的痕迹。而 Mallory 则可以拿到钱后逍遥法外。


二、实验注意事项及准备

1)由于CSRF是利用受害者尚未失效的身份认证信息,因此所有实验步骤必须在同一浏览器中完成,以确保获得的cookie值一致。

2)Referer的基础知识:
       是HTTP header的一部分,即是http头部中的一个信息,它表示一个来源。例如:在www.google.com中有一个www.baidu.com的链接,则点击该链接后,会发送一个包,包里包含的Referer值为:www.google.com。
空Referer情况:
     &nbsp即表示referer的值为空或不存在referer.因为referer的作用是指示一个请求从哪个链接过来的;所以,当一个请求不由链接的触发的,自然也无需要指定请求的来源。

3)注意如果,使用代码后跳转至登录页面或未修改成功的话,需要对代码中的URL进行更新,即将页面新请求的URL复制到代码中。

三、实验步骤

1.low级别

       1. 源代码分析:
在这里插入图片描述

      由上图可知,在DVWA中的csrf模块里主要是针对于改密。且low级别中并无什么防范措施。

  1. 实验开始:
           1)首先,在DVWA中调解难度,而后选中CSRF模块,在对应的输入框中任意输入一些信息并点击change,而后便可复制搜索框中的URL去构造一个恶意的链接。(该链接是由该网站的修改密码处的URL构成。)在这里插入图片描述
    复制的URL如下:
http://127.0.0.1/DVWA-master/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change#

      上述的URL中在“password_new=”后的内容为你自己想要修改密码的内容;“password_conf=”后的内容为确认修改密码的内容。
      在复制以及修改完成该恶意URL后只要在同一浏览器中点击了修改后的URL便可以直接利用CSRF进行修改密码了。
在这里插入图片描述如图所示,输入URL后页面显示了密码已被修改。
      当然直接使用这个网址会显得很长,因此我们可使用缩短网址对其进行缩短
在这里插入图片描述       我们所构造的这个恶意URL在完成请求后,会跳转至修改完成的页面在实际应用中会让被攻击者轻易的发现自己的密码已被修改。因此可使用html代码1对其进行掩盖;又由于我们在修改完成后的数据会直接显示在URL中,因此可使用html代码2,利用post请求进行掩盖。
代码1:

<html>
     <head>
     </head>
            <body>
               <img src="http://127.0.0.1/dvwa-master/vulnerabilities/csrf/?password_new=1234&password_conf=1234&Change=Change#"  border="0"  style="display:none;" />
             <h1>404<h1>
             <h2>file not found.<h2>
            </body>
</html>

效果如下:
在这里插入图片描述
此时可登出dvwa,发现默认密码已被修改。

在这里插入图片描述
代码2:

<html>
  <!-- CSRF PoC - generated by Burp Suite Professional -->
  <body>
  <script>history.pushState('', '', '/')</script>
    <form action="http://127.0.0.1/dvwa-master/vulnerabilities/csrf/">
      <input type="hidden" name="password&#95;new" value="password" />
      <input type="hidden" name="password&#95;conf" value="password" />
      <input type="hidden" name="Change" value="Change" />
      <input type="submit" value="Submit request" />
    </form>
  </body>
</html>

效果如下:
在这里插入图片描述
点击submit后:

在这里插入图片描述
      进阶版:我们可以使用图片里包含着超链接,来进行伪装,使得其更具有诱惑性。
代码如下:

 <!DOCTYPE html>
<html>
<body>
    <a href="http://127.0.0.1/dvwa-master/vulnerabilities/csrf/?password_new=admin&password_conf=admin&Change=Change#">
    <img src="http://127.0.0.1/csrfgjxy.jpg" border="0" width="220" height="100">
</a> 
</body> 
</html>
/*href后的内容为恶意链接;
src后的内容为图片存在的根路径。*/

效果图如下:
在这里插入图片描述点击图片后,便可直接进行修改…
2)使用burp:
      将修改密码的页面截断(截断的是要点击了change后的页面),并右击burp的空白处,选择Engagment tools,选择其中的Generate CSRFPOC。在这里插入图片描述       下图中:上半部分是包的内容,可在params中对密码修改;下半部分是其burp自动生产的html代码,也可直接在html代码中对password进行修改,在value后修改。

      细心的同学可能发现了,burp生成的HTML代码和我们上诉的代码2类似。

在这里插入图片描述       点击Test In Browser,复制生成的URL,并在浏览器中打开即可。

2.medium级别

1)代码分析:
在这里插入图片描述       注意上图画线的地方:stripos()函数的作用是查找字符串在另一字符串第一次出现的位置(不区分大小写),如未找到则返回false。
      本代码中的过滤规则是http的referer参数值中必须包含server_name即主机名。并利用stripos进行匹配验证,从而使得一部分的CSRF无法正常执行。

2)破解的方法1:

      当我们在浏览器中访问我们构建的恶意代码前,开启burp截断进行拦截,并对其进行与正常情况的包进行比较。如图:
正常情况的包:在这里插入图片描述恶意链接申请的包:
在这里插入图片描述       对比可知恶意链接的包确实没有referer的值,因此代码会返回false。
      由代码可以知道,我们恶意链接不成功的原因是因为请求的包中的referer值没有包含着server_name。因此我们可以直接对包进行修改。

在这里插入图片描述       由上图可知,自行添加referer值后在发送的话,是能够进行修改成功的。

在这里插入图片描述       由以上两图可以看出,只要referer中包含有其server_name就可以进行修改。

3)破解的方法2:

      将之前制作的HTML代码放入对方服务器中,并诱导对方访问了也可进行CSRF的利用。
代码放入服务器图:
在这里插入图片描述而后在同一浏览器中进行访问:
在这里插入图片描述此时以及修改成功:
在这里插入图片描述可自行登出,看密码是否修改。
      注:存放的HTML代码必须是要有链接进行跳转的,只能使用之前所诉的代码2、3.。

3.high级别

代码分析:
在这里插入图片描述       添加了token值,防止了csrf进行跨域的请求,很大程度防范了csrf的攻击。
      若对方服务器存在存储XSS漏洞,则可用其获取token值,并利用它进行CSRF利用。

4.imposs级别

代码如下:
在这里插入图片描述       添加了token机制;添加了要求用户要输入当前密码的机制;添加了PDO防止sql注入。

5.补充(针对于high级别)

      在前文中已经分析过在high级别中主要是添加了token值,那么想要进行破解肯定要着手于token值进行展开,下面我们先来分析一下token。

      1)token是由服务器产生的随机数;

      2)用户每次发送的请求包里都会含带着token值,且服务器会与请求包的token值进行比较验证;

      3)服务器所发送的响应包中会含带下一次的token值;

      4)分析此时的URL可知,此时的URL中多出来了user_token值的内容。

      因此我设想着是否可以利用burp拦截掉响应包,从中提取出下一次的token值,并附加在新的恶意URL中,下面我将对我的猜想进行记录。

      1)打开burp,开启截断,并在proxy中的options里找到server response的模块,将上下两条语句勾选上,且在选项框中,将内容为“ request was intercepted”的“or”改成“and”并勾选。

在这里插入图片描述
      2)此时,在dvwa的csrf页面中点击change,并在burp中使其通过,而后便可看到发送过来的response包,并找到新的token值并复制。

在这里插入图片描述
      3)在burp中通过该包,而后在浏览器的搜索框中,把对应的token值修改成最新的token值,并按照自己的意愿对密码进行修改。

在这里插入图片描述
      4)此时,有效的新的恶意链接便已构造完成。

      注:在我看来,该方法虽然可以有效的对high级别进行破解,但对于实际应用却有着较高的局限性。

总结

防范措施:
      1、为防止CSRF,可加入Anti-Csrf,使得每次都向客户端发送一个随机数,当客户端向服务器发送数据时,比对随机数以此来确定客户端的身份。
      2、获取当前用户密码,以此来判断是否是当前用户的操作,而非CSRF。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值