news 2026/2/5 21:23:11

网络安全黑客技术之实现了一下CSRF原来不像背的那么简单,网络安全零基础入门到精通教程!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
网络安全黑客技术之实现了一下CSRF原来不像背的那么简单,网络安全零基础入门到精通教程!
一、前言

之前面试经常被问到 CSRF, 跨站请求伪造

大概流程比较简单, 大概就是用户登录了A页面,存下来登录凭证(cookie), 攻击者有诱导受害者打开了B页面, B页面中正好像A发送了一个跨域请求,并把cookie进行了携带, 欺骗浏览器以为是用户的行为,进而达到执行危险行为的目的,完成攻击

上面就是面试时,我们通常的回答, 但是到底是不是真是这样呢? 难道这么容易伪造吗?于是我就打算试一下能不能实现

二、实现

接下来,我们就通过node起两个服务 A服务(端口3000)和B服务(端口4000), 然后通过两个页面 A页面、和B页面模拟一下CSRF。

我们先约定一下 B页面是正常的页面, 起一个 4000 的服务, 然后 A页面为伪造者的网站, 服务为3000

先看B页面的代码, B页面有一个登录,和一个获取数据的按钮, 模拟正常网站,需要登录后才可以获取数据

<body> <div> 正常 页面 B <button onclick="login()">登录</button> <button onclick="getList()">拿数据</button> <ul class="box"></ul> <div class="tip"></div> </div> </body> <script> async function login() { const response = await fetch("http://localhost:4000/login", { method: "POST", }); const res = await response.json(); console.log(res, "writeCookie"); if (res.data === "success") { document.querySelector(".tip").innerHTML = "登录成功, 可以拿数据"; } } async function getList() { const response = await fetch("http://localhost:4000/list", { method: "GET", }); if (response.status === 500) { document.querySelector(".tip").innerHTML = "cookie失效,请先登录!"; document.querySelector(".box").innerHTML = ""; } else { document.querySelector(".tip").innerHTML = ""; const data = await response.json(); let html = ""; data.map((el) => { html += `<div>${el.id} - ${el.name}</div>`; }); document.querySelector(".box").innerHTML = html; } } </script>

在看B页面的服务端代码如下:

const express = require("express"); const app = express(); app.use(express.json()); // json app.use(express.urlencoded({ extends: true })); // x-www-form-urlencoded app.use((req, res, next) => { res.header("Access-Control-Allow-Origin", "*"); // 允许客户端跨域传递的请求头 res.header("Access-Control-Allow-Headers", "Content-Type"); next(); }); app.use(express.static("public")); app.get("/list", (req, res) => { const cookie = req.headers.cookie; if (cookie !== "user=allow") { res.sendStatus("500"); } else { res.json([ { id: 1, name: "zhangsan" }, { id: 2, name: "lisi" }, ]); } }); app.post("/login", (req, res) => { res.cookie("user", "allow", { expires: new Date(Date.now() + 86400 * 1000), }); res.send({ data: "success" }); }); app.post("/delete", (req, res) => { const cookie = req.headers.cookie; if (req.headers.referer !== req.headers.host) { console.log("should ban!"); } if (cookie !== "user=allow") { res.sendStatus("500"); } else { res.json({ data: "delete success", }); } }); app.listen(4000, () => { console.log("sever 4000"); });

B 服务有三个接口, 登录、获取列表、删除。再触发登录接口的时候,会像浏览器写入cookie, 再删除或者获取列表的时候,都先检测有没有将指定的cookie传回,如果有就认为有权限

然后我们打开http://localhost:4000/B.html先看看B页面功能是否都正常

我们看到此时 B 页面功能和接口都是正常的, cookie 也正常进行了设置,每次获取数据的时候,都是会携带cookie到服务端校验的

那么接下来我们就通过A页面,起一个3000端口的服务,来模拟一下跨域情况下,能否完成获取 B服务器数据,调用 B 服务器删除接口的功能

A页面代码

