彻底搞懂网络安全中的 CSRF 攻击,(非常详细)从零基础到精通,收藏这篇就够了!

各位网络安全爱好者,今天咱们来聊聊一个老生常谈但又不得不防的安全漏洞——CSRF (Cross-Site Request Forgery),也就是跨站请求伪造。别看它名字挺唬人,其实理解起来一点都不难。保证你看完这篇文章,就能像躲避老板突击检查一样,轻松应对 CSRF 攻击!

温馨提示:网络安全测试需谨慎,切记要在测试环境中进行,避免在生产环境中误操作!

啥是 CSRF?

简单来说,CSRF 就像是黑客偷偷借用了你的浏览器,冒充你向网站发起请求。攻击者通过一些手段,让你的浏览器去访问你之前登录过,且令牌还没失效的网站,并执行你原本没打算执行的操作。

举个栗子,如果某个网站存在 CSRF 漏洞,攻击者精心构造的 payload 可能会让你在不知不觉中:

  • 修改账号绑定的邮箱
  • 修改账号密码
  • 甚至直接转账!

通过这些骚操作,攻击者就能完全控制你的账号。如果受害者恰好是系统管理员,那后果简直不堪设想!

CSRF 攻击的前置条件

想要成功发起 CSRF 攻击,需要满足以下几个条件:

  1. 目标网站有值得攻击的功能: 比如修改邮箱、密码、转账等高危操作。退一步讲,起码得有增删改的功能吧。如果网站只是用来展示数据的,那 CSRF 攻击就毫无意义,因为你啥也偷不走。
  2. 基于 Cookie 的会话管理: 网站只通过 Cookie 来验证用户身份,没有其他更安全的会话跟踪和用户验证机制。
  3. 缺少不可预测的参数: 比如修改密码时需要输入验证码或原密码。这些参数攻击者既不知道,也猜不到,那 CSRF 攻击就很难成功。

CSRF 漏洞的测试方法

CSRF 的测试方法其实so easy:

  1. 打开 Burp Suite (网络安全测试必备神器)
  2. 找到你要测试的那个请求
  3. 右键点击,选择 "Engagement tools" -> "Generate CSRF PoC"


    4. 根据实际情况修改 POC 代码
    5. 点击 "Test in browser" -> "copy"


    6. 打开浏览器,把刚才复制的 URL 粘贴到地址栏
    7. 如果执行成功,恭喜你,发现了一个 CSRF 漏洞!
    8. 如果失败了,别灰心,看看报错信息,分析是 POC 的问题还是真的不存在 CSRF 漏洞。具体问题具体分析,才是安全测试的精髓。

CSRF 的利用方式

CSRF 的传播方式和反射型 XSS 基本一致,都是想方设法诱导用户点击恶意链接:

  1. 攻击者把恶意代码放在自己控制的网站上,诱导受害者访问。
  2. 通过邮件、短信、社交软件等渠道传播恶意链接。
  3. 把恶意链接放在存在漏洞的网站上,等待有缘人上钩,比如在评论区里搞事情。

CSRF vs XSS:傻傻分不清楚?

CSRF 和 XSS 经常被放在一起比较,但它们之间有本质区别:

  1. XSS 允许攻击者在受害者的浏览器上执行 JS 代码;而 CSRF 只能冒充用户发起请求,不能执行任意代码。
  2. XSS 可以通过窃取 Cookie 来接管账号,但如果网站使用了 HttpOnly,就没辙了;CSRF 则是利用浏览器自动携带 Cookie 的特性,即使有 HttpOnly 也能发起攻击。
  3. XSS 的危害通常更大。攻击者如果成功实施 XSS 攻击,几乎可以使用受害者在该网站的所有功能;而 CSRF 只能攻击特定的存在漏洞的功能
  4. CSRF 无法让攻击者获取服务器返回的数据,因为响应最终还是发送到了受害者的浏览器;而 XSS 可以通过 JS 代码将任何数据发送到攻击者的服务器,比如 Cookie。

