攻防世界-fileclude:PHP伪协议与文件包含漏洞实战解析

张开发
2026/4/20 17:55:55 15 分钟阅读

分享文章

攻防世界-fileclude:PHP伪协议与文件包含漏洞实战解析
1. 从一道CTF题认识PHP文件包含漏洞最近在攻防世界刷题时遇到一道很有意思的题目fileclude它完美展示了PHP文件包含漏洞的典型利用场景。题目给出了一个简单的PHP代码片段要求我们通过构造特殊参数来获取服务器上的flag.php文件内容。这道题看似简单却包含了Web安全中两个重要知识点PHP伪协议和文件包含漏洞。先来看题目给出的源码?php include(flag.php); highlight_file(__FILE__); if(isset($_GET[file1]) isset($_GET[file2])) { $file1 $_GET[file1]; $file2 $_GET[file2]; if(!empty($file1) !empty($file2)) { if(file_get_contents($file2) hello ctf) { include($file1); } } else die(NONONO); }这段代码的逻辑很清晰它接收两个GET参数file1和file2首先检查这两个参数是否为空然后验证file2的内容是否等于hello ctf如果满足条件就会包含file1指定的文件。我们的目标就是利用这个文件包含功能读取flag.php的内容。2. PHP文件包含漏洞原理剖析2.1 什么是文件包含漏洞文件包含漏洞通常发生在使用include、require等函数时开发者没有对用户输入进行严格过滤导致攻击者可以包含任意文件。PHP中常见的文件包含函数有include()include_once()require()require_once()这些函数的设计初衷是为了代码复用比如把公共的头部、尾部单独放在一个文件中然后在需要的地方包含进来。但当这些函数的参数可以被用户控制时就可能引发安全问题。2.2 文件包含漏洞的危害文件包含漏洞的危害主要体现在以下几个方面敏感文件读取通过包含系统文件如/etc/passwd获取敏感信息代码执行如果攻击者能上传文件可以包含恶意文件执行任意代码绕过安全限制利用伪协议可以绕过一些安全防护措施在本题中我们需要利用这个漏洞读取flag.php的内容。但直接包含flag.php是行不通的因为PHP文件被包含时会直接执行而我们想要的是它的源代码。3. PHP伪协议的妙用3.1 php://filter协议详解php://filter是PHP中一个非常强大的伪协议它允许我们对数据流进行各种过滤处理。在安全测试中我们常用它来读取文件源代码而不是执行它。基本语法格式php://filter/read过滤器/resource文件路径常用的过滤器包括convert.base64-encode将文件内容base64编码string.rot13使用rot13编码string.toupper转换为大写string.tolower转换为小写在本题中我们可以这样构造payload?file1php://filter/convert.base64-encode/resourceflag.php这样返回的是flag.php经过base64编码后的内容我们只需要解码就能得到原始代码。3.2 data://协议实战技巧data://协议允许我们在URL中直接嵌入数据格式如下data://MIME类型[,数据]对于本题我们需要让file_get_contents($file2)返回hello ctf可以这样构造?file2data://text/plain,hello ctf更复杂的情况下我们还可以使用base64编码?file2data://text/plain;base64,aGVsbG8gY3Rm需要注意的是在实际使用时特殊字符如加号和等号最好进行URL编码 → %2B → %3D4. 完整漏洞利用过程现在我们把上面学到的知识综合起来构造完整的攻击payload首先确定file2的参数让它返回hello ctffile2data://text/plain,hello ctf然后构造file1参数使用php://filter读取flag.php的base64编码内容file1php://filter/convert.base64-encode/resourceflag.php组合起来的完整URLhttp://靶机地址/?file1php://filter/convert.base64-encode/resourceflag.phpfile2data://text/plain,hello ctf访问这个URL后我们会得到flag.php的base64编码内容使用在线工具或命令行解码echo PD9waHAgJGZsYWc9ImN0Znt0aGlzX2lzX2FfZmxhZ30iOw | base64 -d解码后就能看到flag.php的源代码和其中的flag值。5. 防御文件包含漏洞的最佳实践5.1 输入验证与过滤最根本的防御措施是对用户输入进行严格验证白名单验证只允许包含特定目录下的特定文件过滤特殊字符如../、phar://、php://等设置包含目录使用open_basedir限制PHP能访问的目录5.2 安全配置建议除了代码层面的防护服务器配置也很重要关闭不必要的PHP特性在php.ini中设置allow_url_fopenOff和allow_url_includeOff定期更新PHP版本新版本通常会修复已知的安全漏洞使用最小权限原则Web服务器用户只应拥有必要的最小权限5.3 代码审计技巧在代码审计时要特别注意以下几点查找所有包含函数的使用点检查参数是否用户可控验证是否有足够的过滤措施特别注意动态包含的情况如包含变量拼接的文件名6. 从CTF到真实漏洞挖掘虽然我们是在CTF环境中学习这个漏洞但现实中类似的问题并不少见。很多开发者在编写代码时往往只考虑功能实现忽略了安全因素。我在实际渗透测试中就遇到过多个由于文件包含漏洞导致系统沦陷的案例。有一次审计某CMS系统时发现其模板加载功能使用了未过滤的用户输入作为包含路径通过构造特殊的路径不仅能够读取配置文件获取数据库凭证还能结合文件上传实现远程代码执行。这种漏洞一旦被利用后果往往非常严重。对于开发者来说理解这些漏洞的原理和危害才能写出更安全的代码。而对于安全研究人员掌握这些技术则能更好地发现和修复系统中的安全隐患。

更多文章