文件包含漏洞+CTFshow_web3
字数 1509 2025-08-12 11:34:14

PHP文件包含漏洞与CTFshow_web3解题详解

一、文件包含基础概念

1.1 什么是文件包含

文件包含是指在一个PHP文件中引入并执行另一个PHP文件的内容,其核心目的是去除代码冗余,提高代码复用性。

1.2 PHP文件包含函数

PHP提供了四种主要的文件包含函数:

  1. include

    • 遇到该函数时立即包含指定文件
    • 包含失败时会产生警告(E_WARNING),但脚本会继续执行
  2. include_once

    • 与include功能相同
    • 额外检查文件是否已被包含过,避免重复包含
  3. require

    • 脚本执行前就会准备包含文件
    • 包含失败时会产生致命错误(E_COMPILE_ERROR),脚本停止执行
  4. require_once

    • 与require功能相同
    • 额外检查文件是否已被包含过,避免重复包含

1.3 函数区别对比

特性 include include_once require require_once
执行时机 遇到时执行 遇到时执行 预先准备 预先准备
错误处理 警告 警告 致命错误 致命错误
重复检查

二、文件包含漏洞原理

2.1 漏洞产生原因

当开发者使用文件包含函数时,如果包含的文件路径由用户输入控制且未做严格过滤,攻击者可以包含恶意文件或系统敏感文件。

2.2 常见利用方式

  1. 包含本地敏感文件(如/etc/passwd)
  2. 包含远程恶意脚本(需allow_url_include开启)
  3. 配合PHP伪协议执行任意代码

三、PHP伪协议利用

3.1 php://input协议

php://input是一个只读流,可以访问请求的原始数据。

利用条件

  • allow_url_include=On
  • 文件包含函数参数可控

利用方法

  1. 通过POST提交PHP代码
  2. 文件包含函数包含php://input
  3. POST的PHP代码会被执行

3.2 其他常见伪协议

  1. php://filter

    • 用于读取文件源码:php://filter/read=convert.base64-encode/resource=文件路径
  2. data://

    • 直接包含数据流:data://text/plain,<?php phpinfo();?>
  3. zip://

    • 包含zip压缩包中的文件

四、CTFshow_web3解题实战

4.1 题目分析

题目使用了include函数,且参数可控,存在文件包含漏洞。

4.2 解题步骤

  1. 识别漏洞点:发现使用include函数包含用户可控参数

  2. 构造利用

    • 使用php://input伪协议
    • 通过POST提交PHP代码
  3. 具体操作

    POST /vulnerable.php?file=php://input HTTP/1.1
    Host: example.com
    
    <?php system("cat ctf_go_go_go"); ?>
    
  4. 获取flag:执行后返回flag内容ctfshow{31ae681d-8794-4631-b932-09acba283a79}

4.3 关键点

  • 必须使用POST请求
  • PHP代码需要正确的开始和结束标记
  • 系统命令根据题目环境调整

五、防御措施

  1. 避免动态包含:尽量不使用用户输入作为包含参数
  2. 白名单过滤:限制可包含的文件路径
  3. 关闭危险配置
    • allow_url_fopen=Off
    • allow_url_include=Off
  4. 使用绝对路径:避免目录遍历攻击
  5. 检查文件后缀:确保只包含特定类型文件

六、扩展学习资源

PHP文件包含漏洞与CTFshow_ web3解题详解 一、文件包含基础概念 1.1 什么是文件包含 文件包含是指在一个PHP文件中引入并执行另一个PHP文件的内容,其核心目的是去除代码冗余,提高代码复用性。 1.2 PHP文件包含函数 PHP提供了四种主要的文件包含函数: include 遇到该函数时立即包含指定文件 包含失败时会产生警告(E_ WARNING),但脚本会继续执行 include_ once 与include功能相同 额外检查文件是否已被包含过,避免重复包含 require 脚本执行前就会准备包含文件 包含失败时会产生致命错误(E_ COMPILE_ ERROR),脚本停止执行 require_ once 与require功能相同 额外检查文件是否已被包含过,避免重复包含 1.3 函数区别对比 | 特性 | include | include_ once | require | require_ once | |------|---------|--------------|---------|--------------| | 执行时机 | 遇到时执行 | 遇到时执行 | 预先准备 | 预先准备 | | 错误处理 | 警告 | 警告 | 致命错误 | 致命错误 | | 重复检查 | 无 | 有 | 无 | 有 | 二、文件包含漏洞原理 2.1 漏洞产生原因 当开发者使用文件包含函数时,如果包含的文件路径由用户输入控制且未做严格过滤,攻击者可以包含恶意文件或系统敏感文件。 2.2 常见利用方式 包含本地敏感文件(如/etc/passwd) 包含远程恶意脚本(需allow_ url_ include开启) 配合PHP伪协议执行任意代码 三、PHP伪协议利用 3.1 php://input协议 php://input 是一个只读流,可以访问请求的原始数据。 利用条件 : allow_ url_ include=On 文件包含函数参数可控 利用方法 : 通过POST提交PHP代码 文件包含函数包含 php://input POST的PHP代码会被执行 3.2 其他常见伪协议 php://filter 用于读取文件源码: php://filter/read=convert.base64-encode/resource=文件路径 data:// 直接包含数据流: data://text/plain,<?php phpinfo();?> zip:// 包含zip压缩包中的文件 四、CTFshow_ web3解题实战 4.1 题目分析 题目使用了include函数,且参数可控,存在文件包含漏洞。 4.2 解题步骤 识别漏洞点 :发现使用include函数包含用户可控参数 构造利用 : 使用php://input伪协议 通过POST提交PHP代码 具体操作 : 获取flag :执行后返回flag内容 ctfshow{31ae681d-8794-4631-b932-09acba283a79} 4.3 关键点 必须使用POST请求 PHP代码需要正确的开始和结束标记 系统命令根据题目环境调整 五、防御措施 避免动态包含 :尽量不使用用户输入作为包含参数 白名单过滤 :限制可包含的文件路径 关闭危险配置 : allow_ url_ fopen=Off allow_ url_ include=Off 使用绝对路径 :避免目录遍历攻击 检查文件后缀 :确保只包含特定类型文件 六、扩展学习资源 PHP官方文档 - 文件包含 PHP伪协议详解视频 OWASP文件包含漏洞指南