ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

零基础到第一个漏洞:完整学习路线与实战复盘

零基础到第一个漏洞:完整学习路线与实战复盘

这年头,搞网络安全的人越来越多,但真正能从零开始、亲手挖到第一个漏洞的人,其实没那么多。我当初也是从完全不懂的小白起步,走了不少弯路,最后才在一家公司的测试系统里拿下第一个漏洞。今天这篇就把我整个从0到1的过程、用过的资源、踩过的坑,全部倒出来,希望对正在入门或者卡在瓶颈期的朋友有点帮助。

1. 学习路线与心态建设,先想清楚再动手

很多新人上来就急着装工具、跑扫描器,结果扫了一堆没啥用的东西,反而挫败感很强。我个人的经验是:漏洞挖掘不是靠工具堆出来的,而是靠“思路 + 经验 + 细心”拼出来的,工具只是放大你能力的杠杆。

1.1 零基础到底该学什么,不该学什么

我在最开始的阶段也乱学过一阵子,今天看这个教程,明天看那个课程,结果脑子一片浆糊。后来我总结出一条比较高效的路径,分三个阶段走:

第一阶段:网络基础 + 协议理解

这一步很多人会跳过,但我觉得恰恰是最重要的。你得先知道数据包是怎么发的、HTTP请求长什么样、Cookie和Session是干嘛的、TCP三次握手是什么,后面做任何测试心里才有底。我当时花了两周时间专门看网络相关的视频,把OSI七层模型、HTTP协议、DNS解析流程这些基础啃了一遍。一开始觉得很枯燥,但后来发现不管是挖漏洞还是看漏洞报告,这些底层知识全都是地基。

第二阶段:Web安全原理,逐个击破

Web漏洞是新手入门最容易出成果的方向,因为大部分系统都有Web入口,而且漏洞原理相对成熟、资料多。OWASP Top 10是必看的,SQL注入、XSS、CSRF、SSRF、文件上传、命令执行这几个大类,每个都要搞明白是什么、怎么产生、怎么利用、怎么修复。我看视频的时候不会光看,每个漏洞都会去靶场亲手打一遍,因为看得懂和打得进去完全是两码事。

第三阶段:实操靶场,把理论变成肌肉记忆

国内外的在线靶场我都用过,比如某开源漏洞平台自带的靶场环境、某知名的Web安全训练靶场,还有自己用虚拟机搭的本地实验环境。这个阶段不要贪多,每个漏洞类型至少练3到5遍,直到你看到某个参数就能条件反射地想到可能的漏洞类型。

1.2 新人最容易踩的三个心态坑

  • 坑一:追求工具数量,而不是精度。我曾经一口气装了十几个扫描器,天天看扫描报告,实际上大部分报告都是误报,把自己搞得特别焦虑。后来我改成每个阶段只用一两个核心工具,把它们的每种参数都摸透,效果反而好了很多。
  • 坑二:急于求成,想一口吃成胖子。有人看了一些漏洞报告就觉得“这也不难嘛”,结果自己去测的时候连目标的数据包都看不懂。这很正常,因为漏洞报告是别人把最关键的利用路径已经走通了,你再去看当然觉得简单。正确做法是:从攻击面的角度出发,自己去走一遍完整的信息收集和测试流程。
  • 坑三:只看不练,收藏夹吃灰。我的视频教程和学习笔记加起来有几个G,但真正让我进步的,不是收藏的数量,而是每一节我都跟着动手做。收藏100个教程不如把一个教程练10遍,这话是真的。

2. 核心技能拆解,漏洞挖不到的真正原因

很多人挖不到漏洞,不是因为不懂漏洞原理,而是不知道漏洞藏在哪。这一节我就把整个漏洞挖掘过程中最核心的几个技能环节拆开来讲。

2.1 信息收集,决定了你能看到多大的攻击面

信息收集是漏洞挖掘的第一步,也是决定上限的一步。你收集到的域名、IP、端口、目录、参数越多,能测试的入口就越多。我最早挖洞的时候,信息收集做得非常粗糙,就是拿到一个域名直接开扫,结果扫了半天也没发现什么。后来我才意识到,信息收集要有层次感。

