最近,一个欧洲公司的安全部门检测到有少量用户的账号被黑客登录,被入侵的用户的积分被盗用。尽管安全团队第一时间屏蔽了黑客的 IP,但是每天仍然有新的用户被黑客登录,这些黑客要么换了 IP、要么是另一批不同的黑客。

1694172230917 8950ad2d ebff 4738 b0af a7e90655701f

他们有问到我的建议,于是我去看了一下他们的网站登录页面,惊呆了。因为页面很简单,就是用户名和密码的组合,没有任何形式的验证码机制,尽管表单提交时,服务器端会验证 CSRF 令牌,但只要稍懂点技术,都不难在发送用户名和密码组合前,从 HTML 页面源码里解析出这个 CSRF 令牌。

于是,黑客很容易进行密码的暴力猜测,或者发起字典攻击。

他们其实还在页面中放置了 WAF 厂商提供的 js 脚本,来检测机器人行为。如果检测到了当前的操作用户不像是人类,就会拒绝服务。但很奇怪的是,这些黑客有办法让脚本表现得像是人类(起码该 WAF 厂商的 js 脚本没能检测出来)。WAF 的工作原理见:《<font style=color:rgb(18, 18, 18);background-color:rgb(246, 246, 246);>网络应用防火墙(WAF)防机器刷流量的工作原理,以登录举例 - Jeff Tian的文章 - 知乎

因为我在 5 年前就开始在登录页面上放置阿里云的滑块验证,并且取得了非常好的效果,基本上没有黑客能够对用户系统发起快速的密码暴力猜测。

1694173108100 61cef189 4621 4d42 b16e 434bcfbb0a80

于是我很自然地提出了验证码方案、包括 CAPTCHA、RECAPTCHA、或者 NOCAPTCHA,但是没有想到这个方案竟然被嗤之以鼻!

我将方案发给他们,他们回复了一个笑脸表情,但是我看到这个笑脸的后面,似乎还藏着一句 MMP。

1694173441284 e710e79e 351f 456c bc43 ee64e862aa59

我很不解,难道这不是一个常见的方案吗?他们给了我一堆讨论 CAPTCHA 在当今时代用途不大的文章,基本上都是在说,AI 解决这些验证码挑战,比人类更快。这就失去了验证码的意义,因为验证码本来就是设计出一些挑战,人类非常容易完成,但是对于机器来说特别难。

1694173792911 7c449c93 3a7f 440c 9e3c bb2654f3ca33

不过,我仍然所理力争,尽管如此,加上验证码机制仍然能够让作弊变得更困难,起码能够挡住会写脚本但是不会 AI 的这种低水平黑客,但仍然被回怼了。

1694173869279 ee0e2c68 aebe 4a62 bcd2 d2ef8b6a9f65

1694173805739 79876b83 7d25 48c7 9ae7 347e68ffc597

我仍然不明白,说 Google、Apple 不都在使用验证码吗?后来终于有人告诉我,他们和 WAF 厂商一起研究了好几种 CAPTCHA 方案,都不能使用的原因是,他们都会采集并分析用户的行为数据,并存储起来(比如 Google 的 NOCAPTCHA 会发送数据到美国、而类似滑动验证的这种技术,会将数据发到中国)。而严格遵守 GDPR 的他们,绝不会允许任何形式的发送用户数据到美国和中国。

原来是这个原因,我无话可说。有这样的前提,的确是不能使用 CAPTCHA 方案了(除非自研一个,但这肯定不现实)。

后来,他们对有风险的账号,强行开启了多因素认证,即在登录时,即使输对了密码,还要再输入二次验证码(通过邮件或者 Authenticator )。并且在系统里开启了多级安全机制,即使用登录了账号,在进行某些操作时,也会触发二次验证。但是这些对于在注册时防止机器人的问题上帮助不大,这时仍然需要 WAF 厂商来做出改进。

通过这件事,我学到的是,有些问题总停留在技术层面想,是想不通的。另外就是中国的滑动验证还是很强大的,但可能需要提供私有化部署,否则别人不会用呀。