验证码已成为我们日常网络生活中不可或缺的一部分,为网站和应用程序提供了一道基本的安全屏障。从最开始的简单数字验证码,到现在的各种奇葩验证码,复杂性在逐步增加,用来抵御自动化工具和机器人的攻击。

下图展示了部分常见的验证码:

各种验证码展示

这些验证码存在的唯一目的就是用来区别人和机器。然而随着 ChatGPT 大模型崛起,特别是 GPT4-Vision 多模态能力的问世,验证码还能拦截住机器吗?

本文接下来尝试以网易网盾和 Google 的验证码为例,让 ChatGPT 来尝试进行破解,来看看有了视觉能力的 ChatGPT 到底能不能攻破验证码。

数字字母验证

先拿最简单的数字验证码试水,这些验证码其实早就已经被神经网络搞定,不用什么大模型都能轻松识别。不过还是拿出来试试水,看看ChatGPT 表现咋样。

数字/字母类验证码

试了很多个图片,全部识别正确,看来对 ChatGPT 来说是小菜一碟了。微软的LLM 视觉报告里,有专门提到一个 Scene Text Recognition,对于图片里的小块文本,确实能识别不错。但是千万不要觉得 ChatGPT 就有 OCR 能力,我拿几个文本比较多的图片去让 ChatGPT 识别里面的文字,结果有很多错误,甚至完全是胡编乱造的。

文字点选

文字点选验证码是一种常见的验证码形式,它要求用户从一组文字中选择或点击特定的字或词汇来完成验证。这类验证码的主要目的是通过模糊的背景、扭曲的字形、或者叠加的线条来使机器识别变得困难。下面就是一个验证码图片示例,一般会要求按照一定顺序点按里面的文字,比如依次点击“素,晴,韩”三个字。

文字点选验证码示例

如果 ChatGPT 能依次给出三个字的位置,那就能破解了。先尝试了下提示词:

你能依次找到图片里的素,晴,韩 三个字的位置,并给出像素位置吗?

然后告诉我不能直接返回图片中文字的像素位置,不过它用相对位置来描述这几个字,可惜的是这里的位置也是不对的。给的结果如下:

  • “素”字位于图片的左上方,近中心的左侧。
  • “晴”字位于图片的中上方,稍微偏右。
  • “韩”字位于图片的上方,接近右上角。

试了其他提示词:

你是一个中文识别专家,先依次找出图片里面的中文文字,识别出对应的位置。然后按照顺序依次给出素,晴,韩 三个字的位置。

你是一个中文变形字识别专家,先一步步找出图片里面所有中文文字,识别出对应的位置。注意这里的文字可能有变形,旋转,扭曲等操作。最后按照顺序依次给出素,晴,韩 三个字的位置。

这些提示词 ChatGPT 都给出了错误的空间位置。不过微软的LLM 视觉报告里有一节 Object Localization,里面有识别图片中物体位置的示例,看起来 ChatGPT 还是有希望做到。于是换了下提示词:

先确定上面图片的尺寸,然后用一个方框定位图片里所有中文字的位置,最后依次输出素,晴,韩 三个字的位置。

这次的效果好了不少,给出图片尺寸为 314x638 像素,然后也给出了中文字的大致定位框(可惜也不是很准确):

  • “素” 左上角 (15, 20),右下角 (65, 85)
  • “日” 左上角 (85, 30),右下角 (125, 95)
  • “晴” 左上角 (130, 70),右下角 (170, 135)
  • “云” 左上角 (250, 25),右下角 (290, 90)
  • “韩” 左上角 (230, 70),右下角 (280, 135)

定位框位置不对,识别出的文字也不准,试了其他几张,效果也都不好。

图标点选

图标点选验证码是近年来逐渐受到欢迎的验证方式,其核心思想是要求用户从一组图标中选择或点击特定的图像来完成验证。这类验证码通常会用到动物、物品、交通工具等日常图像,并可能对它们进行某种变形或扭曲,使得自动化工具难以直接识别。与文字点选相比,图标点选为识别带来了更大的挑战。因为图像的多样性、颜色、形状以及可能的扭曲都增加了验证码的复杂性。