<body> <div> 伪造者页面 A <form action="http://localhost:4000/delete" method="POST"> <input type="hidden" name="account" value="xiaoming" /> </form> <script> // 这行可以放到控制台执行,便于观察效果 // document.forms[0].submit(); </script> </div> <ul class="box"></ul> <div class="tip"></div> </body>

A页面服务端代码

<body> <div> 伪造者页面 A <form action="http://localhost:4000/delete" method="POST"> <input type="hidden" name="account" value="xiaoming" /> </form> <script> // 这行可以放到控制台输入 // document.forms[0].submit(); </script> <script src="http://localhost:4000/list"></script> </div> </body>

于是在我们 访问http://localhost:3000/A.html页面的时候发现, 发现list列表确实,请求到了, 控制台输入document.forms[0].submit()时发现,确实删除也发送成功了, 是不是说明csrf就成功了呢, 但是其实还不是, 关键的一点是, 我们在B页面设置cookie的时候, domain设置的是localhost那么其实在A页面, 发送请求的时候cookie是共享的状态, 真实情况下,肯定不会是这样, 那么为了模拟真实情况, 我们把http://localhost:3000/A.html改为http://127.0.0.1:3000/A.html, 这时发现,以及无法访问了, 那么这是怎么回事呢, 说好的,cookie 会在获取过登录凭证下, 再次访问时可以携带呢。

于是,想了半天也没有想明白, 难道是浏览器限制严格进行了限制, 限制规避了这个问题?难道我们背的面试题是错误的?

有知道的小伙伴,欢迎下方讨论

三、 sameSite 设置

其实上面的问题无法实现 CSRF 是由于 SameSite 的设置问题, 其实关键是要设置SameSite=None简单看一下下面三个设置的区分

接下来我们就把上面的 B 服务进行改造, 再设置cookie的时候, 同时设置 sameSite 和 Secure

app.post("/login", (req, res) => { res.cookie("user", "allow", { expires: new Date(Date.now() + 86400 * 1000), sameSite: "none", secure: true, }); res.send({ data: "success" }); });

然后再次打开http://127.0.0.1:3000/A.html会发现 cookie 正常设置到了浏览器,

我们再次在控制台 输入document.forms[0].submit()发现删除操作也正常执行了

如图,我们就完成了 CSRF 攻击

四、总结

