1.什么是CSRF
用一个形象生动的比喻就是:
你给朋友的房子留下了备用钥匙,但是有人偷偷拿走了这把钥匙,然后用这把钥匙进入了你朋友的房子并做了各种坏事。你朋友以为只有你能使用这把钥匙,所以没对任何操作产生怀疑。
在这个比喻中:
- 你朋友的房子代表受攻击的网站。
- 备用钥匙代表用户的认证信息(比如cookie)。
- 你代表合法用户。
- 偷偷拿走钥匙的人代表攻击者。
- 进入房子并做坏事代表攻击者伪装成用户进行恶意操作。
其实就是在你不知情的情况下利用你的身份去干坏事。
官方定义:
CSRF(Cross-Site Request Forgery)漏洞是一种网络安全漏洞,攻击者可以利用该漏洞在用户不知情的情况下以其身份执行未经授权的操作。攻击者通过诱使用户访问恶意网站或点击恶意链接,来发起伪造的请求,从而利用用户当前登录的凭据执行一些操作,例如更改密码、发送资金等,而用户并不知情。
2.CSRF的前提条件
任何漏洞都有适用的前提条件:
1.CSRF必须在你与服务器正常会话的前提下才能进行攻击,毕竟CSRF是利用你的身份去干坏事,但是如果你都没有登录(没有身份)那就无从利用了。
2.需要目标站点或系统存在可以进行数据修改或新增操作的功能:
比如允许用户修改密码、更新购物地址、或添加新的后台管理账户等。
3.这些操作在提交到后台后,未提供任何身份识别或校验的参数:
比如在提交修改密码的请求时,没有检查用户的身份(如没有使用CSRF令牌或其他认证机制)
一句话总结:说白了就是会话保持,系统存在进行数据修改,且没有认证
3.漏洞利用(如何攻击)
恶意攻击者可以伪装“数据修改或新增”操作的请求,并将这个请求发送给被攻击者。如果攻击者能够通过某种手段(例如社交工程)诱使被攻击者在其cookie仍然有效的情况下点击这个伪造的请求链接,那么CSRF漏洞就会被触发。
一旦被攻击者点击了这个链接,浏览器会自动在请求中包含用户的认证信息(如cookie),从而让服务器误以为这是合法用户发起的请求。这时,服务器会直接执行请求中的操作。例如:
- 修改当前用户的密码:攻击者可以重设用户的密码,使用户无法访问自己的账户。
- 新增后台管理员账户:如果当前用户是后台管理员,攻击者可以创建一个新的管理员账户,获得对系统的控制权。
拿道CTF题目举例:
<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if($x['scheme']==='http'||$x['scheme']==='https'){
if(!preg_match('/localhost|127.0.0/')){
$ch=curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($ch);
curl_close($ch);
echo ($result);
}
else{
die('hacker');
}
}
else{
die('hacker');
}
?>
这里很明显嘛,没有对身份的验证令牌。分析代码可知有明显的CSRF漏洞,接下来对url进行构造拿到权限:url=http://0177.0.0.1/flag.php(这里由于对127.0.0.1进行了过滤,那就直接使用进制转换一手就好)
接下来再使用DVWA靶场进行一手举例,详细说一下攻击过程:
进来以后是一个登录界面,接下来就介绍一下CSRF最为经典的改密码:
我的密码
账号是admin;密码:123456789
接下来在我的小皮面板www里面建立csrf.html文件
<img src="http://127.0.0.1/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change#" border="0" style="display:none;"/> <h1>404<h1> <h2>file not found.<h2>
接下来点进去就会发现我的密码被改了,log failed
4.CSRF的防御措施
当我们审视 CSRF(跨站请求伪造)的防御措施时,最简单而有效的方法就是引入通行证令牌,通常称为 Token。
每次用户发起请求时,系统都会为其分配一个独特的 Token。这个 Token 在用户登录后生成,并在用户退出或会话结束时销毁,因此上一次的 Token 在用户退出后就失效了。这样一来,每个请求都必须携带有效的 Token 才能被服务器接受和处理。
当然,在这里我也必须得补充两句:token也是可以拿到的,不存在什么的绝对安全。通过XSS攻击拿到token,然后通过CSRF利用你的权限修改密码,这个就叫做XSS—CSRF攻击。
不过这已经不是单纯的CSRF攻击了,我们的token对CSRF攻击还是很管用的。