我比较常用的信息收集流程是这样的:

  1. 子域名枚举:通过证书透明度日志、DNS字典爆破等方式收集目标的主域名、子域名、甚至一些老旧的测试域名。很多公司会遗留一些已经不维护的二级域名,上面跑着老旧系统,攻击面一下子就能打开。
  2. IP与端口发现:找到域名解析到的真实IP,判断是否有CDN防护;如果有,再看看能否通过历史DNS记录、邮件头信息等方式找到源站IP。端口扫描只扫常见高危端口,不是把所有端口都扫一遍浪费时间。
  3. 目录与文件探测:针对Web应用,用目录扫描工具去探测后台路径、敏感文件、备份文件、配置文件等。比如我曾经就遇到过某个系统根目录下留着一个带版本号的备份压缩包,点开之后直接拿到了源码,后面的测试就变成了代码审计级别的玩法。
  4. 指纹识别:识别Web服务器类型、中间件版本、开发框架。指纹识别能让你快速定位到目标可能存在的已知漏洞版本,比如某些老版本的框架有一堆公开漏洞可以直接打。

信息收集要记笔记。我会用专门的笔记软件建一个目标专用的页面,把域名、IP、端口、指纹、目录结果、截图全部整理在一起,后面测试的时候随时翻,效率提升非常明显。

2.2 漏洞原理要理解到“能自己写POC”的程度

漏洞原理最忌讳“大概知道”。比如SQL注入,很多人知道在参数后面加个单引号看报错,但不知道怎么判断报错是数据库返回的还是应用层拦截的,更不知道联合查询的字段数怎么判断。我对自己的要求是:每个漏洞类型都要能不看资料写出一个最简单的检测脚本。

以SQL注入为例,我当时给自己定了几个小目标:

  • 能解释注入产生的原因(拼接了用户输入到SQL语句里);
  • 能说出常见注入类型(联合查询、布尔盲注、时间盲注、报错注入)的区分方法;
  • 能手写一个Python脚本对目标URL做布尔盲注的检测;
  • 能把一个带注入点的Payload压缩到最短,规避简单的过滤。

当你达到这个程度的时候,你看到一个URL的传参方式,心里基本就有预判了。这个阶段会比较痛苦,因为要把原理揉碎了、用代码去表达漏洞逻辑,但一旦突破了,后面看很多漏洞报告就是降维打击。

2.3 一个思路:从功能点反推漏洞可能在哪里

观察目标系统的功能点也很重要。漏洞不会凭空出现在页面上,它藏在业务逻辑里。我习惯拿到一个系统先注册一个账号,把每个功能都用一遍,然后想一个问题:“开发这里是怎么写代码实现的?”

  • 搜索功能后端会不会拼接SQL?会不会把搜索词输出在页面上导致XSS?
  • 文件上传功能校验了后缀名吗?校验了文件头吗?解析漏洞能不能用?
  • 找回密码的逻辑里,验证码能不能爆破?重置链接有没有绑定用户?
  • 个人资料页面的头像地址能不能改成任意URL,让别人访问你资料的时候发出任意请求(SSRF)?

这种“功能点反推”的方法,比漫无目的地扫描高效得多,也更容易找到逻辑漏洞。我挖到的第一个漏洞,就是用这个思路在个人资料修改功能里发现的存储型XSS。

3. 实操过程,从信息收集到第一个漏洞的完整复盘

这一节我完整复盘我是怎么从拿到一个测试目标到最终确认漏洞的,整个过程比较典型,也比较基础,非常适合复现。

3.1 目标与授权说明

我测试的是一个模拟项目X,来自某教育和实验平台提供的授权靶标,它明确标注为可测试目标。我强烈建议,新手在实战之前一定要先确认授权,任何未经授权的测试都是违法行为,操作之前先确认自己有没有权限。我的整个流程是在授权的靶标环境下进行的,这里也提醒各位读者,技术是把双刃剑,一定要用在正途上。

3.2 第一步:信息收集与攻击面梳理

拿到目标之后,我并没有第一时间开扫,而是先用浏览器打开目标网站,看了看它是什么类型的系统、有哪些功能模块。这是一个站内应用,有一个公告栏、一个个人中心、一个文件下载功能。我先做了基础的信息收集,拿到了以下几个方面:

  • 主域名解析到一个固定IP,端口扫描显示只开放了80(HTTP)和443(HTTPS),说明运维做了端口收敛,没有多余的暴露面;
  • 子域名枚举发现了一个类似 “旧版演示环境” 的子域,解析到另一个IP,开放了8080端口,上面跑着一个看起来像是管理后台的页面;
  • 通过指纹识别,主站用的是某国产框架的旧版本,旧版演示环境用的是另一套老旧的开发框架,两个版本都有公开漏洞记录。