CSRF 的防御方法:安全三板斧

  1. 【最稳妥】CSRF Token: 服务器生成一个唯一的、不可预测的 Token,发送给客户端。当用户执行敏感操作时,要求客户端在请求中携带这个 Token。这样攻击者就很难伪造有效的请求,从而有效防止 CSRF 攻击。
  2. SameSite Cookie: 这个属性可以指定 Cookie 是否允许跨站请求使用。它有三个可选值:

    • Strict(严格模式): Cookie 在任何跨站请求中都不会被发送,可以有效防止 CSRF 攻击。但可能会导致某些功能受限。
    • Lax(宽松模式): Cookie 只在顶级导航(比如从外部网站链接进入)以及 GET 方法的跨站请求中发送。POST、PUT、DELETE 等请求不会发送 Cookie。
    • None(无限制模式): Cookie 在任何情况下都会被发送,即使是跨站请求。注意:使用 None 模式时,必须同时设置 Secure 属性(仅通过 HTTPS 传输)才能生效,且存在一定的安全风险和隐私问题,应谨慎使用。


    3. 【可能有坑】校验 Referer 头: 网站通过验证请求的 Referer 头是否来自自己的域名来防御 CSRF 攻击。但在某些情况下,这种验证可能失效。

CSRF 攻防实战案例

接下来,我们通过几个真实的实验案例,深入了解 CSRF 攻击与防御的各种姿势。

案例一:修改邮箱的 CSRF 漏洞

任务简报

这个实验存在一个修改邮箱的 CSRF 漏洞,你的任务是制作一个 POC 来修改受害者的邮箱。

任务过程

  1. 使用提供的账号密码登录实验室 wiener:peter


    2. 可以看到默认邮箱是 wiener@normal-user.net,随便修改一个抓包,比如修改成 111@normal-user.net。


    3. 可以看到,这里只提交了一个修改后的邮箱。使用 Burp Suite 自带的功能生成 POC。


    4. 将邮箱修改成我们自己的 13333333333@qq.com,只需要修改 value 中的值。


    5. 点击 "Test in browser" -> "copy",然后在同一个浏览器打开,模拟受害者点击我们传播的 URL。


    6. 此时邮箱已经被改变了。回到第 4 步,把邮箱改回 111@normal-user.net,以便下面的演示。


    7. 将修改后的 POC 复制到实验室对应的利用服务器上。


    8. 将 HTML 复制到 body 中,同时点击 store 保存。


    9. 模拟受害者在登录了 web-security-academy.net 这个网站的时候,受到攻击者诱导,在攻击者的网站 exploit-server.net 上点击了一个功能 (View exploit),然后浏览器自动发起修改 web-security-academy.net 上用户绑定邮箱的场景。点击 View exploit。


    10. 可以看到,网站自动跳转到 web-security-academy.net 并将邮箱从 111@normal-user.net 修改为了 13333333333@qq.com。点击 deliver exploit to victim 将你的 POC 传播给受害者们,就可以通过这个实验室了。

CSRF Token 绕过:见招拆招

接下来,我们来深入研究各种绕过 CSRF Token 的方法。

绕过姿势一:未限制请求方法

这种漏洞的出现,是因为开发者没有严格限制请求方法,导致可以使用 GET 方法绕过 POST 方法的 CSRF Token 校验。

任务简报

这个实验在修改邮箱的地方存在 CSRF 漏洞,并且它试图通过 CSRF Token 来阻止 CSRF 攻击。

任务过程

  1. 省略前面的步骤,直接看修改邮箱的功能是如何实现的。


    2. 可以看到存在一个 CSRF Token。尝试删除它,看看会发生什么。


    3. 很遗憾,删除 CSRF Token 后请求失败。但不要放弃,尝试使用 GET 方法来修改邮箱。


    4. 惊喜!居然成功了。删除 CSRF Token 参数,看看处理逻辑有没有变化。


    5. GET 方法居然没有校验 CSRF Token!继续生成 POC,保存到利用服务器,就搞定了。


    6. 收工下班!

绕过姿势二:未校验参数是否存在

这种漏洞的出现,是因为开发者没有校验参数的完整性,导致可以直接删除 CSRF Token 参数绕过校验。

任务简报

这个实验在修改邮箱的地方存在 CSRF 漏洞,并且它试图通过 CSRF Token 来阻止 CSRF 攻击。

任务过程

  1. 看修改邮箱的请求。


    2. 和上面的案例类似,删除 CSRF Token 参数。


    3. 哈!更简单了,直接干!右键生成 POC,上传利用服务器,就完事了。

绕过姿势三:使用公共的 CSRF Token 池

