各位网络安全爱好者,今天咱们来聊聊一个老生常谈但又不得不防的安全漏洞——CSRF (Cross-Site Request Forgery),也就是跨站请求伪造。别看它名字挺唬人,其实理解起来一点都不难。保证你看完这篇文章,就能像躲避老板突击检查一样,轻松应对 CSRF 攻击!
温馨提示:网络安全测试需谨慎,切记要在测试环境中进行,避免在生产环境中误操作!
啥是 CSRF?
简单来说,CSRF 就像是黑客偷偷借用了你的浏览器,冒充你向网站发起请求。攻击者通过一些手段,让你的浏览器去访问你之前登录过,且令牌还没失效的网站,并执行你原本没打算执行的操作。
举个栗子,如果某个网站存在 CSRF 漏洞,攻击者精心构造的 payload 可能会让你在不知不觉中:
- 修改账号绑定的邮箱
- 修改账号密码
- 甚至直接转账!
通过这些骚操作,攻击者就能完全控制你的账号。如果受害者恰好是系统管理员,那后果简直不堪设想!
CSRF 攻击的前置条件
想要成功发起 CSRF 攻击,需要满足以下几个条件:
- 目标网站有值得攻击的功能: 比如修改邮箱、密码、转账等高危操作。退一步讲,起码得有增删改的功能吧。如果网站只是用来展示数据的,那 CSRF 攻击就毫无意义,因为你啥也偷不走。
- 基于 Cookie 的会话管理: 网站只通过 Cookie 来验证用户身份,没有其他更安全的会话跟踪和用户验证机制。
- 缺少不可预测的参数: 比如修改密码时需要输入验证码或原密码。这些参数攻击者既不知道,也猜不到,那 CSRF 攻击就很难成功。
CSRF 漏洞的测试方法
CSRF 的测试方法其实so easy:
打开 Burp Suite (网络安全测试必备神器)
找到你要测试的那个请求
右键点击,选择 “Engagement tools” -> “Generate CSRF PoC”
4. 根据实际情况修改 POC 代码
5. 点击 “Test in browser” -> “copy”6. 打开浏览器,把刚才复制的 URL 粘贴到地址栏
7. 如果执行成功,恭喜你,发现了一个 CSRF 漏洞!
8. 如果失败了,别灰心,看看报错信息,分析是 POC 的问题还是真的不存在 CSRF 漏洞。具体问题具体分析,才是安全测试的精髓。
CSRF 的利用方式
CSRF 的传播方式和反射型 XSS 基本一致,都是想方设法诱导用户点击恶意链接:
- 攻击者把恶意代码放在自己控制的网站上,诱导受害者访问。
- 通过邮件、短信、社交软件等渠道传播恶意链接。
- 把恶意链接放在存在漏洞的网站上,等待有缘人上钩,比如在评论区里搞事情。
CSRF vs XSS:傻傻分不清楚?
CSRF 和 XSS 经常被放在一起比较,但它们之间有本质区别:
- XSS 允许攻击者在受害者的浏览器上执行 JS 代码;而CSRF 只能冒充用户发起请求,不能执行任意代码。
- XSS 可以通过窃取 Cookie 来接管账号,但如果网站使用了 HttpOnly,就没辙了;CSRF 则是利用浏览器自动携带 Cookie 的特性,即使有 HttpOnly 也能发起攻击。
- XSS 的危害通常更大。攻击者如果成功实施 XSS 攻击,几乎可以使用受害者在该网站的所有功能;而CSRF 只能攻击特定的存在漏洞的功能。
- CSRF 无法让攻击者获取服务器返回的数据,因为响应最终还是发送到了受害者的浏览器;而XSS 可以通过 JS 代码将任何数据发送到攻击者的服务器,比如 Cookie。
CSRF 的防御方法:安全三板斧
【最稳妥】CSRF Token: 服务器生成一个唯一的、不可预测的 Token,发送给客户端。当用户执行敏感操作时,要求客户端在请求中携带这个 Token。这样攻击者就很难伪造有效的请求,从而有效防止 CSRF 攻击。
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 来修改受害者的邮箱。
任务过程
使用提供的账号密码登录实验室 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 攻击。
任务过程
省略前面的步骤,直接看修改邮箱的功能是如何实现的。
2. 可以看到存在一个 CSRF Token。尝试删除它,看看会发生什么。
3. 很遗憾,删除 CSRF Token 后请求失败。但不要放弃,尝试使用 GET 方法来修改邮箱。
4. 惊喜!居然成功了。删除 CSRF Token 参数,看看处理逻辑有没有变化。
5. GET 方法居然没有校验 CSRF Token!继续生成 POC,保存到利用服务器,就搞定了。
6. 收工下班!
绕过姿势二:未校验参数是否存在
这种漏洞的出现,是因为开发者没有校验参数的完整性,导致可以直接删除 CSRF Token 参数绕过校验。
任务简报
这个实验在修改邮箱的地方存在 CSRF 漏洞,并且它试图通过 CSRF Token 来阻止 CSRF 攻击。
任务过程
看修改邮箱的请求。
2. 和上面的案例类似,删除 CSRF Token 参数。
3. 哈!更简单了,直接干!右键生成 POC,上传利用服务器,就完事了。
绕过姿势三:使用公共的 CSRF Token 池
这种情况是因为应用没有将用户的 Session 和 CSRF Token 进行绑定,而是使用了一个公共的 CSRF Token 池。攻击者可以登录自己的账号获取 Token,然后用于攻击其他用户。
任务简报
这个实验在修改邮箱的地方存在 CSRF 漏洞,并且它试图通过 CSRF Token 来阻止 CSRF 攻击。
任务过程
这个演示需要两个账号:wiener:peter 和 carlos:montoya。
先登录 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 攻击。
任务过程
看修改邮箱是如何实现的。
2. 这里可以看出它们是相同的。需要一个地方来想办法注入 Set-Cookie。巧的是,在搜索这里存在一个 CRLF 漏洞:
payload %0d%0aSet-Cookie:%20csrf=123456%3b%20SameSite=None3. 在自己的服务器上(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 修改账号的邮箱来通关本实验室。
任务过程
看修改邮箱的请求。
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 修改账号的邮箱来通关本实验室。
任务过程
直接看修改邮箱的请求包。
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. 使用靶场自带的利用服务器来演示。
文章来自网上,侵权请联系博主
互动话题:如果你想学习更多网安方面的知识和工具,可以看看以下题外话!
题外话
网络安全学习路线&学习资源![]()
网络安全的知识多而杂,怎么科学合理安排?
下面给大家总结了一套适用于网安零基础的学习路线,应届生和转行人员都适用,学完保底6k!就算你底子差,如果能趁着网安良好的发展势头不断学习,日后跳槽大厂、拿到百万年薪也不是不可能!
初级网工
1、网络安全理论知识(2天)
①了解行业相关背景,前景,确定发展方向。
②学习网络安全相关法律法规。
③网络安全运营的概念。
④等保简介、等保规定、流程和规范。(非常重要)
2、渗透测试基础(一周)
①渗透测试的流程、分类、标准
②信息收集技术:主动/被动信息搜集、Nmap工具、Google Hacking
③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察
④主机攻防演练:MS17-010、MS08-067、MS10-046、MS12-20等
3、操作系统基础(一周)
①Windows系统常见功能和命令
②Kali Linux系统常见功能和命令
③操作系统安全(系统入侵排查/系统加固基础)
4、计算机网络基础(一周)
①计算机网络基础、协议和架构
②网络通信原理、OSI模型、数据转发流程
③常见协议解析(HTTP、TCP/IP、ARP等)
④网络攻击技术与网络安全防御技术
⑤Web漏洞原理与防御:主动/被动攻击、DDOS攻击、CVE漏洞复现
5、数据库基础操作(2天)
①数据库基础
②SQL语言基础
③数据库安全加固
6、Web渗透(1周)
①HTML、CSS和JavaScript简介
②OWASP Top10
③Web漏洞扫描工具
④Web渗透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏扫等)
恭喜你,如果学到这里,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web 渗透、安全服务、安全分析等岗位;如果等保模块学的好,还可以从事等保工程师。薪资区间6k-15k
到此为止,大概1个月的时间。你已经成为了一名“脚本小子”。那么你还想往下探索吗?
【“脚本小子”成长进阶资源领取】
7、脚本编程(初级/中级/高级)
在网络安全领域。是否具备编程能力是“脚本小子”和真正黑客的本质区别。在实际的渗透测试过程中,面对复杂多变的网络环境,当常用工具不能满足实际需求的时候,往往需要对现有工具进行扩展,或者编写符合我们要求的工具、自动化脚本,这个时候就需要具备一定的编程能力。在分秒必争的CTF竞赛中,想要高效地使用自制的脚本工具来实现各种目的,更是需要拥有编程能力.
零基础入门,建议选择脚本语言Python/PHP/Go/Java中的一种,对常用库进行编程学习; 搭建开发环境和选择IDE,PHP环境推荐Wamp和XAMPP, IDE强烈推荐Sublime; ·Python编程学习,学习内容包含:语法、正则、文件、 网络、多线程等常用库,推荐《Python核心编程》,不要看完; ·用Python编写漏洞的exp,然后写一个简单的网络爬虫; ·PHP基本语法学习并书写一个简单的博客系统; 熟悉MVC架构,并试着学习一个PHP框架或者Python框架 (可选); ·了解Bootstrap的布局或者CSS。
8、超级网工
这部分内容对零基础的同学来说还比较遥远,就不展开细说了,贴一个大概的路线。感兴趣的童鞋可以研究一下,不懂得地方可以【点这里】加我耗油,跟我学习交流一下。
网络安全工程师企业级学习路线
如图片过大被平台压缩导致看不清的话,可以【点这里】加我耗油发给你,大家也可以一起学习交流一下。
一些我自己买的、其他平台白嫖不到的视频教程:
需要的话可以扫描下方卡片加我耗油发给你(都是无偿分享的),大家也可以一起学习交流一下。
网络安全学习路线&学习资源![]()
结语
网络安全产业就像一个江湖,各色人等聚集。相对于欧美国家基础扎实(懂加密、会防护、能挖洞、擅工程)的众多名门正派,我国的人才更多的属于旁门左道(很多白帽子可能会不服气),因此在未来的人才培养和建设上,需要调整结构,鼓励更多的人去做“正向”的、结合“业务”与“数据”、“自动化”的“体系、建设”,才能解人才之渴,真正的为社会全面互联网化提供安全保障。
特别声明:
此教程为纯技术分享!本书的目的决不是为那些怀有不良动机的人提供及技术支持!也不承担因为技术被滥用所产生的连带责任!本书的目的在于最大限度地唤醒大家对网络安全的重视,并采取相应的安全措施,从而减少由网络安全而带来的经济损失!!!