注册白帽子快一年了,一直没正经交过漏洞。不是不想,是总觉得「自己还不够格」——直到上个月,我对自己说:别等了,动手吧。

三周时间,我跑了三个项目:一家金融科技公司、一家物联网硬件厂商、一个视频平台。三家公司,三种完全不同的安全成熟度,三种截然不同的测试体验。这篇文章是这二十一天的完整复盘——踩过的坑、用过的方法、以及最重要的,那些 SRC 不会在公开文档里告诉你的潜规则。

开篇:从注册到实战

一切开始得很简单:在 漏洞盒子 注册白帽子身份,签署 SRC 保密协议,然后从已授权的测试目标列表里挑了三家看上去「能啃得动」的。

选目标有讲究——我挑了三个行业跨度大的,不是为了找洞更多,而是为了在最短时间内接触最多的技术栈。金融科技大概率有严格的合规要求,IoT 厂商的安全投入通常偏弱,视频平台则介于两者之间。事实证明,这个判断基本准确。

拿到授权后,第一件事不是扫端口,而是建一个项目文件夹、一个笔记文档、一个方法论 checklist。每测一个点就勾掉一项,发现新思路就追加到 checklist 里。这个习惯在后来的项目中救了我很多次。

SRC 测试不是黑客电影里的「一个命令黑进去」,而是一场信息搜集的持久战。谁的信息更全,谁的胜算更大。

资产发现方法论

我的资产发现流程分为四步,按顺序执行,每一步产出的结果作为下一步的输入:

步骤工具产出
1. 子域名枚举(被动)Subfinder, 证书透明度日志原始域名列表
2. DNS 解析与筛选MassDNS + 自定义解析脚本可解析域名列表
3. HTTP 存活探测httpx存活 Web 资产列表
4. 截图与指纹识别gowitness + 自定义指纹库可视化资产地图

手动跑一遍这些步骤很费时,于是我写了一个 pentest-recon.cjs 脚本把它们串起来:

// pentest-recon.cjs — 自动化资产发现流水线
// 用法: node pentest-recon.cjs target.com

const { execSync } = require('child_process');
const fs = require('fs');

const target = process.argv[2];
const dir = `./recon/${target}`;
fs.mkdirSync(dir, { recursive: true });

// 1. 被动子域名枚举
console.log('[1/4] 被动子域名搜集...');
execSync(`subfinder -d ${target} -o ${dir}/subdomains.txt`);

// 2. DNS 解析
console.log('[2/4] DNS 解析...');
execSync(`massdns -r lists/resolvers.txt -t A ${dir}/subdomains.txt -o S > ${dir}/resolved.txt`);

// 3. HTTP 存活探测
console.log('[3/4] 存活探测...');
execSync(`cat ${dir}/resolved.txt | awk '{print $1}' | httpx -silent -o ${dir}/alive.txt`);

// 4. 截图
console.log('[4/4] 截图...');
execSync(`gowitness file -f ${dir}/alive.txt -P ${dir}/screenshots`);

console.log('✅ 完成,结果在 ' + dir);

自动化之后,我的工作模式变成了:跑脚本的时候去喝杯咖啡,回来对着截图和资产列表开始真正的分析。重复劳动交给机器,脑力留给需要判断力的地方——这是我这三周最大的效率提升。

自动化不是为了取代你,而是为了让你在真正需要判断力的时候精力充沛。

技术栈指纹识别

拿到存活资产后,下一步是搞清楚对面跑的是什么。你连对面用的什么技术都不知道,怎么找漏洞?

我的指纹识别三板斧:

三家项目的技术栈对比如下:

维度金融科技IoT 厂商视频平台
Web 服务器TengineNginxOpenResty
前端框架umi.js (4MB)Vue SPANuxt.js
后端语言Java (Spring)PHPGo
配置中心Apollo无自研
WAFAlibaba Cloud WAF无自定义 WAF (412)
Cloud Provider阿里云腾讯云混合云
登录方式短信 + 密码手机号 + 验证码OAuth + WBI 签名

看到这个表的时候,我心里对三个项目的安全水位已经有了个大概的判断。金融科技有合规压力,但业务复杂容易留漏洞;IoT 厂商技术栈简单,但安全投入最少;视频平台技术栈最复杂,WAF 是自研的——说明他们真有安全团队在维护。

前端 JS 反编译的意外收获

这是我这三周学到的最重要的方法,没有之一。

现代前端应用打包出来的 JS 文件,尤其是 SPA,几乎包含了整个前端应用的「地图」:路由路径、API 端点、内部域名、甚至有时候硬编码的密钥和注释。

我的做法很简单:

金融科技项目的前端 JS 里,我翻到了一个支付系统的路由模式——代码里定义了一系列 routeXXX 格式的支付路由路径,虽然不是直接漏洞,但让我对业务逻辑有了全局视图。

IoT 厂商的项目才是真正的金矿。一个 4MB 的 umi.js 文件里,我找到了 8 个内部环境域名:

# 从 umi.js 提取的内部域名
api-dev.xxx.com         # 开发环境 API
api-test.xxx.com        # 测试环境 API
api-pre.xxx.com         # 预发布环境 API
api-internal.xxx.com    # 内部 API
admin.xxx.com           # 管理后台
admin-dev.xxx.com       # 开发管理后台
mqtt-dev.xxx.com        # MQTT 开发服务器
oss-internal.xxx.com    # 内部对象存储

最让我惊讶的是,预发布环境 api-pre.xxx.com 公网可访问,而且和生产环境运行着同样的代码和数据库——只是数据量少一些。这相当于一个完整的「影子系统」暴露在公网上,没有任何额外的访问控制。

