DVWA靶场——File Inclusion(文件包含)笔记
File Inclusion文件包含是指当服务器开启了allow_url_include选项时通过一些PHP的特性函数比如include()require()include_once()和require_once()利用URL去动态包含文件此时如果没有对文件来源进行严格审查就会导致任意文件读取或者任意命令执行。这里我们先明确两个概念文件包含分类本地文件包含当被包含的文件在本地服务器时就叫做本地文件包含例../../../../../etc/passwd远程文件包含当被包含的文件在第三方服务器时就叫做远程文件包含例http://www.baidu.com 可以直接打开百度特性函数区别include() 当使用该函数包含文件时只有代码执行到include()函数时才将文件包含进来发生错误时只给出一个警告继续向下执行 include_once() 功能和include()相同区别在于当重复调用同一文件时程序只调用一次 require() require()与include()的区别在于require()执行如果发生错误函数会输出错误信息并终止脚本的运行 。使用require()函数包含文件时只要程序一执行立即调用文件而include()只有程序执行到函数时才调用 .require()在php程序执行前执行会先读入 require 所指定引入的文件使它变成 PHP 程序网页的一部份。 require_once() 它的功能与require()相同区别在于当重复调用同一文件时程序只调用一次low我们首先打开第一个文件发现文件名显示在URL中这就表明文件名是可控的。因此我们推测可以直接在URL中修改相关参数使用相对路径读取系统文件我是在windows系统下搭建的靶场环境如果读者在Linux环境下应该类似于../../../../etc/passwd这种成功读取返回了Windows的hosts文件内容包含文件的版权和说明信息127.0.0.1 localhost映射::1 localhostIPv6映射结论 确认可以从系统目录读取任意文件。源码分析?php // The page we wish to display //直接获取page参数未做任何过滤 $file $_GET[ page ]; ?这里可以看到注释作者已经告诉我们没做任何过滤Medium我们还是试试读取系统文件可以看到已经找不到这个文件了说明后端一定过滤了某些字段是我们的拼接失效了这里确实猜不到具体过滤了什么所以先看看源码?php // The page we wish to display $file $_GET[ page ]; // Input validation //将参数中的http:// https:// ../ ..\都替换成空 $file str_replace( array( http://, https:// ), , $file ); $file str_replace( array( ../, ..\ ), , $file ); ?将“http://”“https://”“../”“..\”全部替换成了空知道了其原理我们就可以尝试着拼接绕过。1.使用..././组合过滤前..././过滤后../2.双写绕过过滤前....//过滤后../3.URL编码绕过字符URL编码双重URL编码/%2F%252F\%5C%255C.%2E%252E我们就试试最简单的双写绕过没问题High这个级别的难度应该更大我们也先看看源代码?php // The page we wish to display $file $_GET[ page ]; // Input validation //文件名必须以file开始或只能为include.php if( !fnmatch( file*, $file ) $file ! include.php ) { // This isnt the page we want! echo ERROR: File not found!; exit; } ?这里是直接做了白名单限制匹配file*,以file开头的文件,或者匹配include.php如果不是以file开头的文件,或者不是include.php,就输出ERROR: File not found!。我们先不使用file伪协议直接使用绝对路径做拼接试试确实给我们跳转了not found那我们再试试使用file伪协议进行绕过跳转的内容和我们上面的一模一样大家可以看看大佬写的这篇文章提到了很多伪协议文件包含漏洞详解-CSDN博客Impossible?php // The page we wish to display $file $_GET[ page ]; // Only alLow include.php or file{1..3}.php //file变量只能为include.php、file1、file2、file3其中一个 if( $file ! include.php $file ! file1.php $file ! file2.php $file ! file3.php ) { // This isnt the page we want! echo ERROR: File not found!; exit; } ?Impossible难度的代码使用了白名单机制进行防护简单粗暴page参数必须为“include.php”、“file1.php”、“file2.php”、“file3.php”之一彻底杜绝了文件包含漏洞。