ARTICLE DETAIL

资讯详情

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

漏洞挖掘的核心不是工具是思路:教你构建一张可落地的攻击面地图

漏洞挖掘的核心不是工具是思路:教你构建一张可落地的攻击面地图 同样一套授权测试的目标两个背景差不多的新人一起开工一个把漏扫工具挂在那跑了一上午回来盯着报告里几百条告警逐条点开看最后筛出来几个实锤还得靠运气另一个先摸清了系统有哪几个角色、每个页面能干什么半小时后已经把越权修改他人资料的复现步骤贴到了群里。差距不在工具不在运气而在脑子里的思路是不是一张能落地展开的攻击面地图。这篇文章不讲具体某个漏洞的一百种绕过姿势那玩意儿速查文档里全是。我想聊的是漏洞挖掘思路本身——你面对一个陌生系统脑子里应该先跑起来哪几条线每一步在找什么为什么同一份功能清单在高手眼里全是机会。内容主要面向三类人刚入行想打SRC但一直不出洞的、从开发转安全测试想建立体系化思路的以及在靶场上刷了很多题但实战时不知道从哪下手的。看完你能有一套能直接拿去用的执行框架而不是又多收藏了一份漏洞列表。1. 扫了一整天零收获问题不在工具在读的姿势很多人的漏洞挖掘是从拿工具扫开始的。这不丢人我自己也这么起步。但你要先接受一个反直觉的事实漏洞不是扫出来的是读出来的。工具只是你读的时候顺手借来放大某些信号的放大镜不是挖洞的主体。1.1 漏扫工具为什么只是粗筛漏扫工具的工作原理本质上是拿已知漏洞的特征库去匹配目标的响应。你发一堆构造好的请求看目标回什么、报什么错、超不超时然后跟库里的指纹比对。这套逻辑对付中间件漏洞、框架漏洞、一些特征极其明显的注入点确实有效但它有一个致命前提目标的行为必须符合特征。一旦参数经过了编码、拼接、二次签名或者整个请求体是个加密的JSON结构工具基本就瞎了。SQLMap跑不出注入不是因为目标没注入而是因为注入点在加密参数的另一侧工具连第一步识别出这是个参数都做不到。更不用说那些藏在业务逻辑里的越权、流程绕过、价格篡改——这类漏洞根本没有一个URL特征可供匹配工具连问题都提不出来遑论报给你。所以我把漏扫定位成粗筛的第一道工序它的产出不是漏洞列表而是值得人工重点看的候选清单。你如果直接把它的报告当结论那你永远只能捡到别人捡剩的、工具能发现的那类洞。真正让甲方愿意给高分的漏洞十有八九要人工去读去推。1.2 高手人肉解释器式的读法那高手到底在读什么我接触过的业务线安全测试做得好的人都有一个共同习惯他们在脑子里会把程序重新解释一遍。一个参数传进来之后经过了哪些函数被拼进哪个查询输出的时候有没有转义中间有没有身份校验——这些在代码审计里是明文在黑盒测试里就要靠经验反推。这套人肉解释器的读法核心就一句话不把目标当成一个URL列表而是当成一个由输入、处理、输出组成的系统。你要先知道这个系统会做什么再去想它哪里可能做错。就像修理工拿到一台机器先看它有哪些部件、哪些地方有传动再说哪儿容易坏。你上来就敲敲打打那叫盲修不叫排查。理解了这一点后面所有的思路都有了落点。你不是在猜哪里有洞而是在顺着程序处理数据的方式找它做错的地方。2. 数据流追踪把每个输入当成嫌疑人过一遍数据流追踪是漏洞挖掘最重要的一条主线没有之一。它的逻辑极其朴素漏洞的本质就是用户可控的数据到达了一个不该到达的敏感位置。SQL注入是数据到了SQL语句里XSS是数据到了HTML里命令注入是数据到了系统命令里文件读取是数据到了路径拼接里。你把这个过程反过来想挖掘思路就变成了从前端每个入口进来的数据最终能流到哪里去2.1 脏数据的定义来自哪里决定信任等级我们要追踪的脏数据有个更准确的说法叫用户可控输入。用户可控不是说只有登录框和搜索框才算任何你能影响的东西都算——HTTP头里的Referer、Cookie、X-Forwarded-For上传文件的文件名下载接口的路径参数导出报表的格式参数甚至时间戳这些全是输入面。判断一个数据值不值得追踪标准只有一个它有没有可能被用户改变能被改变它就带着不可信标签流向敏感操作时没有被过滤、校验、鉴权就是漏洞。很多开发者有个惯性误判觉得这个参数是服务端生成的用户改不了于是放松了校验。但服务端生成不代表客户端拿不到登录态里的角色字段存在Cookie里、支付金额放在前端隐藏域里——这些全是被反复打烂的经典案例。2.2 五步追踪法每步都问一句话我在实际测试里把数据流追踪固定成了五个动作每个动作对应一个必问的问题枚举入口这个页面/接口一共接收了哪些输入凡是你见到的参数全部列出来别放过后面的查询参数和消息体。标记不可信数据哪些输入是真正用户可控的服务端生成的、签名校验过的、经过白名单映射的放一档裸奔进来的Query参数、路径参数、请求头重点盯。跟踪处理链路这个数据被赋值给了哪个变量有没有经过过滤、编码、类型转换过滤了是过滤到什么程度replace之后有没有二次解码找敏感出口这个数据最终有没有流入数据库操作、文件操作、命令执行、页面输出、URL跳转、反序列化这些位置流到了就要验证之前的过滤在这里还成不成立。判断边界限制中途有没有权限校验校验是放在读操作之前还是之后是校验了对象归属还是只校验了登录态这套流程我建议你直接抄进自己的笔记模板里以后每测一个目标都按这个走一遍。刚开始会觉得慢一两个星期后就会变成下意识动作。到后面你拿到一个接口列表扫一眼就能在脑子里标出几个重点参数因为每一步的问法你已经滚瓜烂熟了。2.3 常见的敏感出口清单顺着上面五步最后一步肯定落在敏感出口上。我把高频出口整理成了一个小表测试时对照着用数据库操作拼接SQL、MyBatis里用${}、Spring JPA里的原生查询、报错信息带出查询语句文件与路径下载文件的file参数、导出报表的文件名、上传后的文件存储路径、包含文件时的路径拼接命令与代码执行ping工具类功能、后台任务调度的命令参数、动态表达式解析页面输出用户昵称/标题/评论直接渲染进HTML、模板引擎关闭了自动转义URL与跳转登录后跳转、第三方回调、短链接生成的target参数反序列化入口内容类型为JSON/XML的接口配合栈数据、会话存储里的Java对象重要操作读他人数据、修改数据、删除数据、修改订单状态之类的高价值动作看到没所谓哪都有漏洞翻译过来就是哪都有数据流的终点。你不需要记住成百上千种攻击姿势只需要盯着数据流能不能从入口一路淌到敏感终点中间那一段有没有人拦。这一个视角建立起来你再看一个Web应用视角就完全不一样了。3. OWASP Top10反着用攻击面枚举的最实用翻译OWASP Top10这东西很多新手当知识背背完上了实战还是不知道搜什么关键词。我后来想通了一件事Top10的正确用法不是当目录背是当翻译器用。你把每个漏洞类型翻译成一串我要去哪里找的动作它才能真正驱动你的手工测试。3.1 把漏洞类型翻译成去哪里找Top10类别翻译成攻击面找法优先去的地方访问控制失效找能对他人数据做操作的接口逐个换身份试订单详情、个人资料编辑、文件列表、所有带ID的接口加密失败找敏感数据传输与存储的裸奔点密码重置链接、Cookie内容、接口返回的身份证/手机号注入找用户输入拼进解释器的位置搜索框、排序字段、导出功能、任何带条件的清单接口不安全设计找流程可被跳步/重放的位置多步骤流程、验证码、状态流转接口安全配置错误找默认页面、错误信息、多余功能目录列举、调试接口、Swagger文档暴露XSS找用户输入直接回显的位置昵称、标题、富文本、导出文件的HTML/XML结构认证失效找登录、找回密码、会话管理的逻辑点登录接口、验证码逻辑、JWT过期与密钥软件和数据完整性失效找反序列化、不校验签名、不校验依赖完整性的位置复杂对象参数、插件加载、上传更新包日志与监控不足找高危操作是否无感知登录失败、越权尝试、异常参数是否留下痕迹SSRF找服务端带URL去访问的功能图片代理、URL预览、Webhook、PDF生成、导入远程文件这张表不是让你背是让你在功能盘点阶段直接照着划拉一遍目标每个功能点落在哪几行就在那里开展后续测试。3.2 认证与会话第一个要打的地方登录、注册、找回密码、验证码、会话管理这几个模块几乎是所有Web应用攻击面里最优先的区域。原因很简单它们在身份边界上逻辑一旦出错直接影响整个系统的可信度。具体找的时候我一般分两条线。第一条线是认证逻辑本身验证码是不是前端校验的、校验完还能不能重放、找回密码的验证码存不存在爆破面、密码重置链接是不是可预测的、登录接口对错误次数有没有限制。第二条线是会话生命周期退出登录后Cookie有没有失效、两个设备之间会话是否相互独立、改密码后旧会话还在不在、JWT里的alg是否被强制为你可控的算法。这两条线跑下来即使找不到高危也基本能评估出一个目标在身份边界上的防御水平为后面的测试提供判断依据。3.3 越权换个身份把每个接口再走一遍越权是我个人认为性价比最高的漏洞类型。它不要复杂的利用链不需要绕过过滤就靠换个身份再点一遍这一个动作。你拿账号A操作一个功能抓包改成账号B的资源ID或者直接换账号B的Cookie访问本来不该看到的消息如果接口没有做对象归属校验越权就出来了。水平的越权看别人能不能动你的数据垂直的越权看低权限能不能做高权限的事。测试方法在同一套流程里先列接口再拿不同角色身份各跑一遍。这里有个容易被忽略的坑很多越权接口只在Web端做了菜单隐藏接口层完全没有权限校验。你直接拿低权限的Cookie请求管理员接口返回正常数据就是垂直越权返回403再试试把请求方法从GET换POST、加一个X-Forwarded-For头说不定就绕过去了。3.4 输出与文件脏数据的落脚点最后一类攻击面在输出侧和文件侧。输出侧最典型的是存储型和反射型XSS——用户输入被存进数据库又在管理后台原样渲染出来这种洞在后台类系统里非常常见。我挖到过好几次这样的情况前台过滤了一堆关键词后台却连最基本的HTML转义都没做导致一个低权限用户能在管理员浏览器里执行脚本。文件侧要关注的是下载、上传、导入导出这几个功能。下载接口的路径参数能不能穿越上传接口后缀校验能不能被大小写、双扩展名、换行符绕开导出功能是不是把用户输入直接塞进了生成的文件名。还有一类容易被漏掉的是PDF生成、图片处理这类功能里用户输入混入HTML模板的情况这种洞一旦存在往往还是存储型XSS或SSRF的入口。4. 比分值更馋人的在Top10之外业务逻辑漏洞猎杀手记如果你打了一阵子SRC会发现真正上高分榜的洞一大堆不在OWASP的经典列表里。它们长得一点都不像教科书漏洞却直接影响业务安全越权改价、跳过支付、无限领取优惠券、用过期凭证重置他人密码。这类漏洞统称业务逻辑漏洞也是我目前最喜欢挖的类型为什么因为它的思路一旦打开不需要什么高级利用手法纯粹拼的是你对这个业务流程的理解深度。4.1 逻辑漏洞四个高发场景按我自己的经验业务逻辑漏洞集中在四个场景越权操作用户A看到用户B的信息、改掉用户B的资料。本质是对象归属校验缺失这在所有逻辑漏洞里最容易批量发现。价格与数量逻辑提交订单时的商品价格、优惠金额、积分抵扣这类参数直接从前端传入服务端不加校验地采用。验证码与频率控制发送验证码接口不限制频率验证码不失效、不绑定会话导致接口被爆破或被恶意刷量。状态机绕过一个多步骤流程比如下单→支付→发货→确认收货服务端不校验当前状态是否合法直接跳到任意步骤也能成功。这四个场景背后有一个共同特征开发时只考虑了正常用户按正常路径操作的情况没有考虑用户故意不走寻常路的情况。4.2 反向操作法把正常流程走完再一步步拆掉约束挖逻辑漏洞最有效的一套姿势我管它叫反向操作法。第一步自己先把正常的业务流程完完整整走一遍——下单、付款、申请退款、重置密码每一步把请求记录下来搞清楚状态依赖。第二步把流程拆成一个个约束条件哪个参数是服务端下发的、哪个校验是前端完成的、哪一步要求先做哪一步。第三步逐个破坏约束条件看会怎样改掉价格参数、跳过某一步直接调用最后的接口、把同一个请求重放一百遍、把验证码填成旧的再试一次。关键是要保持如果我是个坏人我会怎么贪这个便宜的思维方式。我自己每次测试都强迫自己问一句这个业务里用户最想占的便宜是什么是多拿优惠、是少付钱、是看别人的私密信息还是跳过麻烦的流程找到这个最想要的便宜再去找对应的接口逻辑漏洞基本就藏不住了。4.3 为什么逻辑漏洞评级普遍偏高但新手反而少见逻辑漏洞评级高的原因很直接它造成的损失通常是直接的资金损失、大规模数据泄露或者核心业务被扰乱而不只是技术层面的信息暴露。一个SQL注入点可能最终只拖出一张用户表一个越权却可能导致全量订单详情被遍历下载甲方不傻。但新手挖得少一个原因是工具完全帮不上忙另一个原因是思路惯性。很多教程把漏洞挖掘讲成了对着参数做变形新手于是执着于Payload花样忽略了业务流程本身。其实业务逻辑漏洞是最不需要技术含量的——我靠着一套流程的反向操作产出的高危数量比闷头刷注入多得多。它拼的是耐心和设身处地的代入感不是谁更会写Payload。5. 一条完整挖掘链路的复盘从授权目标到漏洞报告光讲方法论容易飘我拿一个典型的授权测试项目走一遍完整流程让你看看前面说的思路是怎么落到实处的。假设目标是一个业务后台系统你有合法的测试授权范围限定在该系统的Web端和API接口。5.1 信息收集的取舍不是越多越好是有用就行信息收集很多人走了误区非要绕到子域名、旁站、C段去挖但授权范围通常只允许你测指定资产这一步要特别注意合规。在范围内做信息收集我的优先级是先从入口页面提取JS文件、接口文档、功能菜单把系统有哪些功能搞清楚再关注登录方式、是否有验证码、是否有第三方登录然后留意接口返回里的额外字段比如订单详情接口多返回了一个userId这就是后面越权测试的线索。信息收集的目标不是收集几百个URL而是画出一张系统能干什么的功能地图。地图画完你就可以给这些功能点排优先级了。5.2 功能点分级把高价值动作排在最前面拿到功能地图之后把所有功能点分成三档涉及资金、订单、支付、个人敏感信息的高价值目标排第一档涉及修改类操作、用户数据交互的排第二档纯展示类页面和信息查询排第三档。测试时优先打前两档不要一上来就对着展示页面死磕XSS。这轮功能点分级也是你分配精力最关键的决策。很多萌新把测试时间浪费在大量低价值页面上挖到个反射型XSS还挺高兴实际在SRC评级里往往只算低危。把同样的时间花在高价值接口上概率完全不同。5.3 验证与报告复现三步走和报告四要素当你顺着前面思路找到一个可疑点时别急着高兴。验证阶段我遵循三步走第一确认完全靠自己控制的条件能稳定复现不是偶然第二站在影响面角度评估——能读到多少数据、影响多少用户、需要什么前置条件第三想一下有没有更严重的利用方式比如一个信息泄露点能否升级成越权甚至RCE。报告撰写上一份合格的漏洞报告只讲四件事漏洞描述用一两句话说清问题本质复现步骤从登录开始每一步怎么操作、请求改了什么参数、目标返回了什么都写清楚影响评估说清攻击者能利用它拿到什么修复建议给出可落地的修法。影响评估这块是报告评级的核心写不明影响面甲方只会当作普通bug忽略。6. 把思路练成肌肉记忆靶场、清单、AI助手思路这东西光看会不等于会用得靠练。就像打球你听一百遍重心压低不上场捡几回球根本找不着感觉。漏洞挖掘也一样好在现在练习靶场和学习资源足够多关键是练法要对。6.1 靶场怎么练从有思路到无意识不同阶段的靶场选择可以分层。新手期推荐DVWA和Pikachu这种自带漏洞说明的靶场目的是把漏洞原理和现象对上号成长期可以刷sqli-labs这类按类型深度练习的进阶期就去打综合靶场或公开的CTF赛题因为你要自己从乱糟糟的功能点里筛选可疑位置这更接近实战状态。不管练哪个靶场我都建议你强迫自己走完整流程先画功能地图再标敏感出口然后才动手测。哪怕你知道这个靶场里一定有SQL注入也逼自己先走一遍数据流追踪而不是直接上sqlmap。靶场是训练思路的地方不是刷成绩的地方。6.2 建立自己的Checklist库把经验固化下来我自己的笔记里有一个持续迭代的Checklist库分两大类一类是入口与出口检查清单对应数据流追踪的五个动作和敏感出口清单另一类是业务场景攻击清单按功能场景维护比如支付场景要测价格篡改、优惠券重放、订单状态跳步会员场景要测越权查看、头像上传、资料修改。每测完一个目标我都会把新发现的不常见测试点补充进去。这个库跟了你半年之后你会发现越来越值钱——很多测试思路你已经可以无意识地跑出来因为你的脑内攻击面地图本身就是活的。6.3 AI辅助挖掘把重复劳动扔给工具说句实话现在AI辅助漏洞挖掘已经不算新鲜事了我也是重度用户。我的用法有三块一是让AI辅助读代码——把可疑的代码片段丢给它让它标出变量从输入到敏感函数的路径相当于一个加速版的人肉解释器二是让AI生成测试用例比如拿到一个参数列表后让它批量生成边界值、编码变体和逻辑覆盖用例省去手写的时间三是让它辅助写报告把复现步骤整理成结构清晰的描述。但这里有个原则必须讲清楚AI可以帮你提高效率但不能替你形成判断。最终的漏洞确认、影响评估、修复建议必须建立在你对系统的真实理解上。AI给出的分析只能当参考不能直接当结论否则被它误导了你连错在哪都找不回来。6.4 合规边界所有技巧的前提最后这点必须说透。前面讲的每一招每一式前提都是你在授权范围内测试。合规的红线非常清晰目标资产在授权名单里测试方式在合同约定范围内数据不做超出必要范围的留存漏洞报告走正规渠道提交。SRC平台、众测平台、授权渗透测试项目这些都是合法的入口。超出授权的测试不管技术上多精彩都没有任何讨论价值。我在带新人的时候反复讲一句话漏洞挖掘这行技术可以慢慢练思路可以慢慢养但合规意识是从第一天就要焊死在脑子里的。守住这条线你才能一直干下去也才对得起你发现的每一个问题。回到开头那个场景。同样是测同一套系统为什么有人能五分钟定位到越权有人扫了一天一无所获不是天赋不是运气而是前者脑子里有张持续运转的攻击面地图数据从哪来、流到哪去、哪些出口没有守卫、哪些流程可以跳步。这套思路不是天生的它就是靠一次一次走流程、一次一次复盘、一次一次把checklist做得更细慢慢刻进肌肉里的。你照着这套框架练上两三个月再回头看你之前测过的那些目标会发现自己看到的东西完全变了。
返回列表