前言

网站登录入口是安全测试中非常常见的目标点。互联网上的登录方式很多,包括普通账号密码登录、后台登录、企业系统登录、短信验证码登录、图形验证码登录、二维码登录等。不同登录方式背后的风险也不同:有的系统缺少验证码,有的验证码可以被 OCR 自动识别,有的后台入口因为公开暴露而被搜索引擎收录。

本篇文章主要梳理了三个核心内容:

  1. 如何使用搜索引擎高级语法发现公开暴露的信息。
  2. 无验证码登录场景下,理解密码爆破流程。
  3. 有验证码登录场景下,如何理解验证码识别插件与 Burp Intruder 的配合方式。

搜索引擎高级检索

在日常搜索中,我们通常搜索文章、图片、视频或网页标题。但在安全测试和信息收集阶段,如果想定位特定类型的网站、文档或登录页面,就需要使用搜索引擎高级语法。

常见思路包括:

1
2
3
4
5
site:目标域名 关键词
filetype:pdf 关键词
intitle:登录
inurl:login
inurl:admin

image-20260727233145693

学号信息检索

一些学校或机构可能会把包含学号、名单、通知、成绩说明等内容的 PDF 文档发布到公网。如果这些文件没有做好脱敏,就可能造成信息泄露。

例如下面这种检索思路:

1
site:edu.cn filetype:pdf 学号

image-20260727233616988

image-20260727233714086

这个语法的含义是:

  • site:edu.cn:限制搜索结果来自 edu.cn 相关站点。
  • filetype:pdf:限制搜索结果为 PDF 文件。
  • 学号:搜索包含“学号”这个关键词的内容。

这说明了一个很重要的安全问题:很多风险并不是来自复杂漏洞,而是来自公开发布时没有检查敏感字段。

登录文档检索

有些系统的使用手册、操作说明或账号规则说明会被上传到公网,文档中可能包含后台入口、默认账号格式、初始密码规则等信息。

例如:

1
site:edu.cn filetype:pdf 登录

image-20260727233827772

image-20260727233932372

这类检索可以帮助安全人员发现组织在公网暴露了哪些系统说明文档。对防守方来说,重点不是“搜索到了什么”,而是要反过来检查:

  • 是否公开了内部系统地址。
  • 是否泄露了默认账号或初始密码规则。
  • 是否暴露了后台路径、测试账号、接口地址。
  • 文档发布前是否做过敏感信息审查。

无验证码登录爆破流程

接下来是 Burp Suite 抓包和 Intruder 模块的基本使用流程。由于这种登录需要许可,所以我就随便找个靶场来演示吧。

启动靶场

image-20260728001021755

首先开启并启动靶场,确认登录页面可以正常访问。我们使用的测试账号为:

1
2
username: admin
password: 待测试

这里的重点不是账号本身,而是观察登录请求的结构。比如登录时通常会提交:

1
username=admin&password=1111

或者以 JSON 形式提交:

1
2
3
4
{
"username": "admin",
"password": "1111"
}

使用 Burp Suite 抓取登录请求

开启代理拦截,然后在登录页面输入账号和任意密码并点击登录。此时 Burp 会拦截到登录请求,也就是常说的“抓包”。

抓到请求后,需要关注以下字段:

  • 请求方法:POST 还是 GET
  • 登录接口路径:例如 /login/admin/login
  • 账号字段名:例如 usernameuseraccount
  • 密码字段名:例如 passwordpasswdpwd
  • 返回包差异:密码错误和登录成功时,响应长度、状态码、跳转地址、提示语是否不同。image-20260728001131187

发送到 Intruder

在 Burp 中将登录请求发送到 Intruder 模块,然后在 Positions 页面标记需要爆破的位置。image-20260728001240156

无验证码场景通常只需要标记密码字段,例如:

1
username=admin&password=§1111§

这里的 §...§ 表示 Intruder 会替换的位置。接着在 Payloads 中导入密码字典,并开始攻击。

字典去这个链接下,下好后按照步骤导入

1
https://pan.quark.cn/s/86c071ea6db9

image-20260728001624739

记得把找个url编码关了

image-20260728001816906

点击攻击后将长度排序

image-20260728002053316

可以看到密码已经被我们爆破出来了

image-20260728002157031

查看正确结果

用刚刚爆破的密码登录看到flag

image-20260728002404568

爆破完成后,不能只看“有没有 200 状态码”。很多登录失败也会返回 200 OK。更可靠的判断方式包括:

  • 响应长度明显不同。
  • 返回内容出现“登录成功”“后台首页”等关键词。
  • 响应头出现跳转,例如 Location: /admin/index
  • Cookie 或 Session 发生变化。
  • 页面不再出现“密码错误”“登录失败”等提示。

有验证码登录爆破流程

验证码本来是用来提高自动化攻击成本的,但如果验证码实现不合理,或者验证码图片过于简单,就可能被 OCR 自动识别。

接下来的攻击流程是:先抓验证码图片的数据包,再把验证码识别接口配置到 Burp 插件中,最后让 Intruder 在每次请求时自动识别验证码并填入验证码字段。

抓取验证码图片请求

打开靶场后,在登录页面找到验证码图片。通常可以右键打开验证码图片地址,或者在 Burp 的 HTTP history 中找到验证码图片请求。

image-20260728004203165

验证码请求可能类似:

1
2
GET /captcha.php HTTP/1.1
Host: example.test

接着开启拦截,重新请求验证码图片,获取验证码数据包,在空白处点击鼠标右键,将验证码数据包右键发送到OCR模块

image-20260728004603672

