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

新手向:用PHPStudy快速复现BUUCTF Include靶场,手把手调试文件包含漏洞

零基础实战:用PHPStudy在Windows下复现文件包含漏洞靶场

最近在辅导几位刚入门Web安全的朋友时,发现很多新手对文件包含漏洞的理解停留在理论层面。今天我就用最接地气的方式,带大家在Windows环境下从零搭建一个包含漏洞的测试环境。不需要Linux基础,不用折腾复杂配置,跟着做就能亲手触发这个经典漏洞。

1. 环境准备与基础配置

首先确保你的Windows系统已经安装了PHPStudy。这个集成环境包简直是新手福音,一键安装就能获得PHP+MySQL+Apache的全套服务。我推荐使用PHPStudy v8.1版本,它自带的PHP7.3.4版本与我们今天要复现的漏洞场景完美匹配。

安装完成后,打开PHPStudy控制面板,点击"启动"按钮点亮Apache和MySQL服务。这时候在浏览器访问http://localhost,如果看到PHPStudy的欢迎页面,说明环境已经跑起来了。

接下来我们需要创建一个漏洞测试用的PHP文件。在PHPStudy的网站根目录(通常是phpstudy_pro/WWW)下新建一个文件夹,比如取名vuln_demo。在这个文件夹里创建两个文件:

// index.php <?php $file = $_GET['file'] ?? 'welcome.html'; include($file); ?>
<!-- welcome.html --> <h1>文件包含漏洞演示环境</h1> <p>尝试通过file参数包含其他文件</p>

这两个文件构成了最简单的文件包含漏洞场景。index.php直接使用用户输入的file参数进行文件包含,没有任何过滤措施,这就是典型的本地文件包含(LFI)漏洞。

2. 漏洞验证与基础利用

现在访问http://localhost/vuln_demo/index.php,你会看到welcome.html的内容。要验证漏洞是否存在,我们可以尝试包含系统文件:

http://localhost/vuln_demo/index.php?file=../../php.ini

如果配置正确,这个URL会显示PHP的配置文件内容。这就是文件包含漏洞最直接的危害——读取服务器上的任意文件。

但今天我们重点要复现的是BUUCTF Include题目的场景,也就是通过php://filter伪协议读取PHP文件源码。构造如下payload:

http://localhost/vuln_demo/index.php?file=php://filter/read=convert.base64-encode/resource=index.php

这个URL会返回经过base64编码的index.php源代码。为什么需要base64编码?因为直接包含PHP文件时,服务器会执行其中的代码而不是显示源码。通过base64编码转换,我们可以绕过这个限制。

常见伪协议用法对比:

  • php://filter/read=convert.base64-encode/resource=- 读取文件源码
  • php://input- 执行POST提交的代码
  • data://text/plain,<?php phpinfo();?>- 直接执行代码

3. 靶场完整复现实战

现在我们来完整复现BUUCTF那道题目。在vuln_demo目录下再创建两个文件:

// flag.php <?php $flag = "flag{this_is_your_local_flag}"; // 真实题目会显示"Can you find out the flag?" ?>
// tips.php <?php echo "Try to read flag.php through file parameter"; ?>

修改index.php,模拟题目中的过滤条件:

<?php $file = $_GET['file'] ?? 'welcome.html'; if(strpos($file, 'php://input') !== false){ die('hacker!'); } include($file); ?>

现在我们的本地环境已经和原题非常接近了。按照CTF解题思路:

  1. 访问http://localhost/vuln_demo/index.php看到默认页面
  2. 尝试?file=tips.php获取提示
  3. 直接访问?file=flag.php会发现页面空白(因为PHP被执行了)
  4. 使用伪协议payload读取flag.php源码:
http://localhost/vuln_demo/index.php?file=php://filter/read=convert.base64-encode/resource=flag.php

将返回的base64字符串解码(可以用在线工具或Python的base64模块),就能看到flag.php的完整源码和其中的flag。

4. 漏洞防御与编码技巧

理解了漏洞原理后,我们更应该知道如何防御。以下是几种安全的文件包含实现方式:

白名单验证法:

$allowed = ['page1.php', 'page2.php', 'welcome.html']; $file = $_GET['file'] ?? 'welcome.html'; if(!in_array($file, $allowed)){ die('Invalid file requested!'); } include($file);

路径固定法:

$base_dir = 'pages/'; $file = $_GET['file'] ?? 'welcome.html'; include($base_dir . $file);

后缀限制法:

$file = $_GET['file'] ?? 'welcome.html'; if(pathinfo($file, PATHINFO_EXTENSION) !== 'html'){ die('Only html files are allowed!'); }

如果确实需要动态包含文件,可以考虑以下安全措施:

  1. 禁用危险协议:在php.ini中设置allow_url_include=Off
  2. 使用realpath检查:确保文件在指定目录内
  3. 设置open_basedir:限制PHP可访问的目录范围
  4. 日志记录所有包含操作:便于审计追踪

5. 深入理解伪协议机制

