File Inclusion

设置题目难度为low

点击File Inclusion(文件收录)

网页这边给了三个文件访问

访问file1,访问出页面的同时网址也变成

看网址

fi后面缺少index.php,加上没什么变化,但代表我们访问的文件是正确的

直接打开文件目录,

phpstudy_pro\WWW\DVWA\vulnerabilities\fi

分别找到index.php,file1.php,low.php三个文件

先看index.php代码

复制代码
<?php

define( 'DVWA_WEB_PAGE_TO_ROOT', '../../' );
require_once DVWA_WEB_PAGE_TO_ROOT . 'dvwa/includes/dvwaPage.inc.php';

dvwaPageStartup( array( 'authenticated' ) );

$page = dvwaPageNewGrab();
$page[ 'title' ]   = 'Vulnerability: File Inclusion' . $page[ 'title_separator' ].$page[ 'title' ];
$page[ 'page_id' ] = 'fi';
$page[ 'help_button' ]   = 'fi';
$page[ 'source_button' ] = 'fi';

dvwaDatabaseConnect();

$vulnerabilityFile = '';
switch( dvwaSecurityLevelGet() ) {
	case 'low':
		$vulnerabilityFile = 'low.php';
		break;
	case 'medium':
		$vulnerabilityFile = 'medium.php';
		break;
	case 'high':
		$vulnerabilityFile = 'high.php';
		break;
	default:
		$vulnerabilityFile = 'impossible.php';
		break;
}

require_once DVWA_WEB_PAGE_TO_ROOT . "vulnerabilities/fi/source/{$vulnerabilityFile}";

// if( count( $_GET ) )
if( isset( $file ) )
	include( $file );
else {
	header( 'Location:?page=include.php' );
	exit;
}

dvwaHtmlEcho( $page );

?>

先得了解这个代码的生成方式

从17行开始,源代码中使用switch,去判断用户传过来的安全等级,这边是low,所以找到low.php

复制代码
<?php

// The page we wish to display
$file = $_GET[ 'page' ];

?>

再看这串代码

require_once DVWA_WEB_PAGE_TO_ROOT . "vulnerabilities/fi/source/{$vulnerabilityFile}";

组成部分:

  1. require_once

    • 包含并运行指定文件

    • _once 确保文件只被包含一次,避免重复包含错误

  2. DVWA_WEB_PAGE_TO_ROOT

    • DVWA 的常量,表示 网站根目录的路径

    • 例如:/var/www/html/dvwa/

  3. 路径拼接

    • "vulnerabilities/fi/source/{$vulnerabilityFile}"

    • 构建完整的文件路径

这串代码照样运算访问low.php

看36行这串代码include( $file )就是访问网页上的file1,file2,file3

但是目录上面还有个file4,这个就是题目不想让我们看见的文件,这是个关于路径漏洞的知识通过这样的路径漏洞我们还可以访问很多文件,甚至可以访问c盘,提取敏感信息

这边的file4.php是相对路径等同于./file4.php,也就是当前文件夹(index.php所在的文件夹)下的 file4.php

我们可以通过../(这个是访问上层目录下的某个文件)

dvwa/vulnerabilities/fi/?page=../

通过报错的信息我们就可以看到现在在那个位置了

设置题目难度为中等

查看源代码

中级难度的代码比低级难度多出两行

这两行代码让我们没有办法使用../来访问目录

主要问题:过滤可以被绕过

绕过方法1:嵌套遍历

php

复制代码
?page=..././..././etc/passwd
// 过滤后:../../../etc/passwd

双写写两遍..././=../

就可以绕过过滤

绕过方法2:双重编码

php

复制代码
?page=..%252f..%252fetc%252fpasswd
// 第一次URL解码:..%2f..%2fetc%2fpasswd
// str_replace过滤:..%2f..%2fetc%2fpasswd(无变化)
// 文件系统可能识别

绕过方法3:非常规路径分隔符

php

复制代码
?page=..\../..\/etc/passwd
// 在Windows系统上可能有效

绕过方法4:绝对路径(如果允许)

php

复制代码
?page=/etc/passwd
// 如果应用有读取权限,可以直接访问系统文件

同样还有这么一段代码file = str_replace( array( "http://", "https://" ), "", file );

他是用来过滤http

但是我们还是可以用双写绕过

hhttp://ttp://=http://

这样就可以访问网址了

http是怎么样让我们信息泄露的,php中include这个函数,他会把远程服务器上的

这段代码加载进来,如果里面有php代码,他会优先执行这段代码

就比如我们再创建一个网站,dvwa2,浏览在桌面文件夹shiyan,端口为8080

现在网站里面没东西,那让我们在文件夹shiyan里面放个txt文件

文件内容为这段php代码

复制代码
<?php echo phpinfo();?>

保存后我们8080服务器下就有了1.txt文件与这段php代码

再加上include这个函数,他会把远程服务器上的,这段代码加载进来

那我们访问这个网站

就能看见我们服务器上所以信息

相关推荐
冬奇Lab8 小时前
MediaPlayer 播放器架构:NuPlayer 的 Source/Decoder/Renderer 三驾马车
android·音视频开发·源码阅读
炸炸鱼.10 小时前
Python 操作 MySQL 数据库
android·数据库·python·adb
zh_xuan11 小时前
Visual Studio 上传工程到github
ide·git·github·visual studio
用户416596736935511 小时前
nextlib 项目架构与深度技术指南 (Architecture & Technical Master Guide)
android
aq553560012 小时前
Laravel10.x重磅升级,新特性一览
android·java·开发语言
Trouvaille ~12 小时前
【MySQL篇】数据类型:存储数据的基础
android·数据库·mysql·adb·字符集·数据类型·基础入门
无限进步_13 小时前
【C++】只出现一次的数字 II:位运算的三种解法深度解析
数据结构·c++·ide·windows·git·算法·leetcode
2401_8858850413 小时前
开发视频短信接口好开发吗?图文视频短信接口对接教程
android·音视频
无限进步_14 小时前
【C++】多重继承中的虚表布局分析:D类对象为何有两个虚表?
开发语言·c++·ide·windows·git·算法·visual studio
千码君201614 小时前
kotlin:Jetpack Compose 给APP添加声音(点击音效/背景音乐)
android·开发语言·kotlin·音效·jetpack compose