信息收集到这里,攻击面已经从一个主站扩展到两个站点。如果没有做子域名枚举,我可能就错过那个旧版演示环境了,这也是我做测试的时候每次都会把信息收集做扎实的原因。

3.3 第二步:逐个功能点测试,不放过任何输入框

我的习惯是先从登录前可访问的页面开始测,因为这类页面往往不鉴权,如果出现问题影响面更大。

第一步看的是公告栏。公告栏只能浏览,没有搜索功能,也没有提交入口。我用目录扫描工具对这个路径做了简单的目录探测,但没有发现什么有价值的东西。

然后我登录了一个普通测试账号,进入个人中心。个人中心的“修改昵称”和“个人简介”两个输入框引起了我的注意,因为这两个字段最终会被展示在用户的个人主页上,是明显的XSS测试点。

我先在昵称里输入了一段测试脚本,保存后访问我的个人主页,发现脚本被原样输出但没有执行。我又试了几种常见的绕过方式,比如修改事件属性、用编码变换等形式尝试绕过过滤,但都没有成功。这说明后端对危险字符做了基础的过滤。

3.4 第三步:换个思路,在文件下载功能里突破

主站的XSS没有成功,我没有纠结,转头去看文件下载功能。下载功能的URL格式大概是这样的:/download?file=xxx.pdf。看到这个传参方式,我第一反应就是:这个参数会不会存在路径穿越或者文件读取?

我先试了把参数从xxx.pdf改成正常的另一个文件名,能正常下载,说明参数是直接拼进文件路径里的。接着我尝试用../进行路径穿越,比如把参数改成../../../etc/passwd,结果服务器直接返回了文件内容!那一刻真的很激动,因为这意味着我可以读取服务器上的任意文件了。

我接着尝试了几个敏感路径:/etc/passwd读取成功、/app/config.php也读取成功。配置文件里没有数据库密码,但有一个绝对路径和一个日志路径。更关键的是,这个漏洞还让我看到了应用的部分源码结构。一个任意文件读取漏洞,直接升级成了信息泄漏和源码审计的入口。

3.5 第四步:确认漏洞并写报告

确认漏洞之后,我按照平台要求截了图、记录了测试时间、URL、Payload和漏洞影响,整理成了一份清晰的报告提交。提交之后很快就收到了确认消息,我的第一个漏洞就这样落地了。

整个过程回头来看,技术难度其实不高,路径穿越是一个很老的漏洞类型,但为什么能挖到?我觉得核心原因有两个:一是信息收集让我找到了多个测试入口;二是测试的时候我没有因为XSS失败就放弃,而是挨个功能点去试,把每个输入位置都过了一遍。

3.6 这个案例给新手的启示

  • 漏洞不一定在你最关注的点上。我花了最多精力去测XSS,结果突破口在文件下载上。所以测试过程中,不要因为某个类型的测试没结果就急躁,把功能点全覆盖才是正事。
  • 漏网之鱼就在你最常用的思路之外。路径穿越这个点,其实很多新手看到download参数不会深入去测,觉得“这就是下载文件用的”。但你多试一层,可能就多一个漏洞。

4. 学习资源与笔记方法,视频教程这样用效率最高

很多人手里存了一堆视频教程,但看完就忘。我分享一下我是怎么用视频和学习笔记配合,最大化学习效果的。

4.1 我筛选视频教程的三个标准

  • 标准一:有靶场实操,而不是念PPT。一个漏洞的讲解如果只是放几张截图,没有实际打开终端操作一遍,不仅催眠,而且你没法学到真正的测试过程。我看的教程里,比较好的都是直接打开本地靶场,把从发送数据包到看到漏洞效果的完整过程展示出来,而且每一条命令都会解释在做什么。
  • 标准二:有原理推导,而不是只给Payload。如果一个教程只给你几个现成的Payload让你复制粘贴,那你只能学会“用一个点”,一旦目标过滤了其中某个字符,你就不会玩了。好的教程会告诉你为什么要加引号、为什么要用注释符、为什么可以用某种编码绕过。
  • 标准三:有修复建议。我觉得看修复建议是最能提高漏洞敏感度的方法,因为它反向告诉你“代码怎么写的会出问题”。看多了修复方案,你再看到类似代码的时候,自己就能嗅到问题所在。

