zoukankan      html  css  js  c++  java
  • 一文带你学会CSRF漏洞

    CSRF简介

    CSRF全名为Cross site Request Forgery,也称跨站请求伪造。

    简而言之,CSRF攻击就是攻击者诱骗受害者在不知情的情况下发起某些恶意请求,该请求可以是转账,或者是用受害者的身份发信息,改密码等一系列敏感操作。

    CSRF原理

    先来看下面这个例子(采用pikachu靶场做示例)

    登陆后查看个人信息

    点击修改个人信息后点击提交

    抓包则会发现一条vincex向服务器发起修改个人信息得请求

    服务器接受请求后vince得个人信息即修改完成

    那该应用修改个人信息流程即可分为以下两步:

    • 1.登陆系统

    • 2.像服务器发起修改个人信息得请求,实则就是通过csrf_get_edit.php脚本修改个人信息

    csrf_get_edit.php?sex=test&phonenum=110&add=test&email=test&submit=submit

    当我们构造恶意连接,即伪造上述请求,诱骗受害者在登陆后点击,那就把受害者个人信息修改为我们伪造得信息了。

    比如构造以下链接

    http://192.168.88.130/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=hack&phonenum=chak&add=hack&email=hack&submit=submit

    诱骗vince在登陆后点击,vince点击后他的个人信息遭到恶意修改

    就如上面这个例子,Csrf就是攻击者伪造请求,让受害者以受害者的身份去通过该请求执行一些敏感操作。这些敏感操作可能还包括有修改密码,转账等等

    CSRF攻击

    CSRF攻击最重要的两个条件:

    1.需要受害者登陆

    2.受害者点击我们构造的恶意链接或者是恶意页面

    一般CSRF攻击可分为GET和POST两种,其原理都一样,只不过请求方式不同

    GET

    GET请求除了可以让受害者点击恶意链接以外,还可以让他访问我们写好的恶意页面,在页面中用标签进行自动访问我们伪造的请求。这样也实现了让受害者带cookie发出恶意请求的目的。

    还是刚才的修改个人信息页面,我们构造一html,其代码如下

    <img src=http://192.168.88.130/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=boy&phonenum=attack&add=attack&email=attack&submit=submit />
    

    我们将其放在服务器上,然后让受害这访问该页面

    http://127.0.0.1:8081/1.html

    可以看到当访问这个页面的时候只看到了一张无法加载的图片,但是实际上自己的信息已经被悄然修改了。

    POST

    现在请求方式变为POST

    此时我们首先应该修改为get请求方式,看对方服务器是否未区分两种请求方式,例如PHP脚本采用request接收参数就不会区分POST与GET.

    如果服务器区分POST与GET那我们可构造一个表单诱骗受害这点击,或者直接利用js自动请求。再用pikachu靶场实例。

    构造以下脚本

    <form id="myForm" action="http://192.168.88.130/pikachu/vul/csrf/csrfpost/csrf_post_edit.php" method="post">
    <input type="text" name="sex" value="postcsrf" >
    <input type="text" name="phonenum" value="postcsrf" >
    <input type="text" name="add" value="postcsrf" >
    <input type="text" name="email" value="postcsrf" >
    </form>
    
    <script>
    window.onload = function(){
    document.getElementById("myForm").submit();
    }
    </script>
    

    然后让受害者访问即可自动发起伪造的POST请求

    比较头痛的是这个html脚本在POST的参数中有submit时,js无法执行,好像是因为重名问题,暂未找到解决办法。但是其他解决方法还有很多种,比如用PHP的CURL

    浏览器cookie策略

    有时候服务端会验证session和本地cookie,但是有的浏览器不允许跨域(可理解为域名)发送本地cookie,比如IE浏览器。但是有的浏览器不会拦截,比如 Firefox2,Firefox3,Opera,Chrome,Android

    CSRF防御

    验证码

    referre检测

    参数加密

    添加token参数

  • 相关阅读:
    python操作elasticsearch
    php源码的编译
    linux 访问windows 共享文件
    list容器排除重复单词的程序
    求组合数m_n
    简单堆排序
    快速排序
    判断点在直线左侧或者右侧
    求取点到直线的距离
    求给定三个点的夹角
  • 原文地址:https://www.cnblogs.com/tlbjiayou/p/13887475.html
Copyright © 2011-2022 走看看