利用.user.ini构建php后门

目录

一、PHP 和apache的关系

PHP与apache的连接方式

apche2-module

CGI 模式

FastCGI 模式

PHP-FPM

二、.user.ini

利用条件

利用.user.ini进行文件上传


大家都听说过 ——> 关于.htaccess攻击 ,那.user.ini其实和它类似,.htaccess攻击只适合于apache,而.user.ini用的更广,不管是nginx/apache/IIS,只要是以fastcgi运行的php都可以用这个方法。先补充前置知识

一、PHP 和apache的关系

目前来说,网站页面主要分为静态页面动态页面,纯静态页面组成的网站现在相对比较少见,大型网站一般使用的是动态网站建站技术,还有一部分网站是静态网页动态网页共存。

访问静态网页的过程:

  • 当用户请求如 https://www.baidu.com/index.html页面时,Apache服务器收到用户的访问请求后,在它管理的文档目录中找到并打开相应的html文件(如index.htm),将文件内容响应给客户端浏览器(即用户)。
  • 浏览器收到Web服务器的响应后,接收并下载服务器端的html静态代码,然后浏览器解读代码,最终将网页呈现出来

访问动态网站的过程:

  • 当用户请求如 https://www.baidu.com/index.php动态页面时,Apache服务器本身不能处理php动态语言脚本文件,就寻找并委托PHP应用服务器来处理。Apache服务器将用户请求访问的php文件(如index.php)文件交给PHP应用服务器。
  • PHP应用服务器接收php文件(如index.php),打开并解释php文件,最终翻译成html静态代码,再将html静态代码交还给Apache服务器,Apache服务器将接收到的html静态代码输出到客户端浏览器(即用户)。

PHP与apache的连接方式

那php和apache如何连接了,这里得看下他们之间的连接方式,方式有以下几种

apche2-module

把 php 当做 apache 的一个模块,实际上 php 就相当于 apache 中的一个 dll 或一个 so 文件,即其相当于php内嵌于apache中。phpstudy 的非nts 模式就是默认以 module 方式连接的,如下图

CGI 模式

此时 php 是一个独立的进程比如 php-cgi.exe,web 服务器也是一个独立的进程比如 apache.exe,然后当 Web 服务器监听到 HTTP 请求时,会去调用 php-cgi 进程,他们之间通过 cgi 协议,服务器把请求内容转换成 php-cgi 能读懂的协议数据传递给 cgi 进程,cgi 进程拿到内容就会去解析对应 php 文件,得到的返回结果在返回给 web 服务器,最后 web 服务器返回到客户端,但随着网络技术的发展,CGI 方式的缺点也越来越突出。每次客户端请求都需要建立和销毁进程。因为 HTTP 要生成一个动态页面,系统就必须启动一个新的进程以运行 CGI 程序,不断地 fork 是一项很消耗时间和资源的工作

FastCGI 模式

此时php和apache也都是一个独立的进程。fastcgi 本身还是一个协议,在 cgi 协议上进行了一些优化,众所周知,CGI 进程的反复加载是 CGI 性能低下的主要原因,如果 CGI 解释器保持在内存中 并接受 FastCGI 进程管理器调度,则可以提供良好的性能、伸缩性、Fail-Over 特性等等。

简而言之,CGI 模式是 apache2 接收到请求去调用 CGI 程序,而 fastcgi 模式是 fastcgi 进程自己管理自己的 cgi 进程,而不再是 apache 去主动调用 php-cgi,而 fastcgi 进程又提供了很多辅助功能比如内存管理,垃圾处理,保障了 cgi 的高效性,并且 CGI 此时是常驻在内存中,不会每次请求重新启动

PHP-FPM

上面提到,fastcgi 本身是一个协议,那么就需要有一个程序去实现这个协议,php-fpm 就是实现和管理 fastcgi 协议的进程,fastcgi 模式的内存管理等功能,都是由 php-fpm 进程所实现的。本质上 fastcgi 模式也只是对 cgi 模式做了一个封装,只是从原来 web 服务器去调用 cgi 程序变成了 web 服务器通知 php-fpm 进程并由 php-fpm 进程去调用 php-cgi 程序。

如何判断连接模式?

如何判断一个 php 的连接模式?在接触不到服务器文件的情况下,我们可以通过 phpinfo 来判断

以nts模式连接的即为fastcgi模式

如下Apache 2.0 Handler 代表了这个 php 使用了 apache-module 模式

 FPM 代表了 php-fpm 进程的 fastcgi 模式

二、.user.ini

服务器以fastcgi启动运行的时候,.user.ini也是php的一种配置文件,众所周知php.iniphp的配置文件,它可以做到显示报错,导入扩展,文件解析,web站点路径等等设置。但是如果想要把某个文件里面的配置与全局的php.ini不同,则可以在php文件中加上ini_set()来配置特定的配置变量。

.user.ini.htaccess一样是对当前目录的所有php文件的配置设置,即写了.user.ini和它同目录的文件会优先使用.user.ini中设置的配置属性。和php.ini不同的是,.user.ini是一个能被动态加载的ini文件。也就是说我修改了.user.ini后,不需要重启服务器中间件,只需要等待user_ini.cache_ttl所设置的时间(默认为300秒),即可被重新加载。

利用条件

  • 服务器以fastcgi模式启动
  • 允许上传.user.ini文件
  • 上传文件的所在目录存在php文件

利用.user.ini进行文件上传

以upload-labs第五关为例,查看源码发现黑名单中把能过滤的词都给过滤了,此关考察的是利用.user.ini进行文件上传

if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower($file_ext); //转换为小写
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $file_ext = trim($file_ext); //首尾去空
        
        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.$file_name;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件类型不允许上传!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

我们点击提示,显示上传目录存在一个php文件,利用这我们就能进行漏洞利用

先把全部上传的文件给贴一下

1. 上传.user.ini文件

文件内容如下,意思就是当前目录中的php文件会自动去包含pass5.png中的文件内容,而文件包含有一个特点就是能无条件解析php代码。所以我们再上传一张图片马,就能利用已经存在的php文件去包含图片马进而解析

auto_prepend_file=pass5.png

2. 上传图片马

新建pass5.txt文件,内容如下。然后修改为png后缀进行上传

<?php
phpinfo();
?>

3. 访问原本存在的readme.php文件

此时先去喝杯茶等几分钟,或者直接重启服务器。访问readme.php

 利用这个我们可以构建一个隐蔽的后门。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Vibe~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值