概念
CSRF全称(Cross-site request forgery)跨站请求伪造,CSRF通过伪装成受信任用户的请求来利用受信任的网站,从而执行受害者非本意的操作,相对于XSS漏洞来说CSRF漏洞更具有危险性。
准备实战环境
我们先将安全等级调成low,进入CSRF界面,它是一个常见的密码修改功能:
先进行正常操作,输入新密码 hacker 确认后密码修改成功。
返回到登录页面验证下,输入用户名admin,密码hacker,点击提交
成功登录,我们知道在提交新密码时,浏览器向服务端会提交一个表单,发送一个数据包,我们用burpsuite抓包分析下
我们向浏览器提交的表单分别是password_ new 跟 password_conf,change,由此可见攻击者的原始思路是修改这几个参数的值构造url链接http://192.168.0.135/DVWA-master/vulnerabilities/csrf/?password_new=hacker&password_conf=hacker&change=change# 发给受害者,受害者点击之后密码就会被修改。但是一般受害者看到这样的链接是不会点的,攻击者往往会伪造,将这个链接包装一下。包装的过程其实就是重新构造HTML。方法如下,将url放到hackbar中分割url:
然后构造HTML表单,代码如下:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>csrf漏洞</title>
</head>
<body>
<form action="http://192.168.0.135/DVWA-master/vulnerabilities/csrf/">
<input type="hidden" name="password_new" value="hacker" />
<input type="hidden" name="password_conf" value="hacker" />
<input type="hidden" name="Change" value="change" />
<input type="submit" value="美女图片下载"/>
</form>
</body>
</html>
将生成的HTML文件放到phpstudy的根目录下;
为了区分跟dvwa的区别我们把链接写成http://127.0.0.1/csrf.html,访问下;
当受害者点击后相当于向dvwa发送数据包:
直接将密码修改成hacker了,这个时候就算受害者发现了也已经晚了,攻击者已经可以用以hacker为密码的账号登陆了。
我们把等级调成medium,我们尝试low等级的方法点击图片,跳转到dvwa界面出现了一行提示:我们继续抓包分析:首先试下手工输入是成功的查看下数据包:
接着试下low等级失败的提交方式,查看数据包:
通过对比发现两个数据包最大的不同在于referer这一行,我们在失败的数据包中添加referer,将正确数据包的referer加上,提交下,发现密码修改成功,经过不断缩减referer中url参数并不断尝试,发现referer参数只要包含host即可提交成功。我们验证下:
我们知道referer这个参数总是跟链接一模一样的。解决方法如下:在文件夹后面构造一个与host相同的文件夹将csrf.html放进去:
这样链接中就包含host字段了,验证访问刚才的链接并点击图片:
成功了
进入high等级的CSRF攻击:对比medium等级的url跟high等级的url,在hackbar中清楚地看到high等级的数据包中多了如图所示的参数:
而且每次修改密码它都是在变化的。它是来源于上一个响应包的内容,使用low等级跟medium等级的方法都失效了:
它提示usertoken不正确,如果页面存在xss漏洞的话,我们就可以读取其中的usertoken的值,很显然受害者是当前用户,但攻击者不是当前用户,攻击者无法知道上一个请求的usertoken的值,因此这个地方是无解的。
进入impossible等级:
它提示了要输入原始密码,这就保证了当前用户一定是本人,有效的确保了CSRF攻击,现在市场上大部分都是用的这个模块。
漏洞修复:
根据medium等级方法是可以校验referer,但校验不完全,只校验了是否包含域名,可以存在绕过。
high等级:是随机token值,这个是有效方法,如果不存在xss漏洞的话是相当安全的
最后一个是验证码,比较暴力但是确实有效。