美文网首页
[渗透测试]CSRF相关

[渗透测试]CSRF相关

作者: yumiii_ | 来源:发表于2020-02-29 20:46 被阅读0次

    懒得整理了,直接贴链接了。
    参考资料:
    讓我們來談談 CSRF

    CSRF

    CSRF,跨站请求伪造,也被称为one click attack或者session riding。
    XSS与CSRF区别:

    • XSS利用站点内的信任用户,盗取cookie
    • CSRF通过伪装成受信任用户请求受信任的网站

    原理

    利用目标用户的合法身份,以目标用户的名义执行某些非法操作
    例如,一个转账案例中,初始化链接为
    http://www.xxx.com/pay.php?user=xx&money=100
    构造恶意链接:
    http://www.xxx.com/pay.php?user=恶意用户&money=10000
    上述案例中,分析得知这个过程分为两个步骤,首先是会话验证,也就是服务端对cookie的验证,验证成功后,接受不了user和money两个值,并进行转账操作。因此CSRF成功利用的条件有两个:1.用户已经登陆系统。2.用户访问对应的URL。

    无防护的CSRF漏洞利用

    GET型CSRF代码分析


    对于上面这段代码,我们只需要构造GET型URL,提交username和password参数,以此来新建对应的用户名和密码。例如将下面的URL发给管理员,就会在数据库中新增一条数据:
    http://.../new_user.php?username=admin&passwpord=123123
    如果觉得这种链接过于明显,可以用前端img标签的src属性对其进行隐藏:
    <img src="http://..../new_user.php?username=admin&passwpord=123123">

    POST型CSRF代码分析


    攻击者可以通过开发者工具查看请求,得知传参的名字,以及这个请求是post类型,那么就可以构造一个如下的网页,当用户点击按钮时,即向数据库插入了一条新的用户数据

        <form action="http://..../new_user.php" method="post">
        <input type="hidden" name="username" value="admin_test">
        <input type="hidden" name="password" value="admin_test">
        <input type="hidden" name="sub" value="Ok">
        <input type="submit" name="test" value="我中奖了">
        </form>
    

    CSRF自动化探测

    手动探测

    手动探测原理在于探测web应用程序具有防止CSRF的措施。
    CSRF漏洞预防措施:

    • 二次验证:一般情况下需要js验证,是否执行成功取决于用户。
    • HTTP referer头
    • 是否设置token
    • HTTP自定义头

    如果web应用程序的HTTP请求中没有对应的预防措施,那么很大程度上就确定存在CSRF漏洞

    自动化探测工具

    CSRFTester原理:利用代理抓取在浏览器中访问过的所有链接以及所有的表单等信息,通过在CSRFTester中修改对应的表单等信息,重新提交,相当于以此伪造客户端请求,如果修改的测试请求成功被网站服务端接收,则说明存在CSRF漏洞。

    CSRF漏洞token防御

    CSRF漏洞实质:服务器无法准确判断当前请求是否是合法用户的自定义操作。如果服务器在用户登陆后给予用户一个唯一的合法令牌,每一次操作过程中,服务器都会验证令牌是否正确,如果正确执行操作,不正确不执行操作。一般情况下,给予的令牌会写入表单中隐藏域的value值中,随着表单内容进行提交。
    简单模型:登陆验证->登陆成功后,给予一个唯一的令牌。执行操作时,操作过程中验证令牌->成功再进行增删改查
    生成token代码:唯一。例如下面的PHP代码生成token。

    function generateToken(){
        $salt="test".date("h:i:s");
        $token=md5($salt);
        return $token
    }
    

    使用token进行CSRF漏洞防御:
    1.登陆验证成功后,在会话session["user_token"]中保存token
    2.在后台操作中,增删改查表单中增加隐藏域hidden,设置value为token
    3.提交之后进行验证token是否正确

    CSRF绕过referer技巧

    referer防御CSRF原理

    当用户点击被构造好的CSRF利用页面,那么在执行用户对应操作时,提交的HTTP请求中就有对应的referer值,此时服务器端判断referer值是否与服务器的域名信息有关,如果不相关则不执行操作。
    PHP referer防御代码编写
    是否包含了某个域名

    if(strpos($_SERVER['HTTP_REFERER'],'xx.com')!==false){
        判断成功 
    }
    else{
        判断失败
    }
    

    绕过referer技巧
    如果服务端只判断当前的referer中是否具有域名,那么直接可以在站点目录下新建文件夹进行绕过,文件夹的名字为判断的域名或者ip地址。

    GET型CSRF漏洞利用方法

    链接利用:同上文提到的get型CSRF
    iframe利用:iframe标签内容将在页面家在过程中自动进行加载,src指向的位置就是页面请求的位置。可以设置iframe的style->display:none,以此来不显示iframe加载的内容,类似于a标签里的href
    img标签利用:img标签的内容会随着页面的加载而被请求,以此src指向的位置会在页面家在过程中进行请求
    css-background利用:利用css中background样式中的url来加载远程机器上的内容,从而对url中的内容发送http请求

    防范

    客户端防范:对于数据库的修改请求,全部使用POST提交,禁止使用GET请求。
    服务器端防范:一般的做法是在表单里面添加一段隐藏的唯一的token(请求令牌)。
    验证码验证这种只能作为一个辅助手段,像是二次验证一样。

    相关文章

      网友评论

          本文标题:[渗透测试]CSRF相关

          本文链接:https://www.haomeiwen.com/subject/eudvhhtx.html