下面是一个图标点选验证码例子:

图标点选验证码示例

简单提示词如下:

这个图片下面一行有三个图标,你能在上面的图片里找到相应的位置吗

简单提示得到的效果不行,ChatGPT 虽然知道我们的意图,也识别出来了下面一行的三个图标,还给它们实体化为:房子、书籍和相机,但是给出的位置信息是错误的,基本不可用。

Object Localization 里面的方法,修改了下提示词如下,效果还是不行。

先确定上面图片的尺寸,在图片最下面一行有 3 个图标,用方框定位这些方框在图片里的位置,最后输出位置。

看来图标点选依旧没法破解。

空间推理

空间推理验证码是一种新兴的验证方式,它融合了传统验证码的识别要求与用户的空间认知能力。这种验证码不再仅仅是选择或识别,它要求用户根据给定的空间条件或关系进行逻辑推理,从而找出正确的答案。下面是网易的一个空间推理验证码:

空间推理验证码示例

这个验证码需要找到“和绿色大写E朝向一样的大写W”,直接拿这个来问 ChatGPT 的话,得到的并不正确(和绿色大写E朝向一样的大写W位于图片的中间右侧),虽然看起来找到了 W,但是方向不对。继续用 Object Localization 的方法,经过几轮沟通,发现了一个还算可以的提示词:

先确定上面图片的尺寸,然后用一个方框定位图片里所有字母的位置,然后给出和绿色大写E朝向一样的大写W 的位置,注意这里字母位置是说字母的摆放角度朝向。

这里关键在于后面强调要注意“字母的摆放角度朝向”。不过就算是加了对方位的特别强调,识别结果也不稳定,有的图片还是识别不对。

空间推理验证码识别正确的例子

这个是识别正确的例子,不过要注意的是,这里给出的定位框其实不一定特别精确,这个问题暂时还没啥好办法解决。

Google 验证码

说到验证码,不得不提及那个让无数网民又爱又恨的 Google 验证码。每次给出一堆图片让你选,一系列的交通信号灯、斑马线、公交车和商店标志,费力看都不一定选对。比如下面这张:

Google 的验证码示例

这次先偷个懒,直接用提示词:

先识别图片上方的文字任务,然后在下方的图片中找到符号要求的块。

得到的不完全正确,ChatGPT 认为含有消防栓的图片是:

  • 第一行的第一张图(黄色的消防栓)。
  • 第二行的第三张图(黄色的消防栓,背景有红白相间的道路标记)。

再次优化下提示词:

这里是一个 3*3图片,每一个小方块里面是一个图片,请选择包含消防栓的所有小图片,并给出具体小方块的位置。

还是和上次一样的答案,认为第二行第三张是黄色消防栓。不过你要提示它错了的话,它又能很快纠正说第二行第二张才是。换了几个验证码图片,识别的正确率不是很高。

对了,这里如果想触发 Google 的验证码,最简单的方式就是在浏览器的隐身模式下打开 demo 网址即可。

总结

本文前面的实验中,尝试使用 ChatGPT 来破解多种常见的验证码,从最基础的数字和字母识别,到稍微复杂的文字点选、图标点选,再到更为复杂的空间推理和 Google 验证码。可以看到,尽管 ChatGPT 具有强大的多模态能力,但在验证码识别这一领域中,它仍然面临许多挑战。对于简单的数字和字母验证码,ChatGPT 表现得相对出色,能够准确地识别出文字内容。但当涉及到更为复杂的验证码时,并不能稳定的识别成功。

目前阶段如果想稳定破解验证码,貌似只有通过打码平台,毕竟又便宜效果又稳定。不过随着技术的不断进步,我相信 ChatGPT 以及其他 AI 模型会在当前常见验证码识别上取得突破,不过到时候可能会有别的人机验证方式了,当然这都是后话了。