CTF-Web学习笔记:文件包含篇
目录
引言
一、文件包含的核心原理
1. 什么是文件包含?
2. 漏洞成因
二、CTF中最常见的2类文件包含漏洞
1. 本地文件包含(Local File Inclusion, LFI)
2. 远程文件包含(Remote File Inclusion, RFI)
三、CTF实战:文件包含的“花式利用”技巧
技巧1:包含日志文件——窃取用户输入
技巧2:利用PHP封装协议——绕过路径限制
技巧3:目录穿越——突破文件路径限制
技巧4:结合文件上传——执行任意代码
四、CTF实战案例:一道LFI+日志泄露综合题
题目背景
解题步骤
五、总结与防御建议
对CTF选手的建议
对开发者的防御建议
引言
在CTF(Capture The Flag,夺旗赛)的Web安全赛道中,文件包含漏洞(File Inclusion Vulnerability) 是一类“看似简单却极具破坏力”的漏洞。它利用的是应用程序动态包含文件时,未对用户输入的文件路径做严格校验的缺陷,导致攻击者可以“操控”程序加载任意文件(甚至远程代码),最终实现敏感信息窃取、代码执行等目标。
本文将结合CTF实战场景,从基础概念到高阶利用,带你彻底掌握文件包含漏洞的“攻防密码”。
一、文件包含的核心原理
1. 什么是文件包含?
文件包含是编程语言中常见的功能(如PHP的include
、require
,Java的@Include
,Python的import
),用于将外部文件的内容插入当前文件中执行。例如,一个PHP页面可能通过include($_GET['page']).php
动态加载用户指定的页面。
2. 漏洞成因
若程序未对用户输入的文件路径(如$_GET['page']
)做合法性校验(如路径白名单、格式过滤),攻击者可通过构造恶意路径,让程序包含任意文件(本地或远程),甚至执行恶意代码。
二、CTF中最常见的2类文件包含漏洞
1. 本地文件包含(Local File Inclusion, LFI)
攻击者通过控制包含路径,让程序加载服务器本地的敏感文件(如配置文件、日志文件、源码文件等)。
关键条件:程序使用动态包含函数(如PHP的include
/require
),且未限制文件路径范围。
典型利用场景:
- 包含
/etc/passwd
(Linux系统用户信息)、/etc/shadow
(Linux密码哈希)等系统文件; - 包含网站日志(如Nginx的
access.log
),从中提取用户输入的敏感数据; - 包含上传目录中的恶意文件(如用户上传的PHP木马)。
2. 远程文件包含(Remote File Inclusion, RFI)
攻击者通过控制包含路径,让程序加载远程服务器上的文件(需目标服务器开启远程文件读取功能)。
关键条件:
- 程序使用动态包含函数;
- 服务器配置允许远程文件包含(如PHP的
allow_url_include=On
); - 远程服务器可被攻击者控制(或存在可读取的公开文件)。
典型利用场景:
- 包含远程服务器上的恶意PHP脚本(如
http://attacker.com/shell.php
),直接在目标服务器执行代码; - 利用远程文件存储的敏感数据(如
http://attacker.com/flag.txt
)获取Flag。