这种情况是因为应用没有将用户的 Session 和 CSRF Token 进行绑定,而是使用了一个公共的 CSRF Token 池。攻击者可以登录自己的账号获取 Token,然后用于攻击其他用户。

任务简报

这个实验在修改邮箱的地方存在 CSRF 漏洞,并且它试图通过 CSRF Token 来阻止 CSRF 攻击。

任务过程

  1. 这个演示需要两个账号:wiener:peter 和 carlos:montoya。
  2. 先登录 wiener,看看修改邮箱是如何实现的。


    3. 请求包还是一样的。尝试上面的两种方法,看看是否还能绕过(当然不行)。
    4. 记录 wiener 的 Token 值 roVAju4ZU5DLlKwBO9n0GzqvERfXumk8,然后登出当前账号,重新登录 carlos,看看刚才的 Token 还能不能使用。


    5. 使用 Intercept 拦截修改 CSRF 的值,发现是无效的。可能有以下几种情况:
    * Token 和 Session 绑定,不能使用别人的 Token 绕过校验。
    * Token 是一次性的,用后即焚。
    * 是公共 Token 池,但是用后即焚。
    6. 第一种可能已经验证过了,验证第二种。修改一下邮箱,看看服务器有没有下发新的 CSRF Token,或者看看两次传递的 Token 是不是一样的。


    7. 居然是一次性的!只能试试第三种情况。保存现在的 Token (不要用它),然后登出 carlos,登录 wiener,在修改邮箱的时候替换 CSRF 的值,看看结果如何。


    8. 成功了!它的逻辑很清楚:用户每次修改邮箱的时候需要一个服务器下发的一次性 CSRF Token,但这个 Token 并没有与 Session 绑定,而是从公共 Token 池中提取的。可以通过自己的账号来获取一个有效的 CSRF Token 绕过校验。每次有用户上钩之后需要刷新这个 Token 值。
    9. 思路清晰之后,重复上面的过程就可以了。

绕过姿势四:CSRF Token 直接在 Cookie 中获取

这种情况下,想要利用还需要有 CRLF 漏洞配合,或者有其他的可以注入 Cookie 的漏洞,使得可以控制 Cookie 的数据,进而控制 CSRF Token 的数据。

防御思路是通过 Cookie 和请求体参数双重提交 Token,服务器判断两个值是否相等来防御 CSRF 漏洞。这样做的好处是服务器不需要进行多余的计算、保存 CSRF Token 值,在生成 Cookie 的时候就可以一起完成。但是,当用户可以定义 Set-Cookie 的时候,这种做法就不再安全了。

任务简报

这个实验在修改邮箱的地方存在 CSRF 漏洞,并且它试图通过双重提交 CSRF Token 来阻止 CSRF 攻击。

任务过程

  1. 看修改邮箱是如何实现的。


    2. 这里可以看出它们是相同的。需要一个地方来想办法注入 Set-Cookie。巧的是,在搜索这里存在一个 CRLF 漏洞:payload %0d%0aSet-Cookie:%20csrf=123456%3b%20SameSite=None


    3. 在自己的服务器上(exploit-server.net)构造一个响应,让它去请求 web-security-academy.net 上的资源,然后发起一个请求来实现 CRLF 注入,之后再发送请求去修改邮箱。
    4. 生成一个 CSRF 的 POC。
    5. 修改 POC,利用 img 标签去请求 web-security-academy.net 上的一个不存在的图片。当它发送这个请求的时候,web-security-academy.net 的 Cookie 中的 csrf 键将被设置为 csrf=123456。当请求失败的时候,就会提交 CSRF 代码来修改邮箱。

    html <html> <head> <title>CSRF PoC</title> </head> <body> <img src="https://0a5b003404675754805b547c00ba00c1.web-security-academy.net/feedback?search=%0d%0aSet-Cookie:%20csrf=123456%3b%20SameSite=None"> <form action="https://0a5b003404675754805b547c00ba00c1.web-security-academy.net/my-account/change-email" method="POST"> <input type="hidden" name="email" value="hacker@evil.com"> <input type="hidden" name="csrf" value="123456"> <input type="submit" value="Change email"> </form> </body> </html>
    6. 看看效果。


    7. 攻击完成。

绕过 Referer 头校验

