1. 项目概述:从“蚊子”到“恐龙”的质变之路
在安全圈里混久了,你肯定听过这样的抱怨:“现在找个高危漏洞太难了,全是些鸡肋的低危、中危,像蚊子咬一样,不痛不痒,甲方根本不重视。” 这话没错,单一的低危漏洞,比如一个反射型XSS,或者一个不痛不痒的信息泄露,在SRC(安全应急响应中心)的评分体系里,可能就值个几百块钱,甚至被判定为“无实际危害”而忽略。但今天我想跟你聊的,是一种完全不同的思路: 漏洞组合拳(Chain Exploit) 。这可不是什么新概念,但却是把那些看似弱小的“蚊子”级漏洞,通过精巧的串联,最终组合成能造成“恐龙”级破坏力的攻击链的核心技术。
简单来说,漏洞组合拳就是利用目标系统上存在的多个独立、看似危害有限的漏洞,按照特定的逻辑顺序依次触发,最终实现一个远超单个漏洞能力的攻击目标。比如,一个不起眼的用户枚举漏洞(低危)加上一个弱密码策略(中危),再结合一个权限绕过漏洞(高危),可能就能让攻击者从外部游客一路晋升为系统管理员。这个过程,就像用几块不起眼的积木,搭出了一座坚固的攻城塔。我之所以对这个话题感触颇深,是因为在最近的一次授权测试中,我们正是通过这种方式,将一个最初评分仅为“低危”的发现,最终演变成了一个涉及核心业务数据泄露的“严重”级别漏洞,价值翻了数十倍。这不仅关乎奖金,更关乎一种穿透表象、洞察系统内在关联的安全思维。
这篇文章,就是为你拆解这套“养成”战术。无论你是刚入行的安全新人,还是苦于挖掘深度不足的老手,掌握漏洞组合的思维,都能让你在SRC漏洞挖掘、渗透测试甚至红队评估中,看到别人看不到的攻击面,实现降维打击。我们会从核心思维讲起,一步步拆解如何发现、串联并验证漏洞链,并分享我踩过的坑和总结出的实战技巧。
2. 漏洞组合拳的核心思维与攻击面建模
2.1 从点到线再到面的思维跃迁
传统的漏洞挖掘,我们往往聚焦于“点”。看到一个输入框,就测试SQL注入、XSS;看到一个上传点,就测试文件上传。这是一种垂直的、深挖单点的思维。而漏洞组合拳,要求我们具备“连线”和“构面”的能力。
连线思维 ,是指寻找漏洞之间的因果关系或触发顺序。漏洞A的输出,是否能成为漏洞B的输入?触发漏洞B的前提条件,是否能由漏洞A来满足?例如:
- 场景一 :你先通过一个 信息泄露漏洞 (如JS源码泄露、目录遍历)获取了后端某个接口的路径和参数格式(漏洞A)。接着,你利用这个信息,对该接口进行 未授权访问测试 ,成功获取数据(漏洞B)。这里,A为B提供了必要的“情报”。
- 场景二 :你发现一个 修改密码功能 存在逻辑缺陷,允许不验证旧密码(漏洞A)。但该功能需要高权限令牌。同时,你发现一个 JWT令牌伪造漏洞 (漏洞B)。单独看,A需要高权限令牌,B能伪造令牌但不知道有什么用。组合起来:先用B伪造一个管理员令牌,再用A的缺陷修改任意用户密码。
构面思维 ,则是更高级的,它要求你对整个应用系统、甚至跨系统的业务流程有全局视图。你需要思考,攻击者的终极目标是什么(如获取数据库权限、控制服务器、窃取核心数据)?要达到这个目标,需要突破哪些层次的防御(网络层、应用层、数据层、权限层)?现有的这些分散的漏洞,分别能帮助攻击者突破哪一层?如何将它们有序地组织起来,形成一条完整的渗透路径?
注意 :构面思维不是一蹴而就的。它建立在你对常见Web架构(前后端分离、微服务)、常见中间件(Nginx, Tomcat, Redis)、常见权限模型(RBAC)的熟悉程度上。平时多积累各类漏洞的“利用链”案例,是培养这种思维的最佳途径。
2.2 攻击链建模:绘制你的“狩猎地图”
在开始测试前,我习惯先进行简单的攻击链建模。这不是一个复杂的流程,更像是在脑子里或者草稿纸上画一张图。
- 确定终极目标 :针对当前测试的系统,我最想拿到什么?是Webshell?数据库数据?还是内部网络访问权限?
-
枚举攻击路径
:从外到内,有哪些可能的路径?
- 路径一:外部用户 -> 突破Web应用 -> 获取服务器权限 -> 横向移动。
- 路径二:外部用户 -> 窃取普通用户凭证 -> 提升为管理员权限 -> 访问后台功能 -> 获取数据。
- 路径三:利用A系统的漏洞 -> 跳板到B系统(内网)-> 攻击B系统。
- 填充漏洞节点 :将你已发现或怀疑存在的漏洞,填充到这些路径的相应环节上。一个环节可能有多个候选漏洞。
- 评估串联可行性 :检查节点之间是否存在依赖关系。上一个漏洞的输出,是否正好能解决下一个漏洞的输入或条件限制?逻辑上是否通顺?
举个例子,在一次针对某OA系统的测试中,我的建模过程如下:
- 目标 :获取服务器上的所有员工通讯录(敏感数据)。
- 路径 :外部访客 -> 获得一个普通员工账号 -> 利用OA系统漏洞获取服务器文件读取权限 -> 读取通讯录文件。
-
已发现漏洞节点
:
- 节点1(获取账号):登录页面存在 用户名枚举漏洞 (通过响应时间差异可判断用户是否存在)。
- 节点2(获取账号):密码重置功能存在 验证码爆破漏洞 (4位数字,无锁定)。
- 节点3(权限提升):某报表导出功能存在 路径遍历漏洞 ,但需要已登录用户权限。
-
串联
:先用节点1枚举出一个有效用户名(如
zhangsan)。然后用节点2对该用户的密码重置验证码进行爆破,重置其密码,从而获得zhangsan的账号权限。最后,以zhangsan身份登录,利用节点3的路径遍历漏洞,尝试读取服务器上的/etc/passwd或Web目录外的通讯录文件(如D:/hr/contact.xlsx)。
这个简单的模型,立刻让三个孤立的中低危漏洞,变成了一条清晰的高危攻击链。
3. 常见漏洞组合模式深度解析
了解了思维模式,我们来看看实战中有哪些经典的“组合套路”。这些模式就像象棋里的“棋谱”,掌握多了,你看到漏洞时自然就能想到它的“搭档”。
3.1 信息泄露 + X = 威力倍增
信息泄露类漏洞(如源码泄露、配置泄露、目录遍历、错误信息回显)是组合拳里最好的“开场白”和“润滑剂”。
-
模式:源码泄露 -> 硬编码密钥/接口发现 -> 权限绕过或未授权访问
-
操作解析
:通过
.git泄露、DS_Store文件、备份文件(www.zip,bak)等获取源码。在源码中搜索password、secret、key、token、api等关键词,很可能找到数据库密码、加密密钥、内部API地址和密钥。 -
串联实例
:我曾从泄露的
config.php文件中找到数据库密码,但数据库无法外连。进一步搜索源码,发现一个用于内部健康检查的API接口/internal/health,该接口使用了硬编码的X-API-Key进行认证。利用泄露的Key,我直接访问了这个接口,该接口返回了详细的系统状态, 包括当前数据库连接信息和执行中的SQL语句 ,从而实现了从信息泄露到敏感信息获取的升级。 -
实操要点
:拿到源码后,不要只盯着一个文件。用
grep -r "password\|secret\|key" .这样的命令进行全局搜索。同时关注源码中的注释,程序员有时会在注释里写下测试账号、临时接口等信息。
-
操作解析
:通过
-
模式:错误信息泄露 -> 注入点发现/技术栈识别 -> 精准攻击
- 操作解析 :应用程序在报错时,如果回显了详细的SQL错误、堆栈跟踪信息,这本身就是一种信息泄露。更重要的是,它可以帮你 确认注入点的存在 和 数据库类型 。
-
串联实例
:在测试一个搜索功能时,输入单引号
‘,页面返回了MySQL的语法错误信息。这立刻确认了存在SQL注入漏洞(漏洞A)。从错误信息中,我还能看到部分SQL语句结构和表名。结合这些信息,我使用sqlmap进行自动化注入时,通过--dbms=mysql指定数据库类型,并利用--tables等参数直接针对疑似表名进行探测,极大地提高了利用效率和成功率。这里,信息泄露为后续的精准注入提供了“导航”。
3.2 逻辑漏洞之间的“化学反应”
逻辑漏洞往往存在于业务流程中,单个看可能只是让用户多领张优惠券,但组合起来可能掏空公司钱包。
-
模式:平行越权 + 数据篡改 = 垂直越权或数据破坏
- 操作解析 :平行越权(如通过修改ID参数访问他人订单)让你能操作 同级别 其他用户的数据。如果这个操作接口同时存在 数据篡改 逻辑漏洞(如前端校验后端不校验),你就可以修改关键属性。
-
串联实例
:在一个论坛系统中,发现修改个人资料时,提交的请求包中有
role=user参数。测试平行越权:将请求中的用户ID改为他人ID,可以成功修改他人头像(平行越权,漏洞A)。进一步测试,将参数role=user手动修改为role=admin并提交,后端竟然接受了这个修改,成功将他人的角色提升为管理员(数据篡改,漏洞B)。组合后,攻击者可以将任意普通用户提升为管理员,造成灾难性后果。 -
注意事项
:测试逻辑漏洞组合时,Burp Suite的Repeater模块是你的主战场。要系统地修改每一个可能代表权限、身份、状态的参数(如
id,uid,username,role,type,status)。
-
模式:验证码绕过/爆破 + 密码重置 = 账户接管
-
操作解析
:这是最经典的账户劫持组合。密码重置功能通常需要验证码或回答安全问题。如果验证码可被绕过(如直接删除请求中的
captcha参数)、可被爆破(长度短、无锁定)或安全问题答案可通过其他信息泄露途径获取,那么结合用户名枚举漏洞,就能接管任意账户。 -
实操细节
:首先,你需要确认用户名枚举漏洞是否存在。常见方法有:注册功能提示“用户名已存在”;登录功能在用户名正确和错误时,返回的
错误信息不同
或
响应时间有细微差异
(可用Burp Intruder的
Grep - Extract和响应时间排序功能来辅助判断)。获得有效用户名列表后,再对密码重置的验证码进行攻击。
-
操作解析
:这是最经典的账户劫持组合。密码重置功能通常需要验证码或回答安全问题。如果验证码可被绕过(如直接删除请求中的
3.3 前端与后端的“认知失调”
现代前后端分离的应用中,前端校验和后端校验不一致是高频问题源。
-
模式:前端限制绕过 -> 触发后端未过滤漏洞
- 操作解析 :前端通过JavaScript限制了上传文件的类型、输入框的长度或格式。但攻击者可以通过直接抓包修改请求,绕过这些限制,将恶意数据提交到后端。如果后端缺乏相应的校验,就会触发漏洞。
-
典型案例
:一个图片上传功能,前端只允许选择
.jpg,.png文件。但通过Burp拦截上传请求,将文件名test.jpg改为test.jpg.php,并将文件内容改为Webshell代码,成功上传并执行。这里,前端限制形同虚设,后端未做后缀名过滤和文件内容检测,两者结合导致了文件上传漏洞。 - 工具技巧 :熟练掌握Burp Suite的Proxy拦截和Repeater重放功能是基础。对于更复杂的场景,如前端通过JS生成Token或加密参数,需要用到Burp的 Logger 模块观察前端行为,或使用浏览器开发者工具的 Debugger 来跟踪JS执行流程,理解其生成逻辑,从而在重放时自行构造合法参数。
4. 实战演练:一条完整的“蚊子变恐龙”漏洞链挖掘实录
光说不练假把式。下面我以一个模拟的“企业知识库系统”为例,还原一次完整的漏洞链挖掘过程。假设我们只有低权限的普通员工账号。
初始状态
:拥有一个普通员工账号
emp01
,权限极低,只能查看文章,无法上传、编辑、管理。
终极目标 :获取服务器操作系统权限(Webshell)。
4.1 第一步:信息收集与初步侦查
登录系统后,首先进行常规信息收集:
-
浏览所有功能点
:使用
emp01账号浏览菜单,发现除了查看文章,还有一个“个人设置”和“问题反馈”功能。 - 抓包分析 :用Burp Suite代理所有流量。在“问题反馈”页面,发现提交反馈时,会上传图片附件。
-
查看请求/响应
:上传图片的请求发送到
/api/feedback/upload。响应中返回了文件的访问路径,如http://kb.company.com/uploads/feedback/20231012/abcdefg.jpg。 关键发现 :文件路径似乎是按日期目录存放,文件名看起来是随机生成的。
4.2 第二步:发现“蚊子”漏洞(可控文件名)
我尝试上传一个正常的JPG图片。然后,在Burp Repeater中重放这个上传请求,尝试修改文件名。
-
测试1
:将文件名
test.jpg改为test.php.jpg。上传成功,返回路径包含test.php.jpg。访问该链接,图片正常显示。说明后端可能只检查了后缀名,或者有简单的黑名单但.php.jpg绕过了。 -
测试2(关键)
:将文件名改为
../../../test.php。 上传失败 ,返回“非法路径”。说明有基础的路径遍历过滤。 -
测试3
:将文件名改为
test.php。 上传成功! 服务器返回路径为/uploads/feedback/20231012/random123.php。我立刻访问这个链接,浏览器提示下载,而不是执行PHP代码。这说明服务器没有将.php文件配置为可执行脚本,或者文件被存储在了无法通过Web访问的目录?但访问路径是Web可访问的。
此时漏洞评估
:这是一个
受限的文件上传漏洞
。我可以上传
.php
后缀的文件,但似乎无法执行。单独来看,危害很低,可能只能算一个“低危”或“中危”——攻击者可以上传一个钓鱼页面,但无法获得代码执行。这算是一只“蚊子”。
4.3 第三步:寻找“催化剂”漏洞(文件包含或解析漏洞)
既然能上传PHP文件但无法执行,我需要找到一个能“激活”它的方法。常见的“催化剂”是 文件包含漏洞 (Local File Inclusion, LFI)或 特定环境下的解析漏洞 。
-
搜索文件包含点
:在全站寻找包含文件的功能,如模板加载、语言包切换、下载功能(参数可能指定文件路径)。我测试了URL参数,如
?page=about,?lang=en,观察响应变化。 -
发现线索
:在查看文章详情时,URL为
/article/view?id=123。我尝试将其改为/article/view?template=default,页面报错,但错误信息中提到了“无法加载模板文件:default.tpl”。 Bingo! 这暗示可能存在一个文件包含的参数。 -
验证文件包含
:我构造参数
?template=../../../../etc/passwd。页面返回了经典的“No such file or directory”错误。我尝试使用空字节截断(老式PHP方法)?template=../../../../etc/passwd%00,无效。尝试使用PHP伪协议?template=php://filter/convert.base64-encode/resource=index.php。 成功了! 页面返回了一串Base64编码,解码后正是网站首页index.php的源码!
此时进展 :我发现了第二个漏洞—— 本地文件包含漏洞(LFI) 。利用它,我可以读取服务器上的任意文件(如配置文件、源码)。这本身就是一个高危漏洞。但我的目标是代码执行。
4.4 第四步:组合攻击,生成“恐龙”
现在,我有两个漏洞:
- 漏洞A(上传) :可以将任意文件(包括PHP文件)上传到服务器的一个已知Web路径下。
- 漏洞B(包含) :可以包含服务器上的任意文件,如果包含的是PHP文件,其中的代码会被执行。
串联攻击链 :
-
利用A上传Webshell
:我上传一个内容为
<?php system($_GET[‘cmd’]);?>的PHP文件,文件名为shell.php。假设上传后访问地址为http://kb.company.com/uploads/feedback/20231012/random456.php。记住这个服务器上的绝对路径,假设对应为/var/www/html/kb/uploads/feedback/20231012/random456.php。 -
利用B包含Webshell
:构造LFI的URL:
/article/view?template=/var/www/html/kb/uploads/feedback/20231012/random456.php。访问这个链接。 -
执行命令
:如果包含成功,PHP代码将被执行。现在,我可以通过cmd参数传递系统命令。尝试:
/article/view?template=/var/www/html/kb/uploads/feedback/20231012/random456.php&cmd=id。 -
结果
:页面上成功显示了
uid=33(www-data) gid=33(www-data) groups=33(www-data)。我获得了服务器上Web服务进程(www-data)的权限!
攻击链完成 :从最初一个只能上传PHP但无法执行的“鸡肋”上传漏洞(蚊子),通过结合一个文件包含漏洞(催化剂),最终实现了远程代码执行(RCE),获得了服务器权限(恐龙)。这个漏洞链的价值,远高于两个漏洞的简单相加。
4.5 第五步:权限维持与横向移动(拓展)
在真实场景中,拿到www-data权限后,工作还没结束。我会进一步:
-
信息收集
:执行
uname -a查看系统信息,cat /etc/passwd查看用户,ifconfig或ip a查看网络,寻找内网其他机器。 -
权限提升
:查找具有SUID权限的可执行文件(
find / -perm -u=s -type f 2>/dev/null),寻找内核漏洞(uname -a后搜索对应exp),尝试切换到更高权限用户。 - 部署持久化后门 :在Web目录写入更隐蔽的Webshell,在crontab或系统服务中植入后门。
- 横向移动 :利用当前服务器作为跳板,扫描和攻击内网中的其他系统。
5. 自动化与半自动化辅助工具链
手动挖掘和串联漏洞需要大量精力,合理利用工具可以事半功倍。这里不是教你完全依赖工具,而是如何让工具成为你思维的延伸。
5.1 信息收集与资产梳理工具
- Burp Suite (Professional): 核心中的核心。除了代理,它的 Target 模块能帮你自动梳理站点地图,清晰展示整个应用的所有目录、文件和参数。 Scanner 可以自动化检测一些常见漏洞,但其报告需要你人工复核和思考关联性。
- 浏览器开发者工具 (DevTools): 用于分析前端逻辑、网络请求、源码注释。 Sources 标签页查看JS文件, Network 标签页监控所有请求(特别是可能漏过代理的WebSocket或Fetch请求), Console 里有时会有调试信息。
-
子域名/目录枚举工具:
如
amass,subfinder,ffuf,gobuster。用于扩大攻击面,你可能在主站找不到漏洞,但在一个被遗忘的测试子域test.kb.company.com上发现了一个未修复的老漏洞,而它和主站共享认证或数据库。 -
GitHub/GitLab 监控:
使用
gitrob或手动搜索公司名、项目名,经常能发现员工不小心上传的含有密码、密钥的源码配置文件,这往往是突破内网的第一道口子。
5.2 漏洞关联分析与思维辅助
- 思维导图工具 (XMind, MindMaster): 在测试初期和中期,用它来绘制你的攻击面地图和漏洞关联图。将系统功能、已发现漏洞、猜测的潜在漏洞、外部资产都画出来,能帮你理清思路,发现隐藏的联系。
- 笔记软件 (Obsidian, Notion): 实时记录你的测试过程、请求包、响应片段、猜想和验证结果。好的笔记习惯能让你在复杂的测试中不至于迷失,也方便后续编写报告时回溯。
5.3 自定义脚本与Payload管理
-
Python/Go 脚本:
当你发现一个复杂的利用链需要多步操作时,手动操作容易出错且低效。例如,你需要先从一个接口获取Token,再用这个Token去访问另一个接口进行爆破。写一个简单的脚本自动化这个过程。
# 伪代码示例:自动化利用“用户名枚举+验证码爆破”组合 import requests # 1. 枚举用户名 users = [] with open('username_dict.txt', 'r') as f: for line in f: username = line.strip() resp = requests.post(login_url, data={'user': username, 'pass':'wrong'}) if '用户不存在' not in resp.text: # 根据实际错误信息判断 users.append(username) print(f"枚举到的有效用户: {users}") # 2. 对第一个有效用户进行验证码爆破 target_user = users[0] for code in range(1000, 10000): # 4位数字验证码 resp = requests.post(reset_url, data={'user': target_user, 'code': f'{code:04d}'}) if '验证成功' in resp.text: print(f"爆破成功!用户 {target_user} 的验证码是: {code:04d}") break - Burp Suite Extensions (插件): 如 Logger++ 记录所有请求用于回溯, Autorize 自动化测试越权, Turbo Intruder 处理需要高性能爆破的复杂场景。学会使用和编写Burp插件能极大提升效率。
6. 报告撰写与漏洞价值升华
挖到漏洞链只是成功了一半,如何清晰、有力地向甲方或SRC平台报告,证明其严重性,从而获得应有的评级和奖励,同样至关重要。
6.1 报告结构:讲一个好故事
你的报告不应该是一堆漏洞的罗列,而应该是一个逻辑严谨的“攻击故事”。
- 标题 :直接点明危害。例如:《关于XX系统通过文件上传+文件包含漏洞组合导致远程代码执行(RCE)的风险报告》。
- 概述 :用一两句话概括整个攻击链的起点、过程和最终影响。让审核人员一眼就明白严重性。
-
漏洞细节
:按攻击步骤,分点详细描述。
-
步骤一:受限文件上传漏洞
-
漏洞位置:
/api/feedback/upload -
漏洞描述:后端对上传文件后缀名校验不严,允许上传
.php文件。 - 证明:提供HTTP请求和响应原始数据包。
- 当前危害:可上传恶意文件,但无法直接执行。
-
漏洞位置:
-
步骤二:本地文件包含漏洞
-
漏洞位置:
/article/view的template参数。 -
漏洞描述:未对
template参数进行过滤,导致可包含服务器任意文件。 -
证明:提供读取
/etc/passwd或index.php源码的请求包和截图。
-
漏洞位置:
-
步骤三:漏洞组合利用
- 利用过程:首先上传PHP Webshell,然后通过LFI漏洞包含该Webshell的绝对路径,从而实现远程代码执行。
-
最终证明:提供执行系统命令(如
id,whoami)的请求包和结果截图。 这是最关键的证据!
-
步骤一:受限文件上传漏洞
-
影响评估
:
-
技术影响
:攻击者(低权限用户)可获取服务器
www-data权限,执行任意系统命令,读取、修改、删除服务器上所有Web目录及该用户权限下的其他文件。 - 业务影响 :可能导致核心知识库数据被窃取、篡改或删除,网站被植入后门、挂马,甚至作为跳板机攻击内网其他服务器。
-
技术影响
:攻击者(低权限用户)可获取服务器
-
修复建议
:
- 对上传漏洞:采用白名单机制校验文件后缀和MIME类型;对上传文件重命名(避免用户控制文件名);将文件存储在Web根目录之外,通过脚本代理访问。
-
对包含漏洞:避免动态包含用户可控的参数;如需动态包含,应使用白名单机制限制可包含的文件;升级PHP版本,禁用危险的PHP函数和伪协议(如
php://input)。
6.2 升华漏洞价值:从“中危”到“严重”
在SRC平台,审核人员可能最初只看到单个漏洞。你需要主动引导他们理解组合后的威力。
-
在报告中明确画出攻击链图
:用文字或简单图示清晰地展示
漏洞A -> 漏洞B -> 最终危害的流程。 - 强调“1+1>2” :在影响评估部分,明确指出单独漏洞A或B可能只造成有限影响(如文件上传只能传钓鱼页面,文件包含只能读文件),但两者结合直接导致了最高级别的远程代码执行。
- 提供真实的利用视频 :如果平台允许,录制一个从开始到获得Shell的完整视频。动态的演示比静态的文字和图片更有说服力。
- 类比已知高危案例 :可以提及此类组合(上传+LFI)在历史上导致过大量严重安全事件,属于经典的高危攻击模式。
通过这样一份结构清晰、证据链完整、危害阐述到位的报告,你就能成功地将一串“蚊子”漏洞,包装并证明为一只值得“严重”评级和高额奖金的“恐龙”。
漏洞挖掘的世界里,没有绝对的安全。一个看似坚固的系统,往往在组件间的缝隙处最为脆弱。组合拳思维,就是教你如何发现并撬开这些缝隙。它要求你不仅是一个技术的执行者,更是一个系统的思考者和攻击路径的设计师。下次当你再看到一个低危漏洞时,不妨多问一句:“它能和谁做朋友?” 也许,一只“恐龙”就在不远处等着你。

9612

被折叠的 条评论
为什么被折叠?