但是,这里有个重要的教训:JS 包里的信息越多,说明这家公司的安全成熟度越低。反过来,视频平台的 JS 包经过混淆,路由全是 hash 模式,API 端点做了动态拼接——他们显然知道前端 JS 是信息泄露的重灾区,做了针对性的防护。

JS bundle 是信息泄露的富矿,但它的存在本身就是一面镜子——照出这家公司对安全的认知水平。

API 鉴权与 CORS

资产摸清了,技术栈知道了,接下来是真正的测试环节。

支付 API 鉴权绕过

金融科技项目里,我发现一个支付状态的查询接口,不加任何身份凭证,直接 POST 请求就能返回业务数据。返回的 result: 0 表示业务成功——不是 401、不是 403,是业务层面的成功。这意味着支付流水号如果可预测或可遍历,就能批量获取交易信息。

这个漏洞,是我唯一一个拿到确认排期的。

CORS 配置缺陷

在金融科技和 IoT 项目上,我都发现了 CORS 配置问题:

Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true

通配符 + 允许凭据,这是教科书级别的 CORS 配置错误。但问题是——我能拿它做什么?

理想情况下,配合一个已登录用户访问恶意页面,攻击者可以跨域读取敏感数据。但在 SRC 的语境下,你只证明了「CORS 配置有问题」,却没有证明「谁能通过这个漏洞受到什么实际损失」。SRC 审核团队给我的回复很明确:没有完整的攻击链,CORS 配置缺陷单独不予受理。

坑 1CORS 通配符单独提交 → 被拒

即使 Access-Control-Allow-Origin: * 和 credentials: true 同时存在,SRC 要求你证明这能造成实际危害。需要找到具体的用户敏感数据接口,配合 CSRF 或 XSS 构成完整攻击链。

✅ 教训:CORS 漏洞要和其他漏洞组合提交,单独提交会被拒。

坑 2DNS 内部 IP 泄露 → 被拒

在 IoT 项目的 DNS 记录里发现内部 IP 地址段,单独提交后同样被拒。SRC 认为内部 IP 泄露本身不构成可衡量的安全风险,除非能证明攻击者可以利用这些 IP 做进一步渗透。

✅ 教训:信息泄露类漏洞需要附带攻击路径,证明这些信息如何被利用。

坑 3预发布环境暴露 → 被拒

预发布环境可被公网访问,理论上可以获取未发布的业务数据和测试账号。但 SRC 认为预发布环境的数据是脱敏或非真实的,不构成用户数据泄露风险。

✅ 教训:预发布环境暴露通常被归为「低危」甚至「无风险」,除非你能证明生产数据也在上面。

这三个坑让我明白了一个残酷的事实:SRC 不是一个「找到漏洞就行」的地方,而是一个「证明漏洞有价值」的地方。同样是漏洞,能直接造成用户数据泄露或资金损失的,和「理论上可能被利用」的,在 SRC 的眼里是两种完全不同的东西。

SRC 审核团队不关心技术上的「可能性」,只关心业务上的「必然性」。翻译成人话:得证明这玩意儿真的能让人丢钱或丢数据。

安全成熟度横向对比

三家公司的安全水位差异巨大,我把它们放在一起对比,结论非常直观:

维度金融科技IoT 厂商视频平台
安全成熟度中等低高
WAF云 WAF(基础规则)无自研 WAF(412 拦截)
API 鉴权部分接口无鉴权基本鉴权均有WBI 签名 + 严格鉴权
CORS通配符 + 凭据通配符 + 凭据严格白名单
前端安全未混淆,含内部路由未混淆,含全部内部域名混淆 + hash 路由 + 动态拼接
Cookie 安全部分 HTTPOnly无 HTTPOnly全 HTTPOnly + SameSite
速率限制较弱无严格(单 IP 限频)
测试结果发现 1 个中危(已确认)发现多个信息泄露,部分被拒无发现

这个表格说明了两个问题:

提交策略与踩坑

三周时间,我提交了 5 个漏洞,确认排期 1 个,被拒 4 个。成功率 20%,惨不忍睹。但每一个被拒的漏洞都让我学到了一些东西。

什么会被拒

漏洞类型提交次数确认次数被拒原因
DNS 内部 IP 泄露10无实际攻击链
CORS 通配符20未证明能获取敏感数据
预发布环境暴露10预发布数据非生产数据
支付 API 无鉴权11—

什么才有效

从这些被拒的教训里,我总结出了 SRC 提交的「黄金法则」:

提交顺序的学问

我学到的另一个教训是提交顺序:

最终建议一份好的漏洞报告应该包含什么

📌 漏洞名称和影响范围
📌 复现步骤(含具体 URL 和请求参数)
📌 完整的 curl 命令(可以直接复制粘贴复现)
📌 请求/响应截图(标注关键信息)
📌 业务影响说明(为什么这是个问题)
📌 CVSS 评分(附评分向量)

✅ 格式清晰、信息完整、可复现——这是 SRC 审核最看重的三点。

结语

三周时间,三个项目,五个提交,一个确认。表面上看,这个成绩单并不亮眼。但对我来说,这二十一天的收获远不止一个漏洞确认——它让我建立了一套完整的白帽测试方法论,从资产发现到漏洞提交,每一个环节都有了自己的标准和流程。

几个核心 takeaways:

方法论还在迭代,手头的 pentest-recon.cjs 也在不断更新。下一步计划把这套流程整理成更完整的工具链,也计划继续挑战更多 SRC 项目——不为排名,就为了在实战中保持手感。

安全这条路很长,三周才刚开了个头。