CTFshow-Web进阶:文件包含漏洞实战解析(PHP伪协议与日志注入)
1. 文件包含漏洞基础与PHP伪协议文件包含漏洞是Web安全中常见的攻击面之一尤其在CTF比赛中频繁出现。简单来说当开发者使用include、require等函数动态加载文件时如果未对用户输入进行严格过滤攻击者就能通过构造特殊路径读取或执行任意文件。我遇到过不少新手在实战中容易忽略这个漏洞直到看到服务器上的敏感文件被读取才恍然大悟。PHP伪协议是绕过文件包含限制的利器。最常用的是php://filter它能对文件内容进行编码转换。比如在web78题目中使用?filephp://filter/readconvert.base64-encode/resourceflag.php这个payload就能将flag.php的源码以base64形式输出。这里有个实用技巧如果题目禁用base64解码可以尝试其他编码方式比如convert.iconv.utf8.utf16直接输出可读文本。实际测试时我发现不同编码转换器的效果差异很大。例如// 常用编码转换组合 php://filter/convert.iconv.utf8.utf16le/resourceflag.php php://filter/convert.iconv.utf8.utf7/resourceflag.php php://filter/convert.iconv.utf8.rot13/resourceflag.php每种编码都会产生不同的输出格式在遇到过滤时多尝试几种方案往往会有意外收获。2. 绕过关键字过滤的实战技巧当题目开始过滤php等关键词时如web79就需要更巧妙的绕过手法。我最初尝试大小写混合pHp发现虽然能绕过协议名检测但由于Linux文件系统区分大小写这种方法对包含实际文件无效。这时候php://input协议就派上用场了——它允许直接通过POST body传递PHP代码。在Burp Suite中测试时要注意需要将Content-Type设置为application/x-www-form-urlencoded代码结尾必须包含?闭合标签某些环境需要开启allow_url_include选项另一个强力替代方案是data://协议。有次比赛我遇到禁用php://的情况用data://text/plain,?system(ls)?成功执行了命令。这里分享几个变体// 短标签简化版 data://text/plain,?ls? // Base64编码版 data://text/plain;base64,PD9waHAgc3lzdGVtKCJscyIpPz4特别注意PHP短标签的使用条件?在任何配置下都可用而?需要开启short_open_tags。在不确定环境配置时建议优先使用?php标准写法。3. 日志文件包含攻击详解当伪协议被完全封杀时如web80日志注入就成了杀手锏。Web服务器默认会记录User-Agent等信息这就给了我们植入恶意代码的机会。根据我的经验不同服务器的日志路径需要牢记服务器类型常见日志路径Apache/var/log/apache2/access.logNginx/var/log/nginx/access.logIISC:\inetpub\logs\LogFiles\实战操作分为三步用Burp修改User-Agent为?php system($_GET[cmd]);?访问包含日志文件的URL?file/var/log/nginx/access.log通过cmd参数执行命令cmdcat/etc/passwd这里有个坑点日志文件通常很大包含时可能导致超时。我常用的优化方法是先执行cmdtail-n50/var/log/nginx/access.log只读取最后几行。另外某些新版本Nginx会转义特殊字符这时可以尝试在Referer字段插入代码。4. 突破特殊字符限制的高级技巧web81题目过滤了分号这种关键字符这时候就需要创造性思维了。经过多次测试我发现PHP在某些情况下可以省略分号// 利用闭合标签替代分号 ?php system(ls) ? // 使用短标签echo语法 ?ls?对于日志注入场景还可以利用HTTP头部其他字段在X-Forwarded-For注入代码通过Cookie字段植入payload修改Accept-Language实现注入有次比赛中我遇到极端过滤最终通过分块传输编码Transfer-Encoding: chunked在请求体中隐藏恶意代码成功绕过。这种高级技巧需要对HTTP协议有深入理解建议平时多研究Wireshark抓包分析。文件包含漏洞的防御其实并不复杂永远不要信任用户输入。在代码层面应该使用白名单限制包含文件范围禁用危险协议php://input, data://等实时监控服务器日志文件权限每次CTF比赛都是绝佳的学习机会。记得有次我花了三小时才绕过所有过滤拿到flag那种成就感至今难忘。建议新手从web78-web81这类基础题目入手逐步挑战更复杂的过滤场景