设置题目难度为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}";
组成部分:
-
require_once-
包含并运行指定文件
-
_once确保文件只被包含一次,避免重复包含错误
-
-
DVWA_WEB_PAGE_TO_ROOT-
DVWA 的常量,表示 网站根目录的路径
-
例如:
/var/www/html/dvwa/
-
-
路径拼接
-
"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这个函数,他会把远程服务器上的,这段代码加载进来
那我们访问这个网站

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