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

发布时间:2026/5/22 4:58:10

[CTF] 从零到一:SSRF漏洞利用与绕过实战 1. SSRF漏洞初探从零开始理解攻击面第一次接触SSRFServer-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, length6): chars string.digits string.ascii_letters for candidate in itertools.product(chars, repeatlength): 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})这个脚本有几个优化点限定字符范围数字字母提升效率使用itertools.product生成组合可调整的字符串长度参数实测在普通笔记本上6位纯数字的碰撞通常能在10秒内找到。如果题目要求更复杂的字符组合可以考虑上多线程或者分布式爆破。3. 突破协议限制file协议的妙用拿到验证码后真正的SSRF利用才开始。题目提示本靶机不能访问外网这反而给了我们提示——重点要放在对内网和本地文件系统的访问上。最直接的利用方式是使用file://协议读取系统文件payload { url: file:///etc/passwd, captcha: captcha } response requests.post(target_url, datapayload)但实战中会遇到各种限制协议白名单只允许http/httpsURL校验检查是否包含内网IP特殊字符过滤过滤斜杠、点号等这时候就需要一些技巧尝试不同协议dict://,gopher://,ftp://使用IP编码127.0.0.1→2130706433十进制或0x7f000001十六进制利用URL解析特性http://localhost127.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/../../flag5. 大小写变异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 fgopher://127.0.0.1:6379/_{encoded_payload}我曾经用这个方法在CTF中成功获取了内网Redis中的flag。具体步骤用SSRF扫描内网开放端口识别出Redis服务构造Gopher协议payload通过config set dir和config set dbfilename写入webshell需要注意的是不同服务对协议的处理方式不同。比如MySQL的协议就有握手过程直接发查询会失败。这时候需要先模拟完整的握手流程。6. 防御措施与实战建议站在开发者角度防御SSRF需要多层防护输入校验严格限制协议类型禁用file、gopher等危险协议校验URL格式和域名白名单网络层防护location / { deny 127.0.0.1; deny 10.0.0.0/8; deny 192.168.0.0/16; }应用层防护使用DNS重绑定防护设置请求超时和大小限制对CTF选手来说我的实战建议是准备常用payload清单编写自动化测试脚本注意观察错误信息尝试非常规协议和编码方式有次比赛我卡了3小时最后发现用0://协议能绕过所有过滤。这种偏门技巧平时要多积累。

相关新闻