文章目录
前言
文件包含:
文件包含是指为了提高开发效率,将不同功能写入到单独文件中,在需要使用该功能时,将相应的文件导入即可。
常见的文件包含函数:
- require:找不到被包含的文件,报错,并且停止运行脚本。
include:找不到被包含的文件,只会报错,但会继续运行脚本。
require_once:与require类似,区别在于当重复调用同一文件时,程序只调用一次。
include_once:与include类似,区别在于当重复调用同一文件时,程序只调用一次。
文件包含漏洞:
之所以会形成该漏洞,是由于开发人员在设计导入文件时,未对导入的文件做严格检查,导致用户自行指定导入的文件,尤其是指定一些恶意文件,对服务器造成破坏,这就是文件包含漏洞。
防御:
由于文件包含漏洞时由于在导入文件时,没有做细致过滤,因此,防御该攻击的方法,还是应该从服务器入手,对导入的文件做认真检查过滤,防止用户注入恶意文件。
一、Low
1、演示
打开DVWA文件包含靶场页面,发现URL包含了index.php,分别点击三个文件,URL中的page则分别为相应的文件
在桌面创建一个 1.txt 文件,内容为 查看php信息的php语句:
<?php phpinfo(); ?>
利用访问本地文件的 File 协议,将page的值改为 1.txt 的绝对路径:
file://C:\users\13714\Desktop\1.txt
回车发现已经成功访问并解析该文件,将txt文件解析为php文件
也可以访问网络文件
将刚才的1.txt文件复制到网站的根目录下,此时的文件网络路径为:
http://127.0.0.1:8181/1.txt
更改page为该网络路径,成功访问解析
也可以通过相对路径访问服务器文件,即 ./ 和 …/
2、源码
嗯。毫无过滤。
二、Medium
使用Low中的三种方法尝试,发现只有使用 File 协议访问本地文件时,才能成功,其余两种均失败。查看源码进一步分析:
可见,源码中替换了网络协议 http:// 和 https:// 以及相对路径 …/ 和 …\。
由于 str_replace()
函数区分大小写,因此可以采用大小写混用绕过的方法。
(注:str_ireplace()
函数不区分大小写,相对更安全。)
如使用 Http等:Http://127.0.0.1:8181/1.txt
也可以采用截断的方法,如:hthttp://
tp://127.0.0.1:8181/1.txt,将中间的 http:// 替换,剩下的自己拼接成一个完整的 url
类似的,也可以截断拼接相对地址:.../
./.../
./1.txt
三、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;
}
?>
关键是这句:if( !fnmatch( "file*", $file ) && $file != "include.php" )
fnmatch()函数:匹配字符串,file* 是指以 file* 开头。
这句代码的意思:如果文件(路径)不是以 file 开头或文件不是 include.php,则失败。
因此,可以用 file 协议,来打开本地文件:
四、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;
}
?>
emmmm,直接就指定了四个文件,不可能有操作了。
工科学生死板板 发布了82 篇原创文章 · 获赞 102 · 访问量 1万+ 私信 关注