文件包含是一种功能,在各种开发语言中都提供了内置的文件包含函数。在PHP中,例如,可以使用include()和require()函数来引入另一个文件。这个被引入的文件可以当作PHP代码执行,而忽略其后缀本身。
// if( count( $_GET ) )
if( isset( $file ) )include( $file );
else {header( 'Location:?page=include.php' );exit;
}
文件包含功能可以使开发人员在一个代码文件中直接包含(引入)另外一个代码文件,从而让代码更加高效。但是,如果被包含的文件是一个变量,且这个变量可以由前端用户传进来,那么可能会引发文件包含漏洞。攻击者会指定一个“意想不到”的文件让包含函数去执行,从而造成恶意操作。
DVWA
级别low
点击file1.php,文件名直接显示在了地址栏 (这种情况会出现文件包含)
直接修改url中的文件,发现读取到了其他文件内容
<?php// The page we wish to display
$file = $_GET[ 'page' ];?>
低级别代码中,直接信任了用户输入,并返回了文件。
级别中
<?php// The page we wish to display
$file = $_GET[ 'page' ];// Input validation
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\\" ), "", $file );?>
可以看到对输入的文件名进行了过滤,替换了https://,https://和../ ..\\
这种情况,仍能读取到其他文件,如读取目录下的a.txt,这里输出了内容123456。
级别高
<?php// The page we wish to display
$file = $_GET[ 'page' ];// Input validation
if( !fnmatch( "file*",