文章目录
一.什么是CSRF
CSRF(Cross-Site Request Forgery)漏洞,也被称为跨站请求伪造漏洞,是一种Web应用程序安全漏洞。当受害者在已经登录了某个网站的情况下,访问了恶意网页或点击了恶意链接时,攻击者利用该漏洞可以在受害者不知情的情况下执行恶意操作。
简单的说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己以前认证过的站点并运行一些操作(如发邮件,发消息,甚至财产操作(如转账和购买商品))。因为浏览器之前认证过,所以被访问的站点会觉得这是真正的用户操作而去运行
演示案例:
下面将通过转账系统演示CSRF攻击如何实现转账操作
转账登录页面:
转账页面:
后端数据库页面:
假设,当前登录的账号为 “无涯” 需要给账户 “麻辣” 转账1000源,对应的操作如下图:
成功转账后,后端数据库中,无涯账户的余额从898000变为897000,麻辣账户的余额变为12000,后端数据库效果如下:
在我们未点击安全退出前,浏览器访问该网页需要的cookie依然有效,假设此时电脑接收到恶意的URL地址(恶意弹窗/QQ发送/邮箱发送等),当用户点击该恶意链接时账户余额将被转移到黑客账户 “健刚” ,为什么点击链接后余额会突然消失?接下来让我们来了解一下CSRF漏洞工作原理
二.CSRF漏洞工作原理
下面是点击恶意URL链接后跳转页面的源代码:
<!<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<h1><font color="red">You are visiting Porn</>font</h1>
<img src="yello.jpg">
<img src="http://superbank.com/bank/transfer.php?nameid=2022&balance=1000" width="0" height="0">
<body align="conter">
</body>
</html>
上述代码中,网页页面仅显示一张图片.而另一张图片的src地址是该转账系统的页面URL,由于图片的高度和宽度均为0,因此该图片将不会显示在网页上。
当用户点击该恶意链接,浏览器在加载恶意链接服务器回显的html代码同时也会执下述恶意代码,恶意代码由转账系统的URL+恶意参数组成。
<img src="http://superbank.com/bank/transfer.php?nameid=2022&balance=1000" width="0" height="0">
注:http://superbank.com/bank/transfer.php? 这是转账系统的URL地址
nameid=2022:黑客账户建刚的userid=2022
balance=1000:转账金额1000
当受害者在已经登录了该网站的情况下,点击恶意链接迫使浏览器解析恶意链接的HTML代码,从而迫使浏览在解析恶意HTML代码时访问已登录网站的URL,而浏览器访问该网站时会自动查找本地文件中能够用于验证身份的cookie,由于受害者未退出登录,因此cookie仍然有效。
请求登录的是受害者浏览器,cookie也是受害者的,因此服务器将会直接放行,无需密码登录,当成功进入转账系统后,转账系统的服务器会执行恶意参数(nameid=2022&balance=1000)给黑客账户2022转账1000。
CSRF攻击要点
1.受害者登录信任站点A,并在本地生成Cookie
2.在受害者不登出的情况下,访问恶意站点B。
三.CSRF漏洞的危害
CSRF漏洞是一种Web应用程序安全漏洞,它允许攻击者在用户不知情的情况下以用户的身份执行未经授权的操作。CSRF漏洞的危害主要体现在以下几个方面:
-
未经授权的操作:攻击者可以利用CSRF漏洞以用户的身份执行未经授权的操作,例如更改密码、删除帐户、进行金融交易等。这些操作可能导致用户的信息泄露、财产损失或其他不可挽回的后果。
-
数据修改和篡改:攻击者可以通过修改用户的个人信息、发布恶意内容、篡改网页内容等方式对目标网站的数据进行修改和篡改。这可能会导致用户数据的不一致性、误导用户、降低网站的可信度等问题。
-
钓鱼攻击:攻击者可以利用CSRF漏洞伪造用户的请求,将用户引导到恶意网站或欺骗性页面,从而盗取用户的登录凭证、个人敏感信息等敏感数据。这可能导致用户的信息泄露、身份被盗用以及其他远程攻击。
四.CSRF漏洞防范
防御思路1:使站点能够判断HTTP请求是否是黑客伪造受害者身份发起的请求。
- 利用HTTP协议中的Referer字段:
Referer字段用于记录发出请求的页面的URL,若Referer字段不为空,代表该请求来自第三方网站,极有可能存在CSRF漏洞,因此可以对Referer字段中的URL进行限制,过滤掉非信任的URL。
缺点:黑客可以利用第三方攻击截断受害者发送的请求报文并更改请求报文,使站点信任该请求
防御思路2:是受害者客户端发送的请求不可被伪造。
- 利用HASH算法加密cookie
客户端对cookie计算哈希获得摘要值并与cookie一起发送给服务端,服务端收到请求后,利用同样的哈希算法对请求报文中携带的cookie进行哈希计算,若服务端计算出的摘要值=请求报文中携带的摘要值,证明该请求报文并非来自第三方
缺点:黑客可以利用XSS漏洞获取受害者cookie并将盗取的cookie使用同样的哈希算法计算出的摘要值插入恶意的请求报文中,借此来获取服务端的信任。
<?php
if(isset($_POST['check'])){
$hash = md5($_COOKIE['cookie']);
if ($_POST['check'] == $hash){执行业务逻辑}
}
?>
- 利用 CSFR -Token
用户登录服务端后,服务端下发一个随机的token字段,并把这个字段保存在服务端的session中。客户端收到token后将其保存并放入隐藏字段中,在用户登录状态下,之后访问的时候都要携带这个token字段(用户无法在请求报文中查看,token会被隐藏发送)。服务端收到后会将请求报文中的token与本地session中保存的token比较,无法成功匹配则拦截该请求。用户退出后,session被销毁,token失效。
session_start();
if (empty($_SESSION['token'])){
$_SESSION['token'] = bin2hex(random_bytes(32));
}
$token = $_SESSION['token'];