一次价值十元人民币的攻击:我的公益网站漏洞悬赏计划实战复盘

一条绕过WAF的SQL注入探测请求静静躺在Nginx日志里,它背后是一位跃跃欲试的安全测试者,而我正在思考该为这份“努力”支付多少报酬。


01 初心与疑虑

去年一月,我决定为自己维护的个人公益图片库启动一个漏洞悬赏计划。这不是一时冲动,而是一种纠结后的妥协。

作为独立开发者,我知道安全的重要性,但专业的安全审计远远超出我的预算。一个念头浮现:何不拿出象征性的几美元,看看能否吸引到志愿者的注意?

很快我意识到,在安全领域,几美元不仅买不到专业测试,甚至可能传递出“我不重视安全”的错误信号。我将预算提高到了一点,并设计了一套详细的规则。

我明确了攻击目标仅限公开的API端点,严格禁止对服务器基础设施的测试。更关键的是,我定义了清晰的漏洞标准:需要证明能“使服务不可用超过10分钟”或“成功绕过程序逻辑消耗大量资源”。

02 技术布局与防线

在发布悬赏前,我完成了一个关键的技术布局:将悬赏页面本身部署在Cloudflare Pages上。

这意味着攻击者阅读规则时,实际上在与一个静态的、无法被攻破的页面互动。而我真实的API后端,则隐藏在安全配置之后。

这种分离是战略性的。即便页面被频繁访问,我的核心服务也能安然无恙。悬赏页面成了吸引火力的“诱饵”,真正的战场被我预设在后端防线上。

一周后,我正式发布了这个计划,等待着未知的测试者到来。

03 第一波信号:2000次“围观”

发布后几小时内,监控数据让我吃了一惊——那个静态的悬赏页面已经收到了超过2000次请求。

这些请求分布在全球各地,User-Agent五花八门,从常见的浏览器到一些我认不出的工具标识。有趣的是,我的后端API日志此时却异常安静。

我意识到,这大概率是自动化扫描器在“阅读”我的规则。它们在提取关键信息:那个名为 tutu.php 的API端点地址。真正的攻击还在排队中。

这段时间成了宝贵的战备窗口。我再次检查了WAF规则,确保所有SQL注入、XSS攻击的防护都处于“阻止”模式,并为API端点设置了严格的速率限制。

04 真正的试探:五条攻击记录

几天后,预期的攻击终于出现在Nginx日志中。来自IP 103.xxx.xxx.xxx的测试者开始了系统性的探测。

第一条记录显示他尝试了SQL注入:id=1' REGEXP '.*'。这是在测试我的数据库是否会对异常输入做出非预期响应。

紧接着是id=1' IN ('1'),另一条经典的SQL注入探测语句。

然后他转向命令注入尝试:id=|id,看是否能通过管道符执行系统命令。

第四条记录更有意思:path=/.env。他在寻找可能泄露敏感信息的配置文件。

最后,他展示了一点技巧:id=1'/**/REGEXP/**/'.*',用注释符试图绕过简单的关键字过滤。

所有这些请求都收到了相同的响应:302重定向,5字节的响应体。我的应用层防御生效了,将它们全部导向了无害的路径。

05 对抗升级与封锁

这位测试者显然没有放弃。不久后,他的行为触发了Cloudflare WAF的更高级别防御。

我收到了系统生成的拦截通知,显示同一个IP因“提交SQL命令或畸形数据”被阻止访问。页面上显示着那段熟悉的封锁信息:“Sorry, you have been blocked…”

此刻,我面临一个决策点。根据我设定的严格标准,他的所有尝试均未造成实际影响——没有服务中断、没有资源耗尽、没有数据泄露。

然而,他的确遵循了我的规则:只针对公开API,没有攻击基础设施,且进行了真实的技术尝试。更重要的是,他的测试验证了我的防御体系是有效的。

06 十元人民币的博弈

经过权衡,我决定采取一个折中方案:发放10元人民币的“参与奖”。

这笔钱背后的逻辑是多层次的。首先,它承认了测试者的努力,尽管这努力没有达到奖励标准。

其次,它是一个明确的信号:我看到了你的行为,我欣赏按规则行事的测试者,但这样的测试水平还不够。

第三,也是最重要的,这是一种安全博弈。无偿的测试可能让测试者感到“徒劳无功”,进而可能转向恶意攻击。小额报酬则维持了关系的平衡,减少了这种风险。

与发放奖励同步,我在Cloudflare控制台拉黑了他所使用的VPN服务的整个ASN。这个决定同样基于清晰的逻辑:他的测试已被定性为低价值的自动化扫描,继续接收这类流量只会浪费我的日志存储和监控资源。

07 技术复盘与防御验证

回顾整个事件,从技术角度我得到了几个关键验证:

我的 “静态页面+受保护后端”架构被证明是有效的。2000次前端页面请求没有对后端造成任何压力。

WAF规则工作正常。所有攻击特征明显的请求都被准确识别和拦截。

应用层的默认安全设置(返回302重定向)起到了最后防线的作用。即使请求绕过WAF,也未能造成实际损害。

日志监控体系让我能够实时观察到攻击的发生和模式。没有这种可见性,我根本无法做出基于证据的决策。

08 对独立开发者的启示

这次经历让我对个人项目的安全建设有了更深刻的认识。

明确的规则比高额奖金更重要。我花在完善漏洞定义和禁止条款上的时间,最终帮助我清晰地判断了测试结果。

分层防御是必须的。没有单一的技术能解决所有问题,但WAF、应用层防护和监控的组合可以应对大多数情况。

透明化处理安全事件可以建立信任。我决定公开这次事件的经过,既是为了记录,也是为了向未来的测试者展示:我是一个严肃、专业且公平的项目维护者。

最后,我意识到安全是一个持续的过程,而非一次性的测试。这次悬赏计划只是一个开始,它让我了解了外部视角如何看待我的系统,也让我对真实的网络威胁有了直观感受。

那十元人民币的参与奖尚未被领取,它静静地躺在我的账户里。但我觉得这笔钱花得值——它买来的不仅是几次测试,更是一堂关于网络安全的实战课,以及对一个独立开发者如何平衡开放与安全的深刻思考。