DVWA靶场通关笔记-文件包含(Impossible级别)

目录

一、源码分析

二、文件包含防范分析

1、明确指定允许包含的文件

2、拒绝所有未在白名单中的输入

3、总结

(1)白名单 (Allow List)

(2)硬编码/映射 (Hardcoding/Mapping)

(3)输入过滤 (Input Filtering)

(4)服务器配置防范 (Server Configuration)


本系列为通过《DVWA靶场通关笔记》的文件包含关卡(low,medium,high,impossible共4关)渗透集合,通过对相应关卡源码的代码审计找到讲解渗透原理并进行渗透实践。本文为文件包含 impossible关卡的原理分析部分,讲解相对于low、medium和high级别,为何对其进行渗透测试是Impossible的。

一、源码分析

进入DVWA靶场文件包含的源码目录,找到impossible.php源码,分析其为何能让这一关卡名为不可能实现命令执行渗透。

打开impossible.php文件,对其进行代码审计,这段PHP源码旨在通过一个简陋的白名单(检查page参数是否为include.phpfile1-3.php)来限制文件包含,但其并未实际使用include函数,因此本身不构成安全风险,只是一个无效示例。真正防范文件包含安全风险的核心策略是采用严格的白名单机制,只允许包含预先定义的合法文件,并彻底避免用户输入直接映射到文件系统路径,同时应关闭allow_url_include禁止远程文件包含,从而从根本上杜绝任意文件读取或代码执行的风险。

  • 功能目的:根据用户通过 ?page= 参数传入的值,来动态包含并显示相应的页面内容。

  • 预期安全措施:它试图通过一个 if 条件语句来限制只能包含 include.phpfile1.phpfile2.phpfile3.php 这四个文件。

详细注释后的impossible.php源码如下所示,主要实现严格白名单控制的文件包含功能。

<?php
// 从GET请求参数中获取名为"page"的参数值,并将其赋值给变量$file,
// 该变量预期表示要显示的页面文件名
$file = $_GET['page']; 
// 进行输入验证,检查获取到的文件名是否符合要求,
// 仅允许文件名是"include.php"或者"file1.php"或者"file2.php"或者"file3.php"
// 如果文件名不符合这些条件
if ($file!= "include.php" && $file!= "file1.php" && $file!= "file2.php" && $file!= "file3.php") { // 输出错误信息,提示文件未找到echo "ERROR: File not found!"; // 终止脚本的执行,防止后续可能的错误操作exit; 
}
// 代码执行到此处,说明$file变量的值是符合要求的文件名,
// 后续可能会根据该文件名进行文件包含等相关操作(但在当前代码中未体现)
?>

其中index.php文件中对文件包含逻辑的处理如下所示,这里直接包含一个名为 $file 的变量。注意,这个 $file 变量不是在index.php本地设置的,它来自之前通过 require_once 引入的 {low/medium/high/impossible}.php 文件。在这些文件中,$file 被设置为用户可控的输入,例如 $file = $_GET['page'];

<?php
// 初始化不同风险级别对应的文件名变量
$vulnerabilityFile = '';// 根据用户Cookie中的'security'值,决定使用哪个级别的处理文件
switch( $_COOKIE[ 'security' ] ) {case 'low':// 当安全级别为low时,使用low.php(低安全级别,几乎无防护)$vulnerabilityFile = 'low.php';break;// ... medium, high ... (省略的部分类似,分别对应medium.php和high.php,安全级别递增)default:// 默认情况下(如未设置或无效的security值),使用impossible.php(最高安全级别,完全防护)$vulnerabilityFile = 'impossible.php';break;
}// 引入对应安全级别的处理文件(该文件会定义$file变量,用于后续文件包含)
require_once DVWA_WEB_PAGE_TO_ROOT . "vulnerabilities/fi/source/{$vulnerabilityFile}";// ... (省略其他业务逻辑)// 检查$file变量是否已被定义(通常由上面引入的对应安全级别的处理文件定义)
if( isset( $file ) )// 包含$file对应的文件(核心风险点,具体风险由引入的处理文件对$file的处理逻辑决定)include( $file );
else {// 若$file未定义,重定向到默认页面include.phpheader( 'Location:?page=include.php' );exit;
}
?>
  • 安全级别控制:通过 Cookie 中的security值动态选择不同的安全级别的处理文件(low.php/medium.php/high.php/impossible.php),实现不同安全策略的切换。

  • 文件引入机制:不同安全级别的文件(如low.php)会对用户输入的page参数(通过$_GET['page']获取)进行不同处理,最终生成$file变量。low.php直接将$_GET['page']赋值给$file(无防护);impossible.php则通过白名单严格限制$file的取值。

  • 风险点include( $file )的安全性完全依赖于前面引入的安全级别处理文件对$file的过滤逻辑:

    • 低级别(如low.php)可能直接使用用户输入,导致文件包含安全风险(LFI/RFI)。
    • 不可能级别(如impossible.php)通过严格白名单验证确保$file为合法值,避免风险。

