说明
- 承接上文DVWA通关指南-Command-Injection(命令注入),本文对Cross Site Request Forgery (CSRF)(跨站请求伪造)进行实践
- 一般来说,攻击者通过伪造用户的浏览器的请求,向访问一个用户自己曾经认证访问过的网站发送出去,使目标网站接收并误以为是用户的真实操作而去执行命令
- 本次功能是对登录密码进行修改,修改后请用新密码登录DVWA
安全等级为LOW
源码分析
抓包查看,直接就是get请求,没有任何防护,如token验证
开始攻击
抓包发现,修改密码的url其实就是一个get请求,链接如下:http://ip/DVWA-2.0.1/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change
只要诱骗用户点击这个恶意链接,就会将在不知情的情况下将密码改为123456
我们使用Burpsuite中的PoC检测CSRF
- 拦截到请求后,点击行动-相关工具-CSRF PoC生成
- 点击 在浏览器中测试
- Burpsuite会自动创建一个站点,复制 URL
- 用复制的链接无法访问,改为如此就可以了
- 点击提交按钮
- 提交后,自动跳转url其实是修改密码的url,查看到提示密码修改成功,用新密码123456登录成功
我们可以伪装恶意代码
- 我们将构造的恶意链接伪装,放入index.html中
- 打开我的服务器中的httpd中的dvwa目录下,新建index.html
1 | [root@VM-24-13-centos DVWA-2.0.1]# pwd |
- 重启服务器
1 | [root@VM-24-13-centos DVWA-2.0.1]# service httpd restart |
- 访问刚刚编辑的index.html,查看请求发现发起 了修改密码
安全等级为:medium
分析源码
Medium级别的代码检查了保留变量 HTTP_REFERER(http包头的Referer参数的值,表示来源地址)中是否包含SERVER_NAME(http包头的Host参数,及要访问的主机名),希望通过这种机制抵御CSRF攻击。
使用安全等级为Low访问index.html的方式时,发送修改密码的请求,一直加载中最后响应302后,自动发送登录请求
开始攻击
- 漏洞利用过滤规则是http包头的Referer参数的值中必须包含主机名(这里是我服务器的ip)我们可以将攻击页面命名为XX.XX.XX.XX.php(XX是服务器的host,页面被放置在攻击者的服务器里)就可以绕过了
- 准备php文件,把密码修改成12345678
1 |
|
- 访问刚刚新增的host.php文件,发现修改密码修改成功了(用12345678登录成功),请求头部加入了Referer
安全等级为Hight
修改密码查看请求看下区别
源码分析
High级别的代码加入了Anti-CSRF token机制,用户每次访问改密页面时,服务器会返回一个随机的token,向服务器发起请求时,需要提交token参数,而服务器在收到请求时,会优先检查token,只有token正确,才会处理客户端的请求。
开始攻击
客户端访问攻击页面->攻击页面获取修改密码页面的token->将token和密码作为参数一起提交,攻击页面获取修改密码页面的token这一步属于跨域请求,浏览器已经禁止这么做了,所以想要完整这个操作,有两个思路:
- 第一, 将该js上传到服务器的目录下,这样就是同一个域了,不过如果可以这样,为啥不放木马呢?
- 第二, 利用xss,xss可以执行代码,获取token,xss更现实一点,但是也得需要该网站存在xss,所以单纯从这个修改密码页面,无法突破High漏洞,本此不坐实际,等到时候学到xss时,反过来再做实际
安全等级为impossible
这里让输入原密码,不清楚原密码的情况下,就无法进行CSRF攻击。
结合业务设计,修改密码必须提供原密码,保障安全。