php://filter的强大之处在于它的编码转换能力。除了base64,我们还可以尝试其他编码方式:

?file=php://filter/convert.iconv.utf-8.utf-16/resource=flag.php

这个payload会将文件内容从UTF-8转换为UTF-16编码。不同编码组合有时能绕过简单的过滤机制。常见的编码转换组合包括:

输入编码输出编码效果
utf-8utf-16双字节编码
utf-16utf-8尝试恢复原编码
asciiucs-2每字符两字节

在实战中,这些技巧能帮助我们应对各种过滤场景。比如当base64被过滤时,可以尝试:

?file=php://filter/string.rot13/resource=flag.php

这个payload会用ROT13算法处理文件内容。虽然对PHP代码效果有限,但有时能绕过简单的关键词检测。

6. 从靶场到实战的思维转变

在真实渗透测试中,文件包含漏洞往往不会这么明显。我们需要培养几个关键意识:

  1. 参数挖掘:不只是file参数,任何看似文件路径的参数都值得测试
  2. 日志利用:尝试包含Apache日志文件获取执行机会
  3. 临时文件:结合文件上传和包含临时文件getshell
  4. 过滤绕过:尝试双重编码、超长路径等绕过技巧

一个典型的实战流程可能是:

  1. 发现疑似包含漏洞的参数
  2. 测试基础文件读取(/etc/passwd等)
  3. 尝试各种伪协议
  4. 如果遇到过滤,分析过滤规则
  5. 尝试编码转换、大小写混淆等绕过方法
  6. 最终实现代码执行或敏感信息读取

记住,每个网站的具体实现都不同,需要灵活运用这些技巧。靶场练习的价值就在于培养这种灵活思维。

http://www.jsqmd.com/news/927202/

相关文章:

  • Cobalt Strike实战:一次完整的Windows内网提权与哈希获取过程复盘(含Mimikatz、Golden Ticket技巧)
  • 阿里面试全流程及备战攻略
  • 拆解开源6位半万用表:从LM399H基准源到STM32L152,手把手分析硬件设计思路
  • 注意力碎片化时代:ACE框架与数据驱动重塑数字广告策略
  • 技术人如何构建动态阅读清单以应对指数级技术更新
  • 构建多元化加密投资组合:从机构策略到个人实践
  • 别再只会用a-table了!Ant Design Vue表格组件这5个隐藏功能,让你的后台管理效率翻倍
  • 从手机充电器到5G基站:深入浅出聊聊TVS、压敏电阻这些‘电路保镖’是怎么工作的
  • 别再手动发通知了!用ThinkPHP 6.2 + uni-push 2.0 实现APP消息自动化推送(附完整代码)
  • 实战复盘:用Cobalt Strike正向连接搞定多层内网渗透(附详细命令与避坑点)
  • 8051寄存器组管理与A51汇编器应用详解
  • DPARSF跑完数据后,这些.mat和.nii文件到底怎么看?一份给fMRI新手的输出文件解读指南
  • 告别黑盒:手把手教你用Visual Studio 2019为CANoe 12.0.75定制0x27服务DLL(附验证代码)
  • 导弹拦截制导新范式:基于贝叶斯决策的杀伤概率最大化策略
  • 从78个面试故事中提炼结构化学习法,攻克算法、系统设计与行为面试
  • 飞行模拟玩家必看:Prepar3D多屏显示失败的保姆级排查手册(从硬件到NVIDIA Surround)
  • 80C51寻址方式深度解析:从MOV A, 50H这条指令,看懂CPU如何找到数据
  • 从‘水果苹果’到‘科技苹果’:Google搜索命令的‘减号’与‘星号’,如何帮你精准过滤无效信息?
  • 基于薛定谔桥的生成式语义通信:构建语义到图像的“最优传输”高速公路
  • 别再被4K卡顿困扰!手把手教你用HDMI 2.0线搞定60Hz流畅体验(附带宽计算)
  • 基于TensorFlow的神经风格迁移实战:从原理到工程实现
  • 图像引导自适应光学入门:从SPGD算法到Zernike模式优化,一篇讲清无波前传感校正
  • 告别手动摆点!用UE5行为树+黑板打造可动态调整的智能巡逻AI系统
  • 信息论视角下的AI可解释性:查询信道容量与强逆定理
  • 从RTKLIB到iGnav:手把手教你搭建RTK/INS紧组合开发环境(含避坑指南)
  • FFmpeg 音频处理从入门到凑合听:转格式、剪音频、混音、降噪我全记下来了(附 VidDown 工具集介绍)
  • 别再只调API了!手把手带你用mbedTLS实现AES文件加密解密,搞懂CBC模式和填充的那些坑
  • 糖尿病精准管理:数据驱动下的膳食分析与血糖预测实战
  • XXL-job日志表爆了?别慌,手把手教你配置自动清理,避免MySQL CPU飙升
  • Neo4j GDS插件安装后,除了`gds.version()`,你还可以用这几种方法验证和探索