加微信那天早上
10 月 24 号早上,我通过了一个好友申请。
对方是某游戏社区的站长。加上之后,他先做了个自我介绍,然后说「不用了」,第三句是「已经报警了」。
我当时还没反应过来,说「啊?我刚刚还打开看了一下」。
他说,官网已经打不开了。
十几天前
事情得从十几天前说起。
那天下午,我在用一个 AI 逆向工具练手,顺手把目标设成了一个游戏社区的站点。
一开始真的只是想看看。工具跑了一会儿,出来两个结果:一个是接口能把所有用户的信息拉出来,另一个是后台不用登录就能进。
我当时觉得这事挺严重的,得赶紧告诉对方。就在他常驻的平台给他发了私信,大意是:你们站有几个漏洞,可以拿到全部用户信息,后台也没有鉴权,希望早点修。
第二天他回了「收到」「感谢反馈」,中午问我要联系方式,说想沟通具体问题。我把微信二维码发了过去。
然后就没动静了。
十来天过去,我差不多把这事忘了。直到那天,我又看到他发来的消息,说想沟通处理这些漏洞。
当天晚上
看到消息之后,我当天晚上就把 ARTEX 打开了。
ARTEX 是个全自动渗透工具,你给它一个目标,剩下的它自己规划、自己跑。我只设了目标,别的什么都没设——没限速,没限制请求数量,也没设什么情况下要停。
设完我就去睡了。
现在想想,我当时的逻辑特别简单:他说要沟通处理漏洞,那我先把材料准备好。
我甚至没觉得这算「再测一次」。我以为我只是在帮他整理。
但「他说要沟通」和「他允许我再跑一遍」是两回事。这个我当时完全没分清。
第二天早上
第二天早上醒过来,我先看了一眼结果。
工具确实把站翻了一遍。但它干的事不止是「看」:
- 给一些账号加了余额;
- 在后台把审核申请点了通过,几十个申请全过了;
- 走了几笔 0.00 元的支付,留下「已支付」记录;
- 站里有些东西被改了。
我第一反应是「这不可能」。然后又想,是不是服务器在回滚备份,所以看起来乱。
后来才确认,就是我的工具干的。
ARTEX 不是那种只扫目录、扫端口的扫描器。它发现一个功能,会去试这个功能到底能不能用。看到后台有个「通过」按钮,它会点一下,确认是不是真的没鉴权;看到充值接口,它会提交一下,确认是不是真的能加钱。
在它那里,这叫「验证漏洞」。在站长那里,这叫半夜有人进后台,给他的用户加钱。
站为什么会挂
那个站没有 CDN,也没有 WAF,域名直接指到服务器 IP。网站和数据库跑在同一台机器上,配置不算高。
ARTEX 默认并发不低,而且会顺着链接一直爬。列表页点进详情页,详情页点进用户页,用户页又连回列表。每个页面都要查一次数据库。
请求一多,数据库连接不够用,后面的请求全堵住,整站开始 502。
我在睡觉,它在压测。
我没用什么高深的东西,就是让它一直在请求。但对一个小站来说,「一直在请求」和「被打」没什么区别。
那三条禁令
出事之后,我在工具里加了三条规则:
- 禁止做任何破坏服务器的行为
- 禁止做任何无法回滚的行为
- 禁止攻击服务器
加完我还觉得挺全面的。
但实际上一条都没起作用。
因为工具看不懂这种话。它要发一个「通过审核」的请求时,不会觉得这是「破坏服务器」,它觉得这是在「验证漏洞」。这三句话对它来说就是口号,它不知道该在什么时候停下来。
后来我重新写了一份规则,是这样:
scope:
allow_methods: [GET, HEAD, OPTIONS]
deny_paths:
- /admin
- /pay
- /api/*/delete
- /api/*/approve
rate:
max_rps: 1
max_concurrency: 2
max_requests_total: 3000
crawl_depth: 2
stop_when:
- consecutive_5xx >= 3
- latency_p95_ms > 2000
- write_method_detected
- form_submit_required
evidence:
max_records_per_endpoint: 1
no_export: true
no_upload: true
no_mutation: true
和那三句话的区别是,这里每一条都能落到具体动作上。只允许 GET,那所有 POST 就发不出去;每秒 1 个请求,就不会把站压垮;遇到写操作就停,它就不会去点「通过」。
写「不要做什么」没用,得写「只允许做什么」。
弱口令 888888
还有个事。
他们支付系统那边另一个后台,密码是 888888。
这种密码在字典里排最前面,自动工具几秒钟就能试出来。试出来之后它会登进去,然后接着点。
正确的是什么?试出来就停。记下「这个后台密码是 888888」,写进报告,退出来。不要登进去看。
因为登进去之后,性质就变了。之前你只是发现了一个弱密码,登进去之后,你就是进了别人的后台。
这一步跨过去,后面再解释「我只是看看」,没人会信。
正确的做法
后来我把流程重新理了一遍:
- 先拿到明确的许可。不是「感谢反馈」,也不是「你想沟通」,是写清楚:测哪个站、哪些不能碰、什么时间段、能不能登录、能不能提交表单、出了问题谁负责。
- 只读。能不登录就不登录,能不提交就不提交。
- 限速。每秒几个请求、总共多少个请求,提前定死。
- 留证据。一个接口读一条记录、截一张图就够了,不要把数据导出来。
- 出问题马上停。不是先解释,是先停。
- 停完保留日志。日志是唯一能证明你到底干了什么的东西。
- 修复期间不要碰。对方在改代码,你再去请求,只会把事情搞乱。
- 复测要重新问。上次同意不代表这次同意。
这些听起来很啰嗦,但少做一步,可能就得多解释一个月。
站长后来怎么处理的
他一开始说要报警,后来真的报了。
再后来,他把我发的日志和报告看完,去撤了案。跟警察说的是「内部出了问题」。
他跟我解释的时候说:「我看你也是好心帮忙,之前也提醒了,所以我撤销了。」
这句话我记到现在。
后来他把站里的问题整理了一遍,一共 215 个。我写了一份 438KB 的报告发给他,每个问题写了在哪、怎么复现、怎么修。
我跟他说最好上个 CDN,源站别直接暴露。他说「了解」,还问了我 CDN 防护是什么。
最后他说:「后面还麻烦你帮我们继续找漏洞,我可以给你相关费用。」「之前我们知道你也是好意,只是方式方法不对。」
还补了一句:「以后要联系,不要私下做,让别人摸不清你的意图。不仅仅是我这里,在人家那里也是,很危险的。」
最后
我 17 岁,没工作,在家自学。
这件事之前,我一直觉得「我没干坏事」就够了。我喜欢这个,想学这个,看到问题就顺手看看,看到漏洞就告诉对方,我觉得这是好事。
但这件事之后我发现,「我没干坏事」和「我做的事没造成坏结果」是两码事。
工具是我开的,目标是设的,觉是我睡的。它做的每一件事,最后都算在我头上。
现在我再开这种工具,会先问自己三个问题:这个站我有没有许可?我允许它做什么?什么情况下必须停?
三个问题有一个答不上来,我就不跑。