4.2 我的学习笔记模板

做学习笔记这事,我也摸索了很久。最早的笔记就是大段大段复制教程里的内容,后来发现根本没法复习。后来我把笔记改成下面这个模板,效率一下子上来了:

  • 漏洞名称:写清楚这个漏洞叫什么。
  • 产生原理:用自己的话写一遍,不许复制原文。写不出来的话说明还没理解透。
  • 触发条件:哪些条件满足的情况下这个漏洞才可能被利用。
  • 危害场景:攻击者利用这个漏洞能做到什么程度(读文件?改数据?拿权限?)。
  • 实操步骤:用步骤方式列出自己在靶场里的操作过程,关键Payload要贴进来。
  • 绕过思路:如果目标有过滤,常规思路不可行时可以从哪里绕。

一个漏洞一张卡片,复习的时候我只看卡片,基本能在几分钟内把一个漏洞从原理到利用串一遍。

4.3 关于视频教程的“倍速”建议

很多教程动辄几个小时,全是实操过程,二倍速看很容易错过关键细节。我的经验是:第一次接触一个漏洞类型,原速看完;复习时用二倍速看,只看操作流程,跳过废话。遇到看不懂的命令,我会暂停下来,手动查一下这个命令的每个参数是什么意思,绝不稀里糊涂地往下走。

4.4 笔记一定要自己整理,别用别人现成的

我也下载过别人整理好的“漏洞学习笔记”,文件很大、内容很全,但我基本没看过,因为那不是我自己消化的东西。后来我干脆不看别人的笔记,只从自己的实操里提炼卡片,虽然慢,但每张卡片都长在脑子上。学习笔记的价值不在于“全”,而在于“自己写得出来”。

5. 常见问题与排查技巧实录

入门过程中,每个人都会遇到各种莫名其妙的问题。这里把我遇到比较多的情况整理成速查表,帮你省点排查时间。

5.1 靶场打不通,各种报错怎么办

现象常见原因排查思路
靶场页面打开空白容器没有启动,或者服务没起来检查一下靶场的运行状态,确认端口是否监听
发送的Payload没任何反应参数名不对,或者注入点根本不在这个参数先看正常请求的返回,再对比修改后的返回差异
打开靶场提示数据库连接失败本地数据库没初始化重新执行一次数据库初始化脚本
扫描器跑完了全是误报目标带WAF,或者检测规则太敏感先用单个漏洞类型手工验证,不要让扫描报告带偏你
本地虚拟机连不上互联网DNS配置有问题检查虚拟机的网络连接模式是否能正常访问外网

5.2 你测试的时候“没有漏洞”的真相

很多时候,你测不出漏洞不是因为目标没有漏洞,而是因为这几种情况:

  • 你测的只是登录前的功能,而真正的漏洞在登录后的业务逻辑里。注册一个账号往往能让你看到更多攻击面。
  • 你的测试没有覆盖到所有参数。一个请求里可能有十几个参数,你只测了其中一个,当然发现不了问题。我当时挖到第一个漏洞之前,也出现过因为没测某个隐藏参数而错过一个注入点的情况。
  • 你忽略了信息收集的深度。有些漏洞只在特定目录下存在,如果你没做目录提取,压根不会访问到那部分功能。

5.3 踩过的坑:扫描器高并发把自己的IP封了

这个坑我说出来都是泪。有一次我为了节省时间,把目录扫描器的并发线程调得非常高,结果目标的安全设备直接把我当前网络出口的IP封禁了一段时间。从那以后,我给自己定了规则:目录扫描并发线程数控制在默认值以下,并且每次测试时长不超过规定范围,遇到有安全设备的系统更要降低频率。做测试和渗透,本质上是和防护方互相试探的过程,讲究的是隐蔽和节奏,而不是猛冲猛打。

5.4 提交漏洞报告时一定要写清楚什么