二、文件包含防范分析

这段 PHP 代码采取了严格的白名单验证机制,具体核心逻辑是直接限定允许包含的文件名,仅接受预设的合法文件,从而彻底堵死恶意文件包含的可能性。主要功能是通过获取 GET 参数page的值来确定要包含的文件。代码中对page参数进行了校验,仅允许其值为include.phpfile1.phpfile2.phpfile3.php,若不符合规则则输出错误信息并退出。

  • 明确指定允许包含的文件
  • 拒绝所有未在白名单中的输入

1、明确指定允许包含的文件

核心原因在于,通过硬编码方式,仅允许包含 include.php、file1.php、file2.php、file3.php 这四个文件,其他任何文件都被拒绝

// 仅允许包含指定的合法文件
if( $file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php" ) {echo "ERROR: File not found!";exit;
}

2、拒绝所有未在白名单中的输入

无论用户传入的 page 参数值是什么(如恶意路径、远程文件地址等),只要不在白名单内,直接返回错误并终止执行,避免了目录遍历(如 ../)、远程文件包含(如 http://)等攻击。

  • 合法请求:若传入 ?page=file1.php,由于 file1.php 在白名单中,会正常包含该文件。
  • 恶意请求 1(目录遍历):若传入 ?page=../../etc/passwd,因不在白名单内,会被拒绝并提示 “ERROR: File not found!”。
  • 恶意请求 2(远程文件包含):若传入 ?page=http://xxx.com/shell.php,因不在白名单内,同样被拒绝。
  • 未授权本地文件:若传入 ?page=file4.php(即使该文件存在),因不在白名单中,也会被拦截。

3、总结

文件包含风险的防范方法主要包括白名单法、硬编码/映射法、输入过滤法、服务器配置防范,对比如下表所示。

方法安全性推荐度说明
白名单极高★★★★★唯一允许用户输入的方法,只接受预定义值。
硬编码/映射极高★★★★★完全避免用户输入,最安全。
输入过滤中~低★★☆☆☆难以做到完美,存在被绕过的风险,不推荐。
服务器配置★★★★☆必须做的辅助措施,提供底层防护,但不能替代代码安全。

(1)白名单 (Allow List)

白名单机制通过预先定义一个绝对可信的允许文件列表来防御文件包含安全风险。开发者创建一个合法文件名的数组,在处理用户输入时,严格检查其值是否存在于该列表中。只有完全匹配的请求才会被放行,任何不在列表中的输入都会被立即拒绝并记录日志。这种方法的安全性极高,因为它从根本上切断了用户输入与文件系统的直接联系,攻击者无法通过构造特殊路径或文件名进行绕过。虽然维护列表需要一定成本,但其提供的安全保障使得它成为大多数场景下的首选方案,是实现安全文件包含的最佳实践之一。

(2)硬编码/映射 (Hardcoding/Mapping)

硬编码或映射是安全性最高的防御方法,它完全消除了用户对文件路径的控制。开发者通过switch-case语句或键值对数组,将用户提供的抽象标识符(如"home"、"about")在服务器端映射到固定的真实文件路径。用户输入仅作为选择器,绝不参与路径拼接。这种方法彻底杜绝了文件包含风险,因为攻击者无法通过输入注入任何路径遍历字符或恶意URL。虽然缺乏灵活性,需要修改代码才能增加新页面,但其提供的绝对安全性使其成为控制面板、固定功能模块等场景的理想选择。

(3)输入过滤 (Input Filtering)

输入过滤是一种试图净化用户输入的防御方式,通过移除或替换危险字符(如../、..\、空字节%00)来降低风险。常见做法包括使用str_replace函数过滤目录遍历符、用basename函数剥离路径信息、或强制添加文件后缀。然而,这种方法安全性较差,被认为是一种不可靠的黑名单机制,复杂的过滤规则可能被双写编码(....//)或其他变形方式绕过。它只能作为辅助性的深度防御措施,绝不能作为主要的安全依赖,否则会给予开发者错误的安全感,导致严重的防护风险。

(4)服务器配置防范 (Server Configuration)

服务器配置防范通过修改运行环境参数来构建底层安全防线,属于纵深防御策略。关键措施包括:设置php.ini中的open_basedir限制PHP可访问的目录范围,防止横向移动;确保allow_url_include=Off彻底禁用远程文件包含功能;以最低权限原则运行Web服务进程。这些配置从系统层面限制了攻击的影响范围,即使应用存在安全风险也能有效遏制危害。虽然不能替代应用层修复,但作为基础安全基线必须实施,为整个服务器环境提供 essential 的保护层。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/94865.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/94865.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

构建坚不可摧的数据堡垒:深入解析 Oracle 高可用与容灾技术体系

在当今数字化时代&#xff0c;数据是企业的核心资产&#xff0c;而承载这些数据的数据库系统的连续性与稳定性直接关系到企业的生死存亡。一次计划外的停机或灾难性的数据丢失&#xff0c;带来的不仅是经济上的巨大损失&#xff0c;更是对品牌信誉和客户信任的致命打击。因此&a…

【3D算法技术入门】如何基于建筑图片重建三维数字资产?

要基于建筑图片重建三维数字资产是一个复杂的计算机视觉任务&#xff0c;涉及图像采集、特征提取、相机姿态估计、稠密重建和三维模型优化等多个步骤。下面我将提供一个基于Python的解决方案框架&#xff0c;使用开源库实现从图片到三维模型的基本流程。 首先需要安装必要的库&…

⭐CVPR2025 自动驾驶半监督 LiDAR 分割新范式:HiLoTs 框架深度解析

&#x1f4c4;论文题目&#xff1a;HiLoTs: High-Low Temporal Sensitive Representation Learning for Semi-Supervised LiDAR Segmentation in Autonomous Driving ✍️作者及机构&#xff1a; R.D. Lin、Pengcheng Weng、Yinqiao Wang、Fei Wang&#xff08;西安交通大学软件…

【 MYSQL | 基础篇 函数与约束 】

摘要&#xff1a;本文介绍数据库中的函数与约束&#xff0c;函数含字符串、数值、日期、流程四类&#xff0c;可实现字符串处理、数值计算等需求。约束分六类&#xff0c;重点讲外键约束的语法、删除更新行为&#xff0c;保证数据正确完整。思维导图1. 函数函数是指一段可以直接…

Oracle 数据库性能调优:从瓶颈诊断到精准优化之道

引言&#xff1a;性能优化的本质在当今数据驱动的时代&#xff0c;数据库性能直接关系到企业的运营效率和用户体验。Oracle 作为全球领先的关系型数据库管理系统&#xff0c;承载着众多企业的核心业务。然而&#xff0c;随着数据量的增长和业务复杂度的提升&#xff0c;数据库性…

杨校老师竞赛课堂之C++语言GESP一级笔记

考试大纲 GESP一级考试大纲 计算机基础与编程环境 计算机历史 变量的定义与使用 基本数据类型&#xff08;整型、浮点型、字符型、布尔型&#xff09; 输入与输出&#xff08;cin与cout、scanf与printf&#xff09; 基本运算&#xff08;算术运算、关系运算、逻辑运算&am…

操作系统-管程

1. 为什么需要管程&#xff1f;—— 信号量 (Semaphore) 的困境在理解管程之前&#xff0c;你必须先知道它要解决什么问题。之前&#xff0c;我们使用信号量 (Semaphore) 来实现进程/线程间的同步与互斥。虽然信号量功能强大&#xff0c;但它存在两个主要问题&#xff1a;编程复…

日志的实现

目录 日志与策略模式 Log.hpp class LogStrategy基类 class ConsoleLogStrategy派生类 classFileLogStrategy派生类 日志等级 获得时间戳 localtime_r函数详解 函数原型 struct tm结构的指针 Logger类(重点) class LogMessage 日志信息类 std::stringstream 用法 重…

【论文阅读】Sparse4D v2:Recurrent Temporal Fusion with Sparse Model

标题&#xff1a; Sparse4D v2&#xff1a;Recurrent Temporal Fusion with Sparse Model 作者&#xff1a; Xuewu Lin, Tianwei Lin, Zixiang Pei, Lichao Huang, Zhizhong Su motivation 在v1的基础上&#xff0c;作者发现长时序有更好的效果&#xff0c;但v1的计算量太大&am…

构建免费的音视频转文字工具:支持多语言的语音识别项目

在当今数字时代&#xff0c;音视频内容越来越多&#xff0c;但如何快速将其转换为文字一直是一个挑战。本项目提供了一个免费的解决方案&#xff0c;支持将视频和音频文件转换为文字&#xff0c;并且支持多语言识别。 一个支持中英文的音视频转文字工具&#xff0c;集成了 Vos…

【开题答辩全过程】以 基于SpringBootVue的智能敬老院管理系统为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

Linux 830 shell:expect,ss -ant ,while IFS=read -r line,

[rootsamba caozx26]# scp /home/caozx26/pub root192.168.235.3:~/ root192.168.235.3s password: /home/caozx26/pub: not a regular file [rootsamba caozx26]# ls app km nntp.sh ntp.sh until1.sh 公共 图片 音乐 find.sh l2 ntp1.sh pub u…

​​​​​​​GPT-5发布引爆争议,奥特曼连夜回应!付费充值的Plus用户成最大赢家?

摘要&#xff1a; GPT-5发布后&#xff0c;社区口碑两极分化&#xff0c;从“强无敌”到“还我4o”的呼声并存。面对技术故障和用户质疑&#xff0c;OpenAI CEO萨姆奥尔特曼及团队火速回应&#xff0c;公布了一系列补救措施和未来计划。本文将带你速览这场风波始末&#xff0c;…

Python 操作 Redis 的客户端 - Redis Stream

Python 操作 Redis 的客户端 - Redis Stream1. Redis Stream2. Redis Commands2.1. CoreCommands.xadd() (生产端)2.2. CoreCommands.xlen() (生产端)2.3. CoreCommands.xdel() (生产端)2.4. CoreCommands.xrange() (生产端)2.5. RedisClusterCommands.delete()3. Redis Stream…

【Qt开发】按钮类控件(一)-> QPushButton

目录 1 -> 什么是 PushButton&#xff1f; 2 -> 相关属性 3 -> 代码示例 3.1 -> 带有图标的按钮 3.2 -> 带有快捷键的按钮 4 -> 总结 1 -> 什么是 PushButton&#xff1f; 在 Qt 框架中&#xff0c;QPushButton 是最基础且最常用的按钮控件之一&am…

Citrix 零日漏洞自五月起遭积极利用

安全研究员 Kevin Beaumont 披露了有关 CVE-2025-6543 的惊人细节&#xff0c;这是一个严重的 Citrix NetScaler 漏洞&#xff0c;在该公司发布补丁之前的几个月里&#xff0c;该漏洞被积极利用作为零日攻击。 Citrix 最初将其轻描淡写为简单的“拒绝服务”漏洞&#xff0c;但…

【系列08】端侧AI:构建与部署高效的本地化AI模型 第7章:架构设计与高效算子

第7章&#xff1a;架构设计与高效算子 要将AI模型成功部署到端侧&#xff0c;除了对现有模型进行压缩和优化&#xff0c;更根本的方法是在设计之初就考虑其在资源受限环境下的运行效率。本章将深入探讨如何设计高效的网络架构&#xff0c;以及如何理解并优化常用的核心算子。高…

42-Ansible-Inventory

文章目录Ansible基本概述手动运维时代&#xff08;原始社会&#xff09;自动化运维时代自动化运维工具的优势Ansible的功能及优点Ansible的架构Ansible的执行流程安装AnsibleAnsible配置文件生效顺序Ansible inventory主机清单Ansible基于免秘钥方式管理客户端小结Ansible-Adho…

Go语言runtime/trace工具全面解析

基本概念与功能 Go语言的runtime/trace是Go标准库中内置的性能分析工具,主要用于追踪和可视化Go程序的运行时行为。它能够记录程序执行期间的各种事件,包括goroutine调度、系统调用、垃圾回收(GC)、网络I/O、锁等待等关键信息。 trace工具的核心功能包括: goroutine生命周期…

Docker(自写)

Docker程序是跑在操作系统上的&#xff0c;而操作系统上又装了各种不同版本的依赖库和配置程序依赖环境&#xff0c;环境不同&#xff0c;程序就可能跑不起来&#xff0c;如果我们能将环境和程序一起打包docker就是可以将程序和环境一起打包并运行的工具软件基础镜像DockerFile…