打好基础:先理解系统和网络
刚接触漏洞利用时,很多人急着找工具、跑 exploit,结果连程序为什么崩溃都解释不清。真正的起点其实是搞明白计算机怎么运行程序、网络如何传输数据。比如你在家里用手机连 Wi-Fi,请求一个网页,这个过程中数据是怎么封装、发送、被服务器处理的,这些底层逻辑要清楚。
推荐先学操作系统原理,了解进程、内存布局、堆栈这些概念。再补一补 TCP/IP 协议族,知道三次握手、HTTP 请求结构。这些知识看起来“不直接”,但当你分析缓冲区溢出或 SSRF 漏洞时,会发现它们才是判断问题根源的关键。
掌握编程与调试技能
不会写代码,很难真正理解漏洞。C 和 Python 是两条腿:C 帮你理解程序底层行为,Python 用来快速编写测试脚本。比如尝试自己实现一个简单的栈溢出 demo,就需要用 C 写个有 gets() 调用的函数,然后用 gdb 单步调试,看 EIP 是怎么被覆盖的。
调试工具必须上手。gdb 配合 peda 或 gef 插件,能让你看清寄存器变化和内存分布。Windows 下可用 x64dbg。别只看教程截图,得自己一步步操作。就像修车不能光看视频,得亲手拧螺丝才行。
从常见漏洞类型入手
Web 安全是大多数人进入漏洞领域的入口。SQL 注入、XSS、文件上传、命令注入这些经典类型必须练熟。比如在一个本地搭建的 DVWA 环境里,手动构造 ' OR 1=1-- 这样的 payload,观察数据库返回的变化,比用 SQLmap 直接扫更有收获。
每个漏洞类型都要问三个问题:触发条件是什么?攻击载荷长什么样?防御机制如何绕过?比如文件上传,后缀检查可以改包绕过,内容检测可能用图片马躲过,这种实战思路只能在反复试错中积累。
深入二进制安全:迈向高级利用
当 Web 层面的漏洞玩得差不多了,可以往二进制方向走。Pwnable.kr 和 pwnable.tw 上的小题目很适合练手。从最简单的 format string 到 ret2libc,再到 ROP 链构造,每一步都需要精准控制程序流。
比如一个典型的栈溢出利用:
from pwn import *
r = process('./vuln')
payload = b'A' * 72 + p64(0x401156) # 覆盖返回地址
r.sendline(payload)
r.interactive()这段代码不是魔法,而是基于对栈帧布局的准确计算。每次调试失败,可能只是偏移差了几个字节,这种细节必须靠耐心调出来。
关注真实世界中的漏洞案例
GitHub 上有很多公开的 CVE 复现项目,比如 Log4Shell(CVE-2021-44228)的利用过程。自己搭个 Java 环境,用 JNDI 注入触发远程加载类文件,整个链条走一遍,比背一百条理论都有用。
还可以跟踪 HackerOne 的公开报告,看白帽是怎么从一个看似普通的输入点挖出严重漏洞的。有些报告里连时间线都记录了,能看到他们如何一步步试探、验证、提权,这种实战视角特别宝贵。
持续练习与信息更新
安全领域变化快,昨天还有效的 bypass 方法,今天可能就被补丁干掉了。定期刷 CTF 题目保持手感很重要。像强网杯、护网杯这些国内比赛的题目,往往贴近实际场景。
加入一些技术社区,比如看雪论坛、FreeBuf,关注几位靠谱的研究员博客。看到新披露的漏洞,别只看结论,试着反推:如果是我,能不能在补丁发布前发现它?这种代入式思考,才能把别人的经验变成自己的本事。