一份好的漏洞报告,会直接影响到漏洞是否被确认,以及漏洞等级的评定。我提交第一份报告的时候,平台审核人员反馈说我的报告写得不错,我自己总结了几个关键点:

  1. 漏洞地址和参数写清楚:精确到URL和具体参数名,方便复现。
  2. 复现步骤要完整:从打开浏览器开始,每一步要点哪里、输入什么、看到什么,都要写出来。如果复现步骤太跳跃,审核人员可能直接打回。
  3. 影响范围要客观:不要夸大,也不要缩小。比如任意文件读取能读到哪些敏感文件、会不会影响其他用户,这些要写清楚。
  4. 修复建议要有参考价值:哪怕写得简单,也比不写强。比如对文件下载功能来说,可以建议做白名单校验,拒绝包含路径穿越符号的请求。

6. 工具选型与环境搭建,把装备配齐但不炫技

工欲善其事,必先利其器。但这里我也强调一下:工具不是越多越好,而是够用就好。我工具链的组成非常精简。

6.1 我的常用工具清单

用途分类工具具体用途
信息收集子域名枚举工具收集子域名,扩大攻击面
信息收集网络请求工具手动发送HTTP请求、修改请求包观察响应
端口扫描网络端口扫描工具快速发现开放端口和运行服务
目录扫描目录爆破工具探测隐藏目录、备份文件和敏感路径
漏洞检测综合扫描器作为辅助验证,不依赖它的报告
漏洞利用浏览器开发者工具查看网络请求、修改前端逻辑、分析数据包
笔记工具本地笔记软件整理学习卡片和每个目标的测试记录

工具清单虽然简单,但每一个我都能熟练到不看帮助文档直接敲参数。有些朋友觉得工具多显得专业,实际上在真正测试的时候,频繁切换工具反而降低效率。

6.2 为什么我不建议新手一开始就依赖自动化扫描器

挖到第一个漏洞之后,我更加确信一件事:自动化扫描器适合做广度筛查,但真正要出成果,一定得靠手工验证。扫描器输出一堆误报,你如果不懂原理,根本分不清哪个是真的。我后来养成了一个习惯:扫描器扫出来的任何结果,我都手工重放一遍,确认返回包和响应差异,才把它写进报告。

这种“手工优先”的习惯也帮助我培养了对数据包的敏感度。现在看到一个请求,我不光能看懂它在干什么,还能快速判断哪些参数容易出问题、哪些参数是开发自己加的隐藏逻辑。

6.3 本地靶场的搭建经验

本地靶场是学习阶段最重要的设施,我用的方案是拿一台低配置的电脑装了虚拟化环境,在里面跑了几套开源靶场系统。搭建的时候有两个注意点:

  • 尽量模拟真实的网络拓扑,比如把靶场系统和攻击机放在同一个二层网络里,不要搞复杂的NAT,不然有些功能会因为网络模式问题出现诡异故障。
  • 给靶场系统拍快照,打坏了随时回滚,不用重新初始化,效率高很多。

7. 一些真心话,关于成长节奏与方向

从零基础到挖到第一个漏洞,我大概花了几个月时间,这其中真正裸奔的时间其实不长,但走了不少弯路。如果让我带着现在的经验重新走一遍,我会把时间分配得更科学:基础原理占三成,靶场实操占五成,信息收集方法占两成。因为信息收集是你整个测试过程的总开关,信息收集做得越好,能挖到东西的概率越高。而靶场实操是让你真正能把“看懂的”变成“会做的”。

很多人在学习的时候特别喜欢问“学这个有没有用”,我的回答是:对抗型的技术,学习的时候没有一步是白走的。你在信息收集里花的时间,会在某个目标的子域名里还给你;你在靶场里反复练习的注入技巧,会在某个真实系统的参数后面等着你;你踩过的每一个报错的坑,都会让你排障的时候更快一眼定位问题。

最后再分享一个小技巧

测试的时候,养成用不同角色账号测试的习惯。我之前挖到路径穿越的时候,用的是最普通的用户账号;后来我自己在另一套靶场里发现,有一些功能只有管理员账号才能看到,而这些管理功能往往权限更高、过滤更松,出漏洞的概率更大。注册不同权限的账号,分别去测试不同模块,能让你把一个站点的攻击面看得更立体。这也是我从第一份漏报里得到的最有价值的一条经验。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进