ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Web安全入门:从原理到手工验证再到工具,彻底摆脱脚本小子

Web安全入门:从原理到手工验证再到工具,彻底摆脱脚本小子 带过不少人入门 Web 安全也看过太多人从兴致勃勃到彻底卡死。最典型的画面是群里有人甩出一张 SQLMap 的截图问这个站怎么打下面跟着一堆低危洗洗睡换个目标吧。你会发现这类人几乎都有一个共同点——他们看不懂工具输出的每一行是什么意思不知道 SQLMap 报出的 payload 为什么长那样更不知道这条 payload 对应数据库后端执行了什么。说白了工具是别人写的思考也是别人替他做的他自己只是个按钮搬运工。这其实就是脚本小子最核心的画像也是把 Web 漏洞学习彻底带偏的起点。我自己早年也走过这段弯路后来带新人时反复验证了一条路径就是标题里说的先原理、后手挖、再工具。这篇文章不教你某一天挖到多少个洞而是把这条路径拆开讲透说清楚每一步到底该学什么、怎么练、用什么标准检验自己是否真的在往前走。适合刚入门 Web 安全、想系统学习漏洞原理的人也适合那些已经会用工具但总感觉在碰运气的初中级学习者。1. 脚本小子到底缺什么先认清问题再谈方法想摆脱一个身份得先知道这个身份的问题出在哪。很多人以为脚本小子就是不会写代码的人这个理解太浅了。实际上脚本小子和正经安全工程师之间最大的差距从来不是会不会编程而是缺一套判断漏洞是否成立的推理链路。1.1 工具的输出不等于漏洞的真相脚本小子最典型的操作流程是打开扫描器→点开始→看报告→有高危就欢呼没高危就换目标。整个过程里真正的判断环节是工具替他完成的他做的工作只是运行和汇报。问题在于工具的输出从来都是概率性的不是事实本身。扫描器报出一个 SQL 注入可能确实是注入也可能是 WAF 拦截后返回的假阳性还可能是参数本身带特殊字符导致的误判。低危中危的条目里同样混杂着大量需要人工确认的信息。如果你没有能力分辨这些那你拿到的就不是漏洞报告而是一堆待验证的猜测。这也是为什么很多人在 SRC 平台提交漏洞时被驳回——复制粘贴了工具的输出却说不清漏洞触发的完整链路。平台审核员问一句这个注入点在哪个参数、报错信息对应的 SQL 语句是什么他就答不上来了。1.2 学习路径的顺序决定天花板我观察过一个很有意思的现象同样是入门 Web 安全先学工具的人往往在三个月后就停滞了因为工具能测的漏洞类型就那么多扫不出新东西而先啃原理的人前期进度慢得让人着急但熬过两三个月后他们的漏洞发现能力会明显甩开工具依赖者一大截。这背后的逻辑不复杂。原理构建的是漏洞模型——你知道某种漏洞的本质是什么、在什么条件下成立、长什么样子。有了这个模型拿到任何应用你都可以用目光扫一遍先圈出可疑点再决定用什么手段验证。而工具依赖者拿到应用的第一反应是我能用什么工具扫思路完全是被工具列表框死的。打个比方。开手动挡的老司机换到任何一辆车都能开走因为他理解离合、油门、档位之间的配合逻辑。只开过自动挡的人换一辆车也可能懵因为他对车的理解建立在踩油门就走这一层。工具就是自动挡原理就是手动挡的机械逻辑。你可以一辈子开自动挡但如果你想成为修车师傅而不是一个乘客就必须先把机械逻辑吃透。1.3 这条方法论为什么是先原理、后手挖、再工具这套顺序不是拍脑袋定的而是由漏洞发现工作的实际流程决定的。原理帮你建立判断模型手挖让你把模型变成自己的观察力和验证力工具最后作为自动化手段接入放大你的效率。三步缺一不可顺序也不能反。先原理解决漏洞是什么的问题。看到代码或流量时你脑子里要能浮现出数据的流向和处理过程。后手挖解决漏洞怎么确认的问题。在没有任何辅助的情况下你能通过请求和响应之间的差异一步步推理出漏洞是否成立。再工具解决效率怎么提升的问题。当你已经能手工独立完成判断工具就是你的加速器而不是你的大脑。顺序反了会怎样直接用工具你省掉了前两步的思考工具报什么你就信什么。出了误报你分不清漏报你更不知道。为什么漏报因为你根本不知道这个漏洞类型在目标上应该长什么样子工具没报你也就过去了。2. 原理这关怎么过不是背 Payload而是理解数据怎么越界很多初学者学漏洞原理时特别喜欢收集 Payload 字典什么 XSS payload、SQL 注入 payload、命令执行 payload存了一堆好像拥有了武器库。但真到用的时候会发现payload 是死的目标是活的——过滤了拼接逻辑变了payload 就失效了。原理学习的核心不是背 payload而是理解为什么这些输入会导致漏洞。2.1 用数据流向理解 Web 漏洞的本质你可以把所有 Web 漏洞统一成一个模型输入数据在某个环节被当作另一类东西执行了。拿 SQL 注入举例。一个登录框用户名输入框的本意是接收字符串数据然后放到 SQL 语句里做字符串比较。但如果代码是这么写的SELECT * FROM users WHERE username admin AND password 123456这个语句里的admin和123456都是用户输入拼进去的。如果开发者直接用字符串拼接那么用户在用户名里输入admin OR 11整个语句就变成了SELECT * FROM users WHERE username admin OR 11 AND password 任意由于OR 11恒为真这条查询直接绕过了密码校验。这里的本质是用户输入的字符串被拼进了 SQL 语法的执行上下文里数据变成了代码。所以注入类漏洞的根源都在一个点数据与指令没有分离。开发者把用户输入当成了可信数据去拼接结果输入被解释成了指令。理解到这一层你再去看 SQLMap 的 payload就不是在看一串乱码而是在看攻击者如何利用拼接点改变 SQL 语句的执行逻辑。2.2 XSS 也是同一套模型的另一个场景XSS 看起来和 SQL 注入完全不同但本质模型一模一样。一个搜索框用户输入关键字页面把它回显到 HTML 里。如果回显时没有转义用户输入scriptalert(1)/script这段字符串就被浏览器当成了 HTML 标签和 JS 代码执行。同样是数据变成了代码只不过这次是数据变成了前端代码。理解了这套模型你会发现一个问题漏洞原理的学习重点根本不是记种类而是追踪一条数据从输入点到执行点的完整路径。输入在哪、中间经过什么处理、最后在哪被解析执行把这条路走通了任何注入类漏洞在你眼里都没有秘密。2.3 怎么高效地啃下原理这块硬骨头原理学习最大的障碍是枯燥。我不推荐任何人抱着 OWASP Top 10 的 PDF 从头看到尾我自己试过前二十页就睡着了。比较有效的路径是这样的抓包看真实流量。用 Burp Suite 或者浏览器开发者工具观察自己访问网站时的每一个请求参数、响应头、Cookie 字段。这是理解网络交互最直观的方式。搭一套本地靶场。DVWA、Pikachu、WebGoat 都行靶场的代码里有注释有源码你可以边测边看代码对着理解数据流向。这一步比看十篇文章都管用。配合基础语言知识。不要求你成为开发高手但至少要能读懂 PHP、Java 或者 JavaScript 的基本语法。因为看漏洞本质就是在看代码——它拿到输入做了什么。带着问题学。每学一个漏洞类型先问自己三个问题输入点在哪处理过程是什么输出在哪里被解释执行把这三个问题梳理清楚原理基本就通了。我给新人的要求是每个漏洞类型能在白纸上画出它的数据流向图就算过关。画不出来说明原理还没吃透。2.4 原理阶段最容易踩的坑有两个坑几乎每个初学者都会踩。一个是看懂了就以为自己会了——原理看视频、看文章每一步都懂关掉页面就忘。破解方法只有一个合上教程纯凭记忆复述一遍复述不出来就是没学会。另一个是陷入底层细节出不来——有人学 SQL 注入非要先去把 MySQL 底层索引原理搞清楚结果半个月过去了还在数据库原理上打转。记住你学的是 Web 漏洞不是数据库内核学到能理解拼接导致语法改变这个层面就够了再深的东西等用到时再补。3. 手挖的核心是验证不是不用工具手挖这个词容易被误解成回到石器时代所有东西都手工搞。其实不是。手挖不是说完全不用任何工具而是强调核心判断链路必须由你亲手完成。浏览器是工具Burp Suite 是工具但关键的那几个判断动作——这个参数有没有注入、注入类型是什么、能不能进一步利用——你得能自己确认。3.1 一次手工 SQL 注入判断的完整思路以 SQL 注入为例我把手工判断的思路拆给你看你就明白验证两个字的分量了。假设一个商品详情页URL 长这样http://target.com/product.php?id123第一步判断这个参数有没有可能进数据库。往id后面加一个单引号http://target.com/product.php?id123如果页面报了数据库错误或者行为异常说明这个参数很可能参与了 SQL 语句拼接。如果页面完全正常可能被过滤了也可能参数本身没进 SQL。第二步判断注入点的类型。用AND 11和AND 12分别测试http://target.com/product.php?id123 AND 11 -- 页面正常 http://target.com/product.php?id123 AND 12 -- 页面异常或无结果两组请求的结果不同说明我追加的 SQL 逻辑真的影响了后端查询数字型注入基本成立。如果结果没区别再试字符型加单引号闭合http://target.com/product.php?id123 AND 11 http://target.com/product.php?id123 AND 12第三步确认数据库类型和注入方式。通过报错信息、注释符差异、联合查询的列数判断ORDER BY n逐个试探确定是联合注入、报错注入还是盲注。这一步一步走下来每一步都是请求→响应→推理→下一个请求。工具能直接告诉你答案但手工做一遍你才能真正理解答案是怎么来的。3.2 逻辑漏洞为什么只能手挖注入类漏洞还有工具可以自动化检测但有一类漏洞是绝大多数工具完全无能为力的那就是逻辑漏洞。越权访问、验证码绕过、支付金额篡改、订单状态跳转、密码重置流程漏洞——这些漏洞没有任何特征码它们藏在一个应用的业务流程里。打个比方注入漏洞像一张写错的计算公式谁都能看出不对劲逻辑漏洞像是流程审批里空了一环只有理解整个业务流程的人才能发现这里本来应该卡一下但没卡。逻辑漏洞的发现依赖的是你把自己代入开发者视角一条一条捋清楚每个业务环节的数据流转和权限校验。最典型的是越权测试登录一个普通账号拿到一个资源 ID然后尝试用这个 ID 去访问另一个账号的资源如果后端没有校验归属关系就存在越权。这个测试过程不需要任何扫描器只需要浏览器和修改请求的工具。但你需要理解为什么这里需要校验归属——这就是原理。3.3 手挖训练的是漏洞嗅觉手挖练久了你会有一种很难言传的感觉。看到一个登录框你会下意识想用户名和密码是怎么校验的是查数据库还是走接口错误提示会泄露什么信息看到上传功能你会想后端有没有校验文件类型校验是在前端还是后端文件名是怎么处理的这种看到功能点就自动展开可能漏洞点的直觉我管它叫漏洞嗅觉。它没法从工具里练出来只能在一次次手动构造请求、观察响应、验证假设的过程中沉淀。有了这种嗅觉你会从一个等工具报告问题的人变成一个主动寻找可疑点的人这是职业分水岭。4. 工具的正确打开方式让工具替你执行而不是替你思考到了这个阶段你已经具备了原理基础和手工验证能力终于可以讨论工具了。我强调终于因为在错误的阶段引入工具工具就是陷阱在你已经能手工判断的阶段引入工具工具就是利器。4.1 工具的实质是原理的自动化以 SQLMap 为例。我在前面手工做了三步判断——加单引号看报错、用AND 11/12看差异、用ORDER BY探列数——SQLMap 做的就是这件事只不过它把这些步骤自动化了并且内置了更多的 payload 变体和指纹识别逻辑。但请注意SQLMap 能判断注入点的逻辑和手工判断的逻辑是同源的——它也是通过对比响应差异来猜测是否存在注入。这意味着它也有盲区。比如它内置的 payload 字典是固定的如果你的目标使用了自定义的过滤逻辑把 SQLMap 的常见 payload 变体全部挡掉了而手工构造的 payload 恰好绕过了过滤SQLMap 就会漏报。我遇到过一次很典型的情况。一个目标把AND和OR之类的关键字直接过滤成了空字符串SQLMap 默认 payload 全被吃掉报未检测到注入。但我手工测的时候随便做一个简单的算术表达式拼接注入就验证了注入点存在。那个 SQLMap 漏报的注入最后是手工确认并提交的。工具不是万能的它只是把你已知的攻击模式自动化了。4.2 工具的定位信息收集与批量验证那么工具到底在哪些环节最好用我的理解是三个场景。信息收集阶段。目录扫描、子域名枚举、指纹识别、端口扫描这些工作重复性高、规则明确交给工具效率极高。比如dirsearch扫目录、whatweb识别指纹几秒钟能覆盖人工要几个小时的工作量。已知漏洞类型的大范围检测。当你有了一批目标、都想测一下是否存在某个已知漏洞时手工一个个试不现实用工具批量打一遍把命中的挑出来再手工复验这是最佳姿势。重复性验证和利用。已经手工确认了漏洞后续的自动化利用比如 SQLMap 拿到库名表名可以交给工具降低你的重复劳动。把工具放在这三类场景里它才是你的仆人而不是主人。一个值得记住的原则是工具负责扩大覆盖面你负责缩小焦点。4.3 工具误报的坑为什么必须手工复验每一个结果提到误报我想多讲几句。不少新人拿扫描器一跑看到一堆高危就兴奋地截图发圈。但实际漏洞评估里扫描器报告的可信度是要打问号的。有一个坑我在实战里反复遇到目标前端加了 WAF恶意请求被拦截后返回一个假的成功页面或者特殊的响应码扫描器检测到响应差异误判为注入点。如果不做手工复验直接拿着工具报告去提交轻则被驳回重则在授权范围外惹出麻烦。手工复验工具结果的流程很简单拿到一个疑似注入点回到前面第三步的手工验证法自己加 payload 看响应。你自己能确认的才算漏洞工具说的一律当待验证线索处理。这个习惯建议从第一天就用上。4.4 工具依赖症的典型表现与纠正工具依赖症有几个典型的临床表现你可以对照自查一下。打开目标第一反应是上什么工具而不是这个功能点可能存在什么问题工具的扫描报告只有结论没有过程你解释不了每条漏洞的触发原理换一个场景比如从传统 Web 换成小程序、App 的接口立刻不知道从哪里下手因为之前的工具用不上了如果中了三条里的两条说明工具已经变成你的天花板了。纠正办法很简单也很残酷强制自己一个月不用扫描器所有漏洞发现全部手工完成。这一个月会很难熬你会发现自己在一点点抠响应差异、看前端代码、构造请求但熬过去之后你再看工具那感觉完全不一样。5. 一条可执行的自我训练路径从零到不完全依赖工具前面讲了方法论最后给一条参照用的训练路径。每个阶段我给个时间参考和验收标准你可以根据自己每天可投入的实际时间做调整但顺序不建议打乱。5.1 阶段一打地基建议 2-4 周目标是搞清楚 HTTP 协议、Web 应用基本组成、常见数据流走向。不需要太深能回答这几个问题就算过关一次完整的 HTTP 请求从浏览器发出到服务器返回经过了哪些环节GET、POST、Cookie、Session、Token 分别是什么、干什么用的一个典型的 Web 应用由前端、后端、数据库组成数据是怎么在它们之间流动的学习材料用 MDN 的 HTTP 文档加 W3School 的入门教程就够了配合浏览器开发者工具的 Network 面板实际观察几次请求效果比纯看书强得多。验收标准就是不看任何资料能对着一次实际请求从头到尾讲清楚它的每个字段。5.2 阶段二靶场手挖训练建议 2-3 个月这个阶段是整个路径的绝对核心。选一套靶场推荐 DVWA难度梯度合理或者 Pikachu漏洞类型全还有代码审计把所有漏洞类型逐个过一遍。重点是每一关都按手工验证的方式去过工具一律不许用。具体操作方法是每一关先不看源码尝试手工触发漏洞记录你触发的每一步和判断依据然后打开源码对比你的理解和实际代码逻辑。如果发现你理解的触发链路和代码实际行为不一致要么重测要么查资料搞清楚差距在哪。一个漏洞类型完全吃透的标志是不看源码能独立复现漏洞并且写得出漏洞 Report——包括输入点、处理逻辑缺陷、输出利用方式、修复建议。这个阶段最考验耐心因为每过两三天就会遇到一个卡住你一整天的点。但请记住所有卡住的时间都是在为后面的快积累铺垫。5.3 阶段三工具接入与真实场景过渡长期靶场阶段用骨骼需求工具自然要入场了。但不是以后靠工具了而是有了工具效率加倍。这个阶段的训练建议分两条线并进。一条线是做 SRC安全响应中心漏洞挖掘——各互联网公司的 SRC 平台都有授权范围是安全的练兵场在上面练手还能拿积分另一条线是复现历史公开漏洞去 GitHub、漏洞库找公开的 CVE 分析文章和靶场镜像自己搭环境复现一遍理解真实世界漏洞长什么样。同时要开始学习代码审计。很多人觉得代码审计是高级技能其实它是漏洞原理的自然延伸——你能读懂代码了就能直接从代码里发现漏洞根本不用黑盒测试。从审计简单的 PHP 项目开始再到 Java 的 Spring 项目这条路可以一直走下去。5.4 三个检查清单帮你随时确认自己有没有走偏训练过程中我建议你每两周对自己做一次检查回答下面几组问题。拿到一个漏洞报告我能不看工具日志完整讲清楚漏洞的触发链路吗如果讲不清楚说明我还停留在工具告诉我这里有洞的阶段。关掉所有自动化工具我还能在靶场里独立挖出三四个漏洞吗如果不行说明手挖的基本功还不扎实工具入场太早了。遇到一个新的漏洞类型我有没有能力自己去看官方文档、读代码把它搞明白如果凡事要等教程说明还没形成独立学习能力。这三条是硬指标不是自我感觉。我见过不少人练了半年自己感觉挺好一上考场——让他在一个没跑过工具的站上手动找漏洞——立刻露馅。所以定期做减法强制自己离开工具是对抗自我感觉良好的最有效手段。一些想啰嗦的话写了这么多其实最想传达的就一句话Web 漏洞学习这件事慢就是快。以我个人的实际经验凡是上来就抱着工具不放的基本都会在两三个月的瓶颈期放弃因为工具已经挖不出新东西了而他们又没有能力自己找新思路。反过来那些安下心先啃原理、再花大量时间做手工验证的人熬过最初两个月的枯燥期之后后面几乎是一路顺风的。最后分享一个小技巧是我带新人时一直在用的。每周挑一个漏洞类型不看任何资料从零开始用笔记软件写一篇自己的原理总结——不是抄书是自己组织语言把数据如何越界、为什么能越界、怎么验证、怎么修复讲清楚。讲得清楚就是真的懂了。写不清楚的地方恰恰就是下周要补的功课。这个方法朴素到没有技术含量但效果比收藏一百篇精华帖都实在建议你试试。
返回列表