ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

从零开始掌握 Web 安全:2026 年网络安全工程师必须掌握的漏洞挖掘技术

2026/8/30 20:27:17 拓冰建站 浏览量
从零开始掌握 Web 安全:2026 年网络安全工程师必须掌握的漏洞挖掘技术 从零开始掌握 Web 安全2026 年网络安全工程师必须掌握的漏洞挖掘技术Web 安全一直是网络安全学习和实际安全工作中的核心方向之一。对于刚刚进入网络安全行业的同学来说真正困难的往往不是记住某个漏洞名称而是理解漏洞产生的根本原因、建立完整的漏洞分析思路并能够通过代码和工具进行验证。本文将以 Web 应用安全为主线从 HTTP 请求开始一步步分析 SQL 注入、XSS、CSRF、文件上传等常见漏洞同时结合 Python、JavaScript、SQL、Shell 等代码示例帮助初学者建立一套完整的 Web 安全知识体系。一、为什么 Web 安全一直是网络安全的重要方向随着企业业务逐渐从传统桌面软件迁移到 Web 平台Web 应用已经成为企业最主要的业务入口之一。现在我们访问的电商平台、管理后台、视频网站、在线教育平台、企业 OA、ERP、CRM甚至很多内部办公系统本质上都属于 Web 应用。Web 应用带来的优势非常明显用户无需安装复杂的软件浏览器即可访问系统可以快速迭代可以方便接入第三方服务能够支持大规模用户访问但与此同时Web 应用也增加了攻击面。一个看似普通的登录接口POST /login HTTP/1.1 Host: example.com Content-Type: application/x-www-form-urlencoded usernametestpassword123456实际上可能涉及浏览器 ↓ CDN ↓ WAF ↓ Web服务器 ↓ 应用程序 ↓ 数据库 ↓ 缓存系统 ↓ 内部服务只要其中任意一个环节存在安全问题都可能进一步影响整个业务系统。所以学习 Web 安全不能只停留在“背漏洞”。真正需要掌握的是请求是怎么产生的参数是怎么传递的程序是怎么处理参数的数据最终进入了哪里在什么地方发生了危险的数据流这才是漏洞挖掘真正的核心。二、学习 Web 安全之前首先要理解 HTTP很多刚入门网络安全的同学一上来就学习 SQL 注入、XSS、Burp Suite结果学了很久仍然感觉非常混乱。原因很简单HTTP 基础不扎实。Web 安全的很多问题本质上都是围绕 HTTP 请求展开的。一次典型的请求GET /user?id1001 HTTP/1.1 Host: example.com User-Agent: Mozilla/5.0 Accept: text/html Cookie: sessionabcdef123456服务器返回HTTP/1.1 200 OK Content-Type: text/html Content-Length: 1024 html body h1Hello User/h1 /body /html这里面有几个非常重要的概念。1. 请求方法常见方法包括GET POST PUT DELETE PATCH OPTIONS HEAD安全测试中最常接触的是 GET 和 POST。例如GET /search?keywordhello HTTP/1.1参数出现在 URL 中。而POST /login HTTP/1.1 usernameadminpassword123456参数出现在请求体中。2. CookieCookie 经常用于保存会话信息。例如Cookie: sessionid8a9f7d6c5b4a如果应用没有正确保护 Session就可能产生会话安全问题。例如Session 固定会话劫持Cookie 泄露Cookie 未设置安全属性比较重要的 Cookie 属性Set-Cookie: sessionabc123; HttpOnly; Secure; SameSiteLax其中HttpOnly可以降低客户端 JavaScript 读取 Cookie 的风险。Secure要求 Cookie 通过 HTTPS 发送。SameSite可以降低部分跨站请求风险。三、Web 漏洞的本质危险数据流理解这一点之后很多漏洞都会变得非常简单。例如用户输入 ↓ HTTP参数 ↓ 应用程序 ↓ 危险函数 ↓ 数据库 / 浏览器 / 操作系统如果开发人员没有对数据进行正确校验就可能产生安全问题。例如username request.args.get(username) sql SELECT * FROM users WHERE username username 问题就在这里用户控制的数据直接进入了 SQL 语句。这就是经典的 SQL 注入风险。因此在漏洞挖掘过程中一个非常重要的方法就是找用户可控输入再追踪输入最终流向。这也是所谓的数据流分析。四、SQL 注入到底是怎么产生的SQL 注入是 Web 安全中最经典的漏洞之一。假设后台代码username request.form[username] sql SELECT * FROM users WHERE username username 正常情况下username admin最终 SQLSELECT * FROM users WHERE username admin;如果程序直接拼接字符串就可能导致 SQL 语句结构被用户影响。因此不要简单理解 SQL 注入为“在输入框里面加特殊字符。”真正的问题是用户输入被当成了 SQL 代码的一部分。1. 安全写法参数化查询正确做法应该使用参数化查询。例如 Pythonimport sqlite3 conn sqlite3.connect(demo.db) username request.form[username] cursor conn.cursor() cursor.execute( SELECT * FROM users WHERE username ?, (username,) ) result cursor.fetchall()此时用户输入的数据不会直接参与 SQL 语句结构解析。这就是为什么在实际开发中参数化查询是防御 SQL 注入的核心措施之一。五、如何进行 SQL 注入漏洞排查在授权测试环境中可以重点观察以下接口/login /search /product /article /user /order /comment尤其是参数id uid user username keyword search sort page category例如GET /product?id1001 HTTP/1.1安全测试过程中可以建立这样一个思维参数 id ↓ 是否进入数据库查询 ↓ 是否字符串拼接 ↓ 是否参数化 ↓ 异常输入是否被处理如果系统返回数据库错误例如SQL syntax error Database exception SQLite error MySQL error PostgreSQL error就应该进一步检查后台查询逻辑。六、不要只看报错更要理解程序逻辑现代 Web 应用通常不会直接把数据库错误暴露给用户。例如try: cursor.execute(sql) except Exception: return Request failed前端只看到Request failed这并不代表不存在漏洞。因为没有报错 ≠ 没有漏洞很多时候需要结合响应时间状态码页面内容数据变化日志源代码API 行为进行综合判断。七、XSS为什么浏览器会执行用户输入XSS也就是跨站脚本攻击同样是 Web 安全中的经典问题。最简单的危险场景const keyword getParameter(keyword); document.write(keyword);假设keyword 用户输入如果应用没有进行正确输出编码就可能让浏览器把用户输入解释为 HTML 或 JavaScript。例如一个危险的页面div idresult/div script const data location.search; document.getElementById(result).innerHTML data; /script这里最大的风险在于innerHTML它会把字符串当作 HTML 进行解析。因此开发过程中更安全的做法通常是const result document.getElementById(result); result.textContent data;区别就在于innerHTML ↓ 解析 HTML textContent ↓ 当作普通文本八、XSS 常见类型XSS 通常可以分为三个主要方向。1. 反射型 XSS特点是用户输入 ↓ 服务器处理 ↓ 响应页面 ↓ 浏览器执行常见于搜索页面 错误页面 参数回显 跳转页面2. 存储型 XSS用户输入的数据被保存到数据库用户评论 ↓ 数据库 ↓ 后台读取 ↓ 网页展示 ↓ 浏览器解析这种类型影响范围往往更大。例如评论内容 昵称 个人签名 文章标题 站内消息都可能成为测试入口。3. DOM 型 XSS主要发生在前端 JavaScript 中。例如const content location.hash.substring(1); document.getElementById(output).innerHTML content;此时服务器甚至不需要参与。因此前端代码审计也越来越重要。九、CSRF为什么用户什么都没点却完成了操作CSRF 可以理解成利用受害者当前已经登录的身份让浏览器向目标系统发起非预期请求。例如某后台存在修改邮箱接口POST /change-email HTTP/1.1 emailtestexample.com正常情况下用户登录 ↓ 浏览器保存 Cookie ↓ 用户访问账户设置 ↓ 修改邮箱但如果系统没有 CSRF 防护攻击者可能诱导浏览器发起类似请求。这里的关键点并不是“伪造 Cookie”。而是浏览器可能会自动携带当前站点的身份凭证。十、CSRF 的主要防御方法最经典的方法是CSRF Token服务端生成随机 Tokenimport secrets csrf_token secrets.token_hex(32) print(csrf_token)然后页面中携带input typehidden namecsrf_token value随机Token服务器收到请求之后进行验证if request.form[csrf_token] ! session[csrf_token]: return Invalid request, 403此外还应该合理使用SameSite Cookie Origin 校验 Referer 校验 身份认证 权限验证十一、文件上传漏洞为什么危险很多网站都存在头像上传 图片上传 附件上传 简历上传 文档上传 视频上传最常见的错误思路filename request.files[file].filename file.save(/var/www/uploads/ filename)开发人员认为用户上传一个文件我保存下来就行。但安全问题在于用户控制了文件内容和文件名。十二、文件上传需要验证什么至少需要考虑扩展名 MIME类型 文件头 文件大小 文件内容 随机文件名 保存目录权限 是否允许执行例如ALLOWED_EXTENSIONS { .jpg, .jpeg, .png, .gif }检查from pathlib import Path filename Path(upload.filename) if filename.suffix.lower() not in ALLOWED_EXTENSIONS: raise ValueError(unsupported file type)但仅检查扩展名依然不够。因为文件名可信 ≠ 文件内容可信所以企业环境一般还会增加图片重新编码 病毒扫描 内容检测 对象存储 独立域名 禁止脚本执行十三、为什么上传目录最好不要直接执行脚本假设 Web 服务器目录/var/www/html/如果用户上传文件后直接进入/var/www/html/uploads/而服务器又允许该目录执行脚本那么一旦上传校验出现漏洞就可能从上传功能进一步发展到服务器端代码执行因此一个非常重要的安全原则是用户上传目录与服务器脚本执行目录应该进行隔离。例如应用目录 ├── app/ ├── config/ ├── static/ └── uploads/其中uploads/只允许作为静态文件存储目录。十四、命令执行漏洞从参数到操作系统再来看一个非常危险的漏洞类型。假设开发人员写了import os ip request.args.get(ip) os.system(ping -c 1 ip)程序设计者想实现用户输入 IP ↓ 服务器执行 ping但是这里的问题非常严重用户输入 ↓ Shell命令 ↓ 操作系统也就是说应用程序把用户数据直接交给了命令解释器。十五、更安全的做法是什么如果业务只是执行 ping就不应该让用户控制完整 Shell 字符串。例如使用参数数组import subprocess ip request.args.get(ip) result subprocess.run( [ping, -c, 1, ip], capture_outputTrue, textTrue ) print(result.stdout)然后进一步增加IP格式验证 长度限制 协议限制 命令白名单 超时 权限隔离例如import ipaddress try: ipaddress.ip_address(ip) except ValueError: raise ValueError(Invalid IP address)这类思路在安全开发中非常重要。十六、从漏洞挖掘角度如何分析一个 Web 接口可以建立一个固定流程。第一步寻找输入点重点观察GET参数 POST参数 JSON字段 Header Cookie URL路径 文件上传 WebSocket消息 GraphQL参数第二步寻找敏感操作例如数据库查询 文件读写 模板渲染 系统命令 反序列化 身份认证 权限检查 支付操作 后台管理第三步建立数据流例如request.args[id] ↓ parse() ↓ database.query()或者request.form[name] ↓ template.render() ↓ HTML ↓ Browser第四步寻找安全边界安全边界包括认证 授权 输入校验 输出编码 权限判断 类型转换 参数化查询 安全策略十七、使用 Python 编写一个简单的 URL 参数检查工具下面编写一个非常基础的安全检测程序。它不会对目标进行攻击而是帮助安全人员快速发现 URL 中可能存在的高风险参数。from urllib.parse import urlparse, parse_qs SUSPICIOUS_PARAMS { id, uid, user, file, path, url, redirect, cmd, query, search } def analyze_url(url: str): parsed urlparse(url) params parse_qs(parsed.query) print(fURL: {url}) print(fPath: {parsed.path}) if not params: print(没有发现 URL 参数) return print(\n参数分析) for key, value in params.items(): if key.lower() in SUSPICIOUS_PARAMS: print(f[重点关注] {key} {value}) else: print(f[普通参数] {key} {value}) if __name__ __main__: test_url ( https://example.com/search ?keywordhelloid1001redirect/home ) analyze_url(test_url)运行以后可以看到类似URL: https://example.com/search?keywordhelloid1001redirect/home Path: /search 参数分析 [普通参数] keyword [hello] [重点关注] id [1001] [重点关注] redirect [/home]这个程序虽然非常简单但它体现了一个重要思想自动化工具不是替代人工分析而是帮助我们更快找到值得人工深入分析的位置。十八、进一步如何建立自己的漏洞测试清单建议每次测试一个 Web 应用时都按照固定清单执行。信息收集[ ] 域名 [ ] 子域名 [ ] IP [ ] CDN [ ] Web服务器 [ ] 技术栈 [ ] 开放端口Web 接口[ ] 登录 [ ] 注册 [ ] 搜索 [ ] 用户信息 [ ] 文件上传 [ ] 文件下载 [ ] 修改资料 [ ] 密码修改 [ ] 管理员接口常见漏洞[ ] SQL注入 [ ] XSS [ ] CSRF [ ] SSRF [ ] 文件上传 [ ] 文件读取 [ ] 命令执行 [ ] 越权 [ ] 反序列化 [ ] 路径遍历认证与授权[ ] 弱密码 [ ] 登录逻辑 [ ] Session [ ] JWT [ ] 权限控制 [ ] 水平越权 [ ] 垂直越权十九、为什么“越权漏洞”特别值得关注很多企业安全事故并不是通过复杂漏洞实现的。而是一个普通用户看到了本来不应该看到的数据。例如GET /api/order/10001普通用户访问10001可以查看自己的订单。然后程序仅仅通过order_id查询数据库却没有检查order_id 是否属于当前用户这就是典型的对象级授权问题。安全的设计应该类似order get_order(order_id) if order.user_id ! current_user.id: return Forbidden, 403也就是说身份认证解决“你是谁”。权限控制解决“你能做什么”。两者完全不是一回事。二十、现代 Web 安全为什么越来越强调 API过去 Web 应用主要依靠HTML Form Cookie Session现在则大量采用REST API GraphQL JWT OAuth WebSocket Microservice例如POST /api/v1/user/update Content-Type: application/json { username: test, email: testexample.com }这意味着安全测试人员不能只看网页。还需要重点关注API路径 请求方法 JSON参数 JWT 请求头 权限模型 对象ID 内部接口二十一、API 安全测试中的几个重点首先是参数越权例如{ user_id: 1002 }如果登录用户属于user_id 1001却可以读取1002就需要重点检查授权逻辑。第二敏感信息返回例如接口返回{ id: 1001, username: test, email: testexample.com, phone: 13800000000, password_hash: xxxx, admin: true }即使密码是 Hash也不应该无必要返回给前端。因此 API 安全不仅要关注能不能访问还要关注访问之后返回了什么二十二、Burp Suite 在 Web 安全学习中的作用如果要系统学习 Web 安全Burp Suite 基本属于绕不开的工具。它最核心的能力不是“自动扫描”。而是拦截、修改、重放和分析 HTTP 请求。例如浏览器 ↓ Burp Suite ↓ 服务器一个普通请求GET /user?id1001 HTTP/1.1 Host: example.com Cookie: sessionxxxx可以被修改成GET /user?id1002 HTTP/1.1 Host: example.com Cookie: sessionxxxx然后观察状态码 响应长度 响应内容 响应时间 权限变化这对于分析越权、输入校验、业务逻辑等问题非常有帮助。二十三、自动化很重要但不要过度依赖扫描器很多新手一开始喜欢打开扫描器 ↓ 输入域名 ↓ 等待结果这其实不是一个好的学习方式。因为扫描器擅长的是快速发现 快速验证 批量检测但不擅长理解复杂业务逻辑。例如优惠券 订单 积分 支付 权限 审批 退款这些业务往往需要人工理解业务流程。所以更合理的工作模式是人工理解 ↓ 工具辅助 ↓ 自动化验证 ↓ 人工确认 ↓ 形成报告二十四、漏洞挖掘真正应该培养的能力学习 Web 安全的最终目标并不是记住100个漏洞名称而是建立以下几个能力。1. 看懂请求看到POST /api/user/update能够快速判断身份 参数 数据类型 权限 业务目的2. 看懂代码看到sql SELECT * FROM user WHERE id user_id能够第一时间想到输入 ↓ 字符串拼接 ↓ 数据库 ↓ SQL注入风险3. 看懂业务看到修改账户能够继续思考修改的是自己的账户吗 是否存在权限校验 是否需要重新验证身份 是否有二次确认 是否记录审计日志4. 能够自动化例如使用 Pythonimport requests url https://example.com/api/user response requests.get( url, timeout10 ) print(Status:, response.status_code) print(Length:, len(response.text))再进一步可以构建资产收集 ↓ 接口整理 ↓ 参数分析 ↓ 风险分类 ↓ 结果输出最终形成属于自己的安全工具链。二十五、一个适合新手的 Web 安全学习路线如果你刚开始学习网络安全可以按照下面的顺序进行。第一阶段网络基础学习TCP/IP HTTP DNS TLS Cookie Session 代理 端口 Socket第二阶段Linux掌握cd ls cat grep find awk sed curl wget ps top netstat ss chmod chown重点不是背命令而是理解Linux 系统到底是怎么工作的。第三阶段编程推荐至少掌握Python JavaScript SQL Shell其中 Python 最适合安全自动化。第四阶段Web 开发基础至少能够看懂HTML CSS JavaScript HTTP Flask Django Node.js SQL因为不懂开发就很难深入理解漏洞。第五阶段漏洞原理建议按照SQL注入 XSS CSRF 文件上传 路径遍历 SSRF 命令执行 反序列化 越权 JWT安全逐步学习。二十六、建议搭建自己的安全实验环境学习漏洞最好的方式之一就是在自己搭建的实验环境中进行验证。例如Windows ↓ VMware / VirtualBox ↓ Linux ↓ Docker ↓ 靶场可以选择搭建DVWA WebGoat Juice Shop bWAPP这些环境非常适合学习常见 Web 安全问题。二十七、Docker 搭建测试环境的基本思路例如docker pull bkimminich/juice-shop然后docker run -d \ --name juice-shop \ -p 3000:3000 \ bkimminich/juice-shop查看容器docker ps查看日志docker logs juice-shop进入实验环境http://127.0.0.1:3000这样就可以在完全隔离、自己控制的环境中进行学习。二十八、从“漏洞思维”升级到“攻击面思维”到了进阶阶段不要再只盯着某一种漏洞。应该开始思考一个系统有多少入口例如一个企业平台可能存在Web站点 移动端API 管理后台 文件服务器 第三方登录 消息系统 内部API WebSocket 对象存储这些都属于攻击面的一部分。因此真正高级的安全思维不是“我会什么漏洞”而是“这个系统哪里可能出问题”。二十九、企业安全开发中的几个关键原则从防御角度看很多安全问题其实都可以提前规避。原则一永远不要信任用户输入GET参数 POST参数 Cookie Header JSON 文件理论上都应该被视为不可信数据原则二最小权限数据库账户不要给 root应用进程不要使用 root文件权限只开放必要权限原则三默认拒绝权限系统建议没有权限 ↓ 拒绝而不是没有明确禁止 ↓ 允许原则四日志审计至少记录登录 退出 权限变化 敏感操作 异常请求 管理员操作 数据导出这样出现安全事件之后才能进行追溯。三十、总结真正的 Web 安全是理解系统而不是背漏洞当我们把今天讲到的内容放在一起会发现所有漏洞都存在一个共同规律用户输入 ↓ 应用处理 ↓ 危险操作 ↓ 安全边界失效 ↓ 产生安全问题SQL 注入用户输入 → SQLXSS用户输入 → HTML / JavaScript命令执行用户输入 → Shell文件上传用户文件 → Web目录越权用户身份 → 未正确检查资源权限CSRF用户身份 → 非预期业务请求因此学习 Web 安全最重要的不是背 Payload而是建立一种稳定的分析框架第一步找到输入点 第二步追踪数据流 第三步寻找危险操作 第四步检查安全边界 第五步验证漏洞影响 第六步提出修复方案当你能够看到一个接口就自然想到输入在哪里 权限在哪里 数据去了哪里 谁可以调用 服务器怎么处理这时你才算真正开始进入 Web 安全的世界。三十一、写给正在学习网络安全的同学网络安全学习最容易出现的问题就是今天学SQL注入 明天学XSS 后天学Linux 大后天学Kali 然后开始迷茫真正合理的方法应该是网络基础 ↓ Linux ↓ 编程 ↓ Web原理 ↓ 漏洞原理 ↓ 靶场实践 ↓ 源码审计 ↓ 自动化 ↓ 真实项目安全不要一开始就追求“高级”。先把最基础的 HTTP、Linux、Python、SQL、JavaScript 学明白再逐步深入。因为所有看起来复杂的安全漏洞最终都可以拆解成一些非常基础的技术问题。当你真正理解这些基础之后很多漏洞就不再神秘。结语Web 安全是一个需要长期积累的方向。漏洞会变框架会变技术栈会变攻击方式也会不断变化。但底层逻辑不会轻易改变理解协议 理解系统 理解代码 理解业务 理解数据流 理解权限这也是网络安全工程师真正的核心能力。对于初学者来说与其每天寻找“最新漏洞利用”不如先花时间把HTTP Linux Python SQL JavaScript Web架构这些基础打牢。当基础足够扎实之后你会发现漏洞不是需要死记硬背的知识而是系统设计出现问题之后自然产生的结果。文章标签