
1. 题目背景与初步分析BUUCTF是国内知名的CTFCapture The Flag竞赛平台而[ACTF2020 新生赛]Include1是一道典型的Web安全题目考察文件包含漏洞的利用技巧。这类题目通常模拟真实Web应用中的安全缺陷要求参赛者通过漏洞获取服务器上的敏感信息或执行系统命令。这道题目标题中的Include明确提示了考察点——文件包含漏洞File Inclusion。文件包含是PHP应用中常见的安全问题主要分为本地文件包含(LFI)和远程文件包含(RFI)两种类型。根据题目名称和BUUCTF平台的特点我们可以预判这是一个本地文件包含漏洞的利用场景。2. 文件包含漏洞基础原理2.1 PHP文件包含机制PHP中常用的文件包含函数有四个include()include_once()require()require_once()这些函数的设计初衷是为了代码复用但当开发者将用户可控的输入直接传递给这些函数时就会产生安全风险。例如?php $page $_GET[page]; // 用户可控输入 include($page . .php); // 危险的文件包含 ?2.2 漏洞利用方式本地文件包含(LFI)的典型利用方式包括读取系统敏感文件如/etc/passwd结合日志文件注入PHP代码利用/proc/self/environ等特殊文件使用PHP伪协议php://filter等在本题环境中根据其他参赛者的writeup提示主要考察的是PHP伪协议的利用。3. 解题步骤详解3.1 初步探测首先访问题目提供的URL通常会看到一个简单的Web页面。通过查看页面源代码我们可以寻找可能的漏洞入口点。对于文件包含类题目常见的测试方法是尝试修改URL参数http://target.com/?page../../../../etc/passwd如果存在文件包含漏洞可能会返回系统文件内容或报错信息。3.2 PHP伪协议利用当直接文件包含被限制时PHP伪协议是强大的绕过工具。本题的关键是利用php://filter协议php://filter/convert.base64-encode/resource目标文件这个payload的工作原理php://filter - 指定使用PHP过滤器convert.base64-encode - 将文件内容以base64编码输出resource - 指定要读取的文件使用这个技术可以绕过一些文件内容检测因为输出是base64编码的。3.3 获取源码在本题中通过构造以下URL获取index.php的源码http://target.com/?filephp://filter/convert.base64-encode/resourceindex.php服务器会返回base64编码的PHP文件内容解码后可以得到完整的源代码?php // index.php 示例代码 $file $_GET[file]; if(isset($file) !strstr($file, ../)){ include($file); }else{ include(default.php); } ?从代码中可以看到开发者虽然过滤了../防止目录遍历但没有过滤PHP伪协议的使用。3.4 分析源码寻找flag在CTF比赛中flag通常存储在以下位置之一当前目录下的flag.php文件/flag文件数据库中的特定表环境变量中根据获取的源码分析下一步尝试读取flag.phphttp://target.com/?filephp://filter/convert.base64-encode/resourceflag.php解码返回的base64内容后通常就能看到包含flag的PHP代码?php $flag ACTF{th1s_1s_f1le_1nclus10n_fl4g}; ?4. 进阶利用技巧4.1 绕过常见过滤在实际比赛中可能会遇到更严格的过滤以下是几种绕过方法大小写混淆php://FilTer/convert.base64-encode/resourceindex.php双重编码php:%2f%2ffilter/convert.base64-encode/resourceindex.php使用相对路径php://filter/convert.base64-encode/resource./index.php4.2 利用日志文件注入如果伪协议被禁用可以尝试通过包含日志文件注入PHP代码修改User-Agent为PHP代码?php system($_GET[cmd]);?然后包含访问日志http://target.com/?file/var/log/apache2/access.log执行系统命令http://target.com/?file/var/log/apache2/access.logcmdls4.3 利用/proc/self/environ当Web服务器进程环境变量可控时如通过User-Agent可以包含环境变量文件http://target.com/?file/proc/self/environ在User-Agent中注入PHP代码执行系统命令5. 防御措施作为开发者防止文件包含漏洞的最佳实践包括白名单验证只允许包含预定义的文件$allowed [home.php, about.php]; if(in_array($page, $allowed)) { include($page . .php); }硬编码路径前缀include(/var/www/templates/ . $page . .php);禁用危险函数在php.ini中设置disable_functions include,include_once,require,require_once使用basename()函数include(basename($page) . .php);6. CTF中的变种与扩展在更高难度的CTF题目中文件包含可能与其他漏洞结合文件包含文件上传上传图片马后包含文件包含Session通过包含session文件获取敏感信息文件包含PHP过滤器链构造复杂的过滤器链实现RCE例如使用过滤器链执行命令php://filter/convert.iconv.utf-8.utf-16le|convert.quoted-printable-encode|convert.iconv.utf-16le.utf-8|convert.base64-decode/resourcedata://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ID8这个复杂的过滤器链最终会解码并执行PHP代码。7. 实际渗透测试中的应用在真实渗透测试中文件包含漏洞的危害更大读取配置文件获取数据库凭证查看应用程序源代码寻找其他漏洞结合其他漏洞实现服务器接管在内网渗透中作为突破口例如通过文件包含读取WordPress的wp-config.php文件http://example.com/?file../../../../wp-config.php可以获取数据库用户名、密码等重要信息。文件包含漏洞的挖掘通常需要全面参数测试对所有输入参数进行测试模糊测试使用工具如ffuf测试各种payload源代码审计检查所有include/require的使用点流量分析检查正常请求中的文件包含模式