有些网站通过校验 Referer 头来判断请求是否来自自己的网站,以此来防御 CSRF 漏洞。但这种防御方法在某些情况下也可能会被绕过。

绕过姿势一:删除 Referer 头

这种情况存在于开发人员在写代码的时候没有考虑到 Referer 头不存在的情况下的处理逻辑,导致绕过了 Referer 校验。

任务简报

本实验室在修改账号邮箱的地方存在 CSRF 漏洞,但是网站通过 Referer 头进行 CSRF 防御,通过 exploit-server 修改账号的邮箱来通关本实验室。

任务过程

  1. 看修改邮箱的请求。


    2. 成功修改的话会自动跳转,同时请求包里有 Referer 头。修改一下会是什么响应。


    3. 报错无效的 Referer。删除它会有什么响应。


    4. 可以看到同样修改成功了!如何在 POC 里让它不发送 Referer 头?使用 meta 标签。

    html <meta name="referrer" content="never">
    5. 还是生成一个 POC。


    6. 这样的 POC 发送的请求是含有 Referer 头的。加上 meta 标签。


    7. Referer 头没有了!绕过成功!

绕过姿势二:包含目标网址的域名

对方的校验逻辑太过简单,比如检验 Referer 是否以自己的域名开始,或者是否包含自己的域名。

这两种都可以用一种简单的办法绕过,那就是买一个域名,然后自己添加一个含有目标站点的子域名,比如 www.baidu.com.test.cn,其中的 www.baidu.com 就是子域名。

对于后面的查看 Referer 是否包含自己的域名,可以有一个简单的办法,比如在 URI 里加上它的值就好了,比如 history.pushState('', '', '/?www.baidu.com')

任务简报

本实验室在修改账号邮箱的地方存在 CSRF 漏洞,但是网站通过 Referer 头进行 CSRF 防御,通过 exploit-server 修改账号的邮箱来通关本实验室。

任务过程

  1. 直接看修改邮箱的请求包。


    2. 看看 Referer 是怎么校验的吧(删掉不好使)。


    3. 上面的两种方法都能绕过,说明是校验 Referer 中是否含有域名。生成 POC,然后稍微修改一下 payload:history.pushState("", "", "/?0afc003404932ab58ac96e4e005700a5.web-security-academy.net")


    4. 虽然加上了 history.pushState("", "", "/?0afc003404932ab58ac96e4e005700a5.web-security-academy.net"),但是它请求的时候 Referer 并没有包含其中自定义的 URI。这是因为浏览器出于安全考虑会在请求的时候删除 Referer 中的查询字段。

    不过,可以通过租个服务器,设置响应头 Referrer-Policy: unsafe-url 来解决这个问题,这样再次请求的时候就不会删掉 Referer 中的查询值了。
    5. 使用靶场自带的利用服务器来演示。

    ![](https://mmbiz.qpic.cn/sz_mmbiz_png/ELQKhUzr34yWqIfHJKjeibRzjUaIsou9KAepiaq1zibHeheYDdayGVNJd2xPmkbg8EBS4qzO30Cpc

    **黑客/网络安全学习包**
    

图片

资料目录

  1. 成长路线图&学习规划

  2. 配套视频教程

  3. SRC&黑客文籍

  4. 护网行动资料

  5. 黑客必读书单

  6. 面试题合集

282G网络安全/黑客技术入门学习大礼包》,可以扫描下方二维码免费领取

图片

1.成长路线图&学习规划

要学习一门新的技术,作为新手一定要先学习成长路线图方向不对,努力白费

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

图片

图片

2.视频教程

很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,其中一共有21个章节,每个章节都是当前板块的精华浓缩

图片

图片

3.SRC&黑客文籍

大家最喜欢也是最关心的SRC技术文籍&黑客技术也有收录

SRC技术文籍:

图片

黑客资料由于是敏感资源,这里不能直接展示哦!

4.护网行动资料

其中关于HW护网行动,也准备了对应的资料,这些内容可相当于比赛的金手指!

图片

5.黑客必读书单

图片

6.面试题合集

当你自学到这里,你就要开始思考找工作的事情了,而工作绕不开的就是真题和面试题。

图片

更多内容为防止和谐,可以扫描获取~

图片

朋友们需要全套共282G的《网络安全/黑客技术入门学习大礼包》,可以扫描下方二维码免费领取

图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值