1. CTF密码学入门:从弱口令到加密算法
作为一名参加过数十场CTF比赛的"老菜鸟",我深刻理解新手在密码学题目前的困惑。Web方向的密码题目往往不像逆向工程那样需要深厚的汇编基础,也不像PWN那样需要复杂的漏洞利用技巧,但正是这种"看似简单"的特性,让不少新手在密码题上栽了跟头。
密码学题目主要分为两大类:一类是基于弱口令、默认凭证的简单爆破,另一类则是涉及加密算法分析与破解的复杂题目。我们先从最基础的弱口令题目开始,这是CTFHub等平台最常见的Web入门题型。
重要提示:本文所有实验均在合法授权的CTF平台或本地测试环境进行,严禁对任何真实系统进行未授权的密码测试。
1.1 弱口令的本质与危害
弱口令(Weak Password)是指那些容易被猜测或破解的简单密码,通常具有以下特征:
- 使用常见字典词汇(如admin、password、123456)
- 使用连续数字或重复字符(如111111、123123)
- 使用个人信息(如生日、姓名拼音)
- 长度过短(小于8位)
- 无特殊字符混合
在CTF比赛中,弱口令题目通常会设置以下场景:
- 后台管理员登录页面(如/admin.php)
- 数据库默认账户(如phpMyAdmin)
- 设备管理界面(如路由器登录)
- 压缩包密码保护
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. CTFHub典型弱口令题目实战解析
2.1 基础弱口令爆破
让我们模拟一个典型的CTFHub弱口令题目场景:
html复制<!-- 模拟的登录页面代码 -->
<form action="/login" method="POST">
<input type="text" name="username" placeholder="Username">
<input type="password" name="password" placeholder="Password">
<button type="submit">Login</button>
</form>
手工测试步骤:
- 尝试常见用户名组合:
- admin/admin
- root/root
- guest/guest
- test/test
- 尝试空密码:
- admin/(留空)
- 尝试默认凭证:
- admin/123456
- admin/password
自动化工具使用(以Burp Suite为例):
- 拦截登录请求并发送到Intruder
- 设置攻击类型为"Pitchfork"或"Cluster bomb"
- 加载弱口令字典(如SecLists中的常见密码列表)
- 根据响应长度/状态码筛选成功结果
2.2 带验证码的密码爆破
现代系统通常会添加验证码防御机制,但在CTF题目中可能存在以下漏洞:
- 验证码不刷新(同一验证码可重复使用)
- 验证码在客户端验证(可被绕过)
- 验证码逻辑缺陷(如仅检查存在性)
实战案例:
python复制import requests
session = requests.Session()
url = "http://example.com/login"
# 首次获取验证码
resp = session.get(url)
captcha = extract_captcha(resp.text) # 需要根据实际情况实现提取逻辑
# 爆破循环
for password in open('weak_passwords.txt'):
data = {
'username': 'admin',
'password': password.strip(),
'captcha': captcha # 重复使用同一验证码
}
resp = session.post(url, data=data)
if "Login success" in resp.text:
print(f"Found password: {password}")
break
3. 密码学进阶:加密算法分析与破解
3.1 常见加密算法识别
CTF中常见的加密算法特征:
| 算法类型 | 特征 | 识别方法 |
|---|---|---|
| Base64 | 结尾常有=号,字符集[A-Za-z0-9+/] | 长度为4的倍数,尝试解码 |
| Caesar | 字母位移固定 | 频率分析,尝试所有26种位移 |
| 栅栏密码 | 文本被重新排列 | 观察字符分布,尝试不同栏数 |
| 猪圈密码 | 特殊符号组合 | 对照密码表识别 |
| MD5 | 32位十六进制 | 无法反向解密,只能碰撞或查表 |
3.2 栅栏密码实战解密
以3栏栅栏密码为例,解密步骤:
- 确定密文长度和栏数
- 绘制栅栏排列示意图
- 按行读取重建明文
Python实现示例:
python复制def rail_fence_decrypt(cipher, rails=3):
pattern = []
for i in range(rails):
pattern.append([None]*len(cipher))
# 重建栅栏模式
row, down = 0, True
for i in range(len(cipher)):
pattern[row][i] = '*'
if down:
row += 1
if row == rails:
row = rails-2
down = False
else:
row -= 1
if row == -1:
row = 1
down = True
# 填充密文字符
index = 0
for r in range(rails):
for c in range(len(cipher)):
if pattern[r][c] == '*' and index < len(cipher):
pattern[r][c] = cipher[index]
index += 1
# 按行读取明文
result = []
row, down = 0, True
for i in range(len(cipher)):
if pattern[row][i] != '*':
result.append(pattern[row][i])
if down:
row += 1
if row == rails:
row = rails-2
down = False
else:
row -= 1
if row == -1:
row = 1
down = True
return ''.join(result)
4. CTF密码学题目解题方法论
4.1 系统性解题流程
-
信息收集阶段:
- 检查页面源码(Ctrl+U)
- 分析网络请求(F12开发者工具)
- 识别使用的加密/编码方式
-
工具准备阶段:
- 安装必要工具:Burp Suite、CyberChef、hashcat
- 准备常用字典:rockyou.txt、SecLists
- 编写简单脚本处理特定加密
-
解题执行阶段:
- 从简单尝试开始(如查看源码注释)
- 逐步升级复杂度(如字典攻击→算法分析)
- 记录所有尝试过程和结果
4.2 实用工具推荐
| 工具名称 | 用途 | 适用场景 |
|---|---|---|
| Burp Suite | 网络请求拦截与修改 | Web登录爆破、参数篡改 |
| CyberChef | 多种编码转换 | 快速测试各种编码/加密 |
| hashcat | 高性能密码破解 | GPU加速的哈希碰撞 |
| John the Ripper | 多功能密码破解 | 各种加密算法支持 |
| Python脚本 | 自定义解密逻辑 | 处理特殊加密算法 |
5. 从CTF到实战:密码安全最佳实践
5.1 防御弱口令攻击
作为开发者应该:
- 强制密码复杂度要求(长度、字符类型)
- 实施账户锁定机制
- 使用多因素认证
- 定期扫描和提醒弱密码
5.2 加密算法选择建议
| 场景 | 推荐算法 | 原因 |
|---|---|---|
| 密码存储 | Argon2/PBKDF2 | 专门设计抵抗暴力破解 |
| 数据传输 | TLS 1.3 | 现代安全协议 |
| 数据加密 | AES-256 | 行业标准对称加密 |
| 数字签名 | ECDSA | 比RSA更高效安全 |
在CTF比赛中积累的密码学知识,最终应该转化为对实际系统安全性的深刻理解。我经常在审计企业系统时发现,许多安全漏洞的根源就在于对密码处理的轻视——无论是使用弱加密算法,还是不当的密钥管理方式。