配置 OCR 插件

我们使用了一个 OCR 接口插件。插件的作用是把验证码图片内容发送给 OCR 识别服务,然后把识别结果作为 Intruder 的 Payload 使用。

插件下载链接

1
https://pan.quark.cn/s/d6d6459552d9

OCR接口

1
http://1b8cdb391967.target.yijinglab.com

接口请求格式大致为:

1
2
3
4
5
6
7
8
9
POST /ocr/b64 HTTP/1.1
Host: 1b8cdb391967.target.yijinglab.com
User-Agent: python-requests/2.24.0
Accept-Encoding: gzip, deflate
Accept: */*
Connection: close
Content-Length: 2540

<@BASE64><@IMG_RAW></@IMG_RAW></@BASE64>

image-20260728004830633

其中:

  • <@IMG_RAW> 表示原始验证码图片数据。
  • <@BASE64> 表示把图片内容转换成 Base64 后发送。
  • OCR 服务返回识别结果。
  • Burp 插件将识别结果填入验证码参数。

配置完成后,需要先测试 OCR 插件是否能稳定识别验证码。验证码识别率越低,爆破失败率越高。

抓取带验证码的登录请求

打开浏览器代理,开启拦截,在登录页面输入:

1
2
3
username: admin
password: 任意值
captcha: 任意值

image-20260728004945772

点击登录后,Burp 会拦截到带验证码参数的登录请求。请求中通常会包含三个关键字段:

1
username=admin&password=1111&captcha=abcd

image-20260728005042003

设置 Intruder 攻击类型

将请求发送到 Intruder,选择的攻击类型“交叉”。

image-20260728005254524在 Burp Intruder 中,这类场景一般需要同时处理两个位置:

1
username=admin&password=1111§&captcha=§abcd§

image-20260728005453575

第一个位置是密码字段,使用密码字典。

image-20260728005604682

第二个位置是验证码字段,使用 OCR 插件动态生成的识别结果。

image-20260728005718364

❗记得把url编码都关了

image-20260728010019460

这样每次发送登录请求时,Burp 都会:

  1. 从密码字典中取一个密码。
  2. 获取当前验证码图片。
  3. 调用 OCR 插件识别验证码。
  4. 把密码和验证码一起提交到登录接口。

控制攻击速度

image-20260728005915816

将速度设置为 1。这个设置很关键,因为验证码通常具有时效性,并且每次请求都需要重新识别。如果速度太快,可能会出现:

  • 验证码还没刷新完成。
  • OCR 识别结果对应不上当前验证码。
  • 服务端触发频率限制。
  • 请求顺序混乱导致结果不可用。

所以在验证码场景中,稳定性往往比速度更重要。

判断结果

image-20260728010230243

有验证码时,判断正确密码同样要对比响应差异。可以重点观察:

  • 响应长度是否明显不同。
  • 是否跳转到后台页面。
  • 是否返回新的登录态 Cookie。
  • 是否出现“验证码错误”“密码错误”“登录成功”等不同提示。
  • 失败原因是否从“密码错误”变成其他状态。

如果 OCR 识别率不高,结果中会混入大量验证码错误请求,需要结合响应内容进行筛选。

常见问题与排查思路

为什么一直失败?

可能原因包括:

  • 密码字典没有包含正确密码。
  • 标记的参数位置不正确。
  • 登录请求中还有隐藏字段或 Token。
  • 验证码和 Session 绑定,不能复用。
  • OCR 插件识别错误率太高。
  • 请求速度过快,验证码过期。

为什么验证码识别成功但还是登录失败?

可能是验证码与当前会话绑定。如果验证码图片来自一个请求,而登录请求使用的是另一个 Session,服务端会认为验证码无效。

因此在测试时要关注:

  • Cookie 是否保持一致。
  • 验证码请求和登录请求是否属于同一个会话。
  • 每次登录前是否需要重新获取验证码。
  • 验证码是否一次性使用。

为什么响应状态码看起来都一样?

很多系统登录失败和登录成功都会返回 200。此时要看更细的差异,比如响应包长度、响应正文、跳转路径、Cookie、页面关键词等。

防守视角:如何降低爆破风险

学习攻击流程的目的,是为了更好地理解防护重点。针对账号密码爆破和验证码识别,可以从以下方面加固:

  • 登录失败次数限制:同一账号或同一 IP 连续失败后临时锁定。
  • 增加频率限制:限制单位时间内的登录请求数量。
  • 使用强验证码:避免简单字符、固定背景、低干扰验证码。
  • 验证码与 Session 绑定:验证码必须和当前会话一致,并且一次性使用。
  • 多因素认证:后台、管理端、敏感系统建议启用 MFA。
  • 弱口令检测:禁止常见弱密码和默认密码。
  • 登录告警:对异常登录失败、撞库特征、同账号多 IP 尝试进行告警。
  • 后台入口保护:后台路径不应直接暴露在公网,必要时加 VPN、白名单或零信任访问控制。
  • 敏感文档审查:公网发布 PDF、手册、通知前检查是否包含账号规则、后台地址、默认密码等信息。

总结

登录系统在真实攻防中的几个薄弱点:

  • 公开文档可能泄露账号规则和后台入口。
  • 没有验证码和频率限制的登录接口很容易被自动化尝试。
  • 简单验证码无法完全阻止自动化攻击。
  • Burp Intruder 的关键在于正确标记参数、选择合适 Payload、观察响应差异。
  • 防守时必须同时考虑账号策略、验证码机制、会话绑定、频率限制和日志告警。

Happy Hacking 🚀