CSRF —— 跨域请求伪造, 顾名思义,攻击是发生在第三方页面, 利用了浏览器在跨域的情况下,在一些跨域的请求时(如 script 、 img、 form 表单提交、 a标签等)可以携带cookie的特性, 使得一些伪造的构建请求可以执行成功, 进而对正常网页造成危害的行为。我们通过代码也能看出来, 其实现代浏览器对跨域cookie的限制比较多了, 但是在一些情况下,依然可以发生, 比如设置sameSite: None时,虽然会增加安全风险, 但是 samesite为 None 又有一些场景需要跨域下可以共享cookie,比如单点登录、内嵌广告、资源时, 所以无法完全禁止, 由此我们就可以总结一些避免CSRF攻击的手段了,

  1. 使用同源策略, 限制不同来源直接资源共享

  2. 检查 Refer 头部, 设置白名单(并不保险,比如 a标签可以设置 rel=“noreferrer” 绕开refer检查

  3. 使用 CSRF Token 每个用户会话设置一个不可预测 唯一的 token,每次请求校验

  4. 尽量使用 POST 和 其他安全的HTTP方法, 不在 GET 请求中实现数据写入操作

  5. 敏感操作,增加验证码二次验证

  6. 服务端把 Cookie 的SameSite 属性设置为 Lax

  7. 表单提交增加 csrfToken 隐藏字段

额外:由于CSRF攻击原理是浏览器自动携带 Cookie, 如果放开跨站Cookie有CSRF 风险,但是不放开又无法做单点登录, 所以对于SPA应用来说, JWT 认证的方式更好一些,token 会在Authorization头部进行传递

网络安全学习路线&学习资源

网络安全的知识多而杂,怎么科学合理安排?

下面给大家总结了一套适用于网安零基础的学习路线,应届生和转行人员都适用,学完保底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、超级网工

这部分内容对零基础的同学来说还比较遥远,就不展开细说了,贴一个大概的路线。感兴趣的童鞋可以研究一下,不懂得地方可以【点这里】加我耗油,跟我学习交流一下。

网络安全工程师企业级学习路线

如图片过大被平台压缩导致看不清的话,可以【点这里】加我耗油发给你,大家也可以一起学习交流一下。

一些我自己买的、其他平台白嫖不到的视频教程:

需要的话可以扫描下方卡片加我耗油发给你(都是无偿分享的),大家也可以一起学习交流一下。

网络安全学习路线&学习资源

结语

网络安全产业就像一个江湖,各色人等聚集。相对于欧美国家基础扎实(懂加密、会防护、能挖洞、擅工程)的众多名门正派,我国的人才更多的属于旁门左道(很多白帽子可能会不服气),因此在未来的人才培养和建设上,需要调整结构,鼓励更多的人去做“正向”的、结合“业务”与“数据”、“自动化”的“体系、建设”,才能解人才之渴,真正的为社会全面互联网化提供安全保障。

特别声明:

此教程为纯技术分享!本书的目的决不是为那些怀有不良动机的人提供及技术支持!也不承担因为技术被滥用所产生的连带责任!本书的目的在于最大限度地唤醒大家对网络安全的重视,并采取相应的安全措施,从而减少由网络安全而带来的经济损失!!!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/5 7:44:34

【全面收藏】Transformer架构详解:大模型(LLMs)的核心原理与应用指南

本文全面介绍大型语言模型(LLMs)的基础知识&#xff0c;从Transformer架构的自注意力机制到训练方法、嵌入层、幻觉处理等核心技术。文章还详细解释了Token概念、迁移学习技术和注意力机制如何帮助模型处理长期依赖关系&#xff0c;并提供衡量LLM性能的指标。最后&#xff0c;文…

作者头像 李华
网站建设 2026/2/5 0:31:20

导师推荐9个AI论文网站,专科生轻松搞定毕业论文!

导师推荐9个AI论文网站&#xff0c;专科生轻松搞定毕业论文&#xff01; AI 工具如何帮你轻松搞定毕业论文 对于专科生来说&#xff0c;撰写一篇完整的毕业论文往往是一项既复杂又耗时的任务。尤其是在时间紧张、资料匮乏的情况下&#xff0c;很多同学都会感到无从下手。而随着…

作者头像 李华
网站建设 2026/2/4 0:26:13

Linux驱动核心API调用链路清单

Linux驱动核心API调用链路清单 说明 本清单聚焦嵌入式Linux驱动开发高频子系统&#xff08;GPIO/中断/Input/Framebuffer/PWM&#xff09;&#xff0c;涵盖核心API、从驱动到硬件的完整调用链路、底层硬件操作&#xff0c;适配ARM SOC&#xff08;全志/瑞芯微等&#xff09;&…

作者头像 李华
网站建设 2026/2/5 5:48:46

Linux 命令:csplit

概述 这个命令的核心作用是按指定规则将一个文件分割成多个小文件&#xff08;split by context&#xff09;&#xff0c;区别于 split 按大小/行数拆分的简单逻辑&#xff0c;csplit 支持按行号、正则表达式等“上下文”拆分&#xff0c;是处理日志、配置文件、文本数据的高效…

作者头像 李华
网站建设 2026/2/4 13:27:28

基于Java的无人图书借阅系统源码解析

以下是一个基于Java的无人图书借阅系统源码解析&#xff0c;涵盖系统架构、核心功能模块、关键代码示例及技术实现要点&#xff1a; 一、系统架构 技术选型&#xff1a; 后端框架&#xff1a;Spring Boot 2.x&#xff0c;利用其自动配置和起步依赖特性快速搭建项目&#xff0c…

作者头像 李华