Fastcgi协议访问任意文件、远程执行任意代码


这篇文章算是我看大佬博客的笔记,建议各位同学看大佬博客学习,有兴趣可以再来看我这一篇,可能会有思维的火花呢? Fastcgi协议分析 && PHP-FPM未授权访问漏洞 && Exp编写 😃 😃 😃 😃

学习漏洞必知

{1} http是浏览器发送给服务器的信息要遵循的协议,fastcgi则是服务器发送给php-fpm要遵循的协议

{2} php-fpm是可以理解为一个程序,用来解析浏览器发送过来的fastcgi数据格式,并且和连接后端程序

{3} 网页交互的过程是 浏览器–>服务器中间件(Nginx、apache等)–>php-fpm–>后端程序(mysql等)

{4} php-fpm的默认端口是9000

{5} fastcgi协议的record格式也是分为协议头和协议体,协议头固定有八个字节,协议体最多有65536字节,理解record头和record体可以按照c语言理解为一个结构体,先是在一个结构体中定义header(其中细分了versiontyperequestidcontentLengthpaddinglengthlength[reserved保留数据块])和body(只有Cantentdatapaddingdata两部分且都是根据fastcgi头定义的),之后再对其进行赋值,还要注意的是其中的变量都被声明为了unsigned char类型,结构体定义如下图
在这里插入图片描述

{6}由此record概念就是fastcg-header + fastcgi-body,而多个record则构成了fastcgi协议,record根据传给后端的目的不同分为了不同的种类,在record头中的type元素就是用来记录此record是用来干什么的,一共有7种类型,这里就不做过多描述,但是简单描述一下就是,当第一次发送给php-fpm时type的值是1,之后的值都是4、5、6、7,如果要断开连接值是2、3,type具体的类型如下图
在这里插入图片描述

{7}php-fmp收到的record头是上文的形式,它收到的record体就不是这样子,这里只说它处理type值是4时的格式,此时的格式是键值对的形式,定义的结构体分别要声明 变量名的长度、变量值的长度、变量名的值、变量值,其类型如下图,有四种格式,根据不同情况用不同的结构体,调用的标准就是其中内容的多少
在这里插入图片描述
在这里插入图片描述

{8}当访问的是一个php文件时,php-fpm处理type值为4时生成的键值对在php中作为环境变量,在.user.ini文件中有PHP_VALUE和PHP_ADMIN_VALUE,这两种配置类型可以生成环境变量,其中有环境变量auto-repend-file和auto-apend-file可以用来设置在所有文件的前还是后加入某个文件,值得一说的是它可以设置为php://input之后,再设置allow-url-include=on。这些步骤懂得都懂,不懂得童鞋可以去了解一下php伪协议。

漏洞成因分析

{1}访问任意文件

在Nginx(||S7)中为了实现Path info模块添加了fix_pathinfo,这种方法会造成任意文件访问漏洞,它的漏洞逻辑就是将环境变量中的SCRIPT_FILENAME的值做处理,要是访问不了该路径下的文件,就将最后一个"/"及之后的内容全删了,这样就可以访问任意文件,当作php文件解析

{1.1}访问任意文件的防护

为了防止这种情况的出现在Nginx上和php-fpm都做了防护,在Nginx上的防护是设置了fast-split-path-info这样就不会用fix-pathinfo而是用tryfiles,如果用这种方法那么这个漏洞就已经不存在了。在php-fpm中的安全设置是 security.limit-extensions 这个参数之后跟着的值是php-fpm处理的SCRIPT-FILENAME文件的后缀,设定这个参数之后则我们只能访问指定后缀的文件

{2}远程任意代码执行

远程任意代码的执行需要了解到,当record的type设置为4之后php-fpm会配置解析的环境,此时可以设置PHP_VALUE和PHP_ADMIN_VALUE这两个参数这两个参数可以对php的参数进行配置。玩过upload的同学应该都知道.htaccess和user.ini文件这两个文件都是apache的配置文件,它们可以设置一些参数其中就有

  • 1、php_value auto_prepend_file forming.txt在主文件解析之前自动解析包含forming.txt的内容
  • 2、php_value auto_append_file forming.txt在主文件解析后自动解析forming.txt的内容

这样的内容,通过php-fpm让Nginx用php_value去配置它的值是php://input这样访问任意文件的post传参部分都会被当作php代码执行,同时因为php://input伪协议的关系需要将allow-url-fopen设置为off/on、将allow-url-include设置为on这样才能执行,所以我们用到了PHP_ADMIN_VALUE这个环境变量能设置任何参数(除了disable-function),其中包括了allow-url-include用该环境变量设置好之后就可以执行任意代码了

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SuperForming

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值