DVWA下的文件包含(通关) – 作者:fu福lin林

PHP包含漏洞:

几乎所有的脚本语言中都会提供文件包含的功能,但文件包含漏洞在PHP Web Application中居多,在JSP、ASP中十分少甚至没有,问题在于语言设计的弊端。

文件包含原理

PHP中提供了四个文件包含的函数,分别是include()、include_once()、require()和require_once()。这四个函数都可以进行文件包含,但作用并不一样。

require:找不到被包含的文件时会产生致命错误,并停止脚本。

include:找不到被包含的文件时只会产生警告,脚本将继续执行。

include_once:和include()语句类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含。 require_once:和require()语句类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含。

文件包含分类

PHP中的文件包含分为本地包含和远程包含。
(一)本地包含 Local File Include (LFI)

1、所包含文件内容符合PHP语法规范:任何扩展名都可以被PHP解析。
2、包含非PHP语法规范源文件,会暴露其源代码。

(二)远程包含 Remote File Include (RFI)
如果要使用远程包含功能,首先需要确定PHP是否已经开启远程包含功能选项(php默认关闭远程包含功能:allow_url_include=off),开启远程包含功能需要在php.ini配置文件中修改。

远程包含与本地包含没有区别,无论是哪种扩展名,只要遵循PHP语法规范,PHP解析器就会对其解析。

low级别

<?php

// The page we wish to display

$file = $_GET[ 'page' ];

?>

源码很简单,对page参数没有做任何的过滤跟检查。

1604632840_5fa4c10822a6b38d7f47d.png!small?1604632839431

这里有三个文件:file1.php、file2.php、file3.php

可以都点开看看

1604633103_5fa4c20f43dc2fb484115.png!small?1604633102608

1604633129_5fa4c229056c5a0070722.png!small?1604633128266

1604633163_5fa4c24b718d01501ff6f.png!small?1604633162768

同时需要注意的是,看看本地的php配置文件,php.ini

1604643461_5fa4ea856ca8d68c80707.png!small?1604643484776

Magic_quote_gpc=off,同时allow_url_include=on,如果不是这样就需要修改保存,然后重启phpstudy。

通过访问file1.php、file2.php、file3.php发现一个规律:

http://172.21.98.85/vulnerabilities/fi/?page=file1.php

http://172.21.98.85/vulnerabilities/fi/?page=file2.php

http://172.21.98.85/vulnerabilities/fi/?page=file3.php

1604643842_5fa4ec0278ffbd2db2eef.png!small?1604643865830

那么就可以尝试访问:http://172.21.98.85/vulnerabilities/fi/?page=hacker.php

其实hacker.php并不存在,看看什么效果

1604648613_5fa4fea587ef8dbc8fc43.png!small?1604648636999

肯定是不存在内容的,但是并没有报错信息,这个时候就需要仔细回顾了。

1604648716_5fa4ff0c26fc1047af2bf.png!small?1604648739590

The PHP function allow_url_include is not enabled

PHP功能allow_url_include未启用

这个算是个问题了,如果继续往下,你会发现,你跟网上资料写的操作一样,但就是结果不一样,进而打击自己的信心,其实心细一点儿就好了。

怎么解决这个问题呢?

打开phpstudy,点击设置:

1604649129_5fa500a986282e99bee1c.png!small?1604649152991

选中php.ini,然后点击下面php7.3.4nts,需要修改参数,我这个php版本比较高。

1604649228_5fa5010cca5f2d58ed9a1.png!small?1604649252278

1604649309_5fa5015db5d7fdb0b7399.png!small?1604649333094

改完后保存,然后重启phpstudy。再继续上面的操作。

1604649426_5fa501d2f1b8a6835e0e8.png!small?1604649450369

这回没有这句话了:The PHP function allow_url_include is not enabled

1604649503_5fa5021f9d3bdb944c3c6.png!small?1604649527148

访问http://172.21.98.85/vulnerabilities/fi/?page=..\..\php.ini,成功读取php.ini文件。

再多说一句,..\..\的用法

.\ 表示项目文件所在目录之下的目录。
..\ 表示项目文件所在目录向上一级目录下的目录。
..\..\表示项目文件所在目录向上二级目录之下的目录

1604650449_5fa505d192f8b45e31edf.png!small?1604650473028

1604651263_5fa508ffb577926459491.png!small?1604651287327

这就是本地包含了,远程包含就算了。

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

?>

可以看到,Medium级别的代码增加了str_replace函数,对page参数进行了一定的过滤,将”http:// ”、”https://”、 ” ../”、”..\”替换为空字符。但str_replace函数并不是很安全,随便双写就可以绕过了,而且” ../”、”..\”替换为空字符,那么绝对路径来讲,是不受任何影响的。

http://172.21.98.85/vulnerabilities/fi/?page=..\..\php.ini,没有影响。

1604651772_5fa50afc6c27e5783ab00.png!small?1604651795905

再来试试相对路径的,http://172.21.98.85/vulnerabilities/fi/?page=http://172.21.98.85/phpinfo.php

1604651847_5fa50b4718b9c16f0b0d9.png!small?1604651870512

不能读取,说明源码里的函数多少还是有点作用的,但是绝对路径就没事了。

1604652203_5fa50cab6c9fe429f104a.png!small?1604652226887

medium级别

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

}

?>

可以看到High级别的代码使用了fnmatch函数检查page参数,要求page参数的开头必须是file,服务器才会去包含相应的文件。

再来试试 http://172.21.98.85/vulnerabilities/fi/?page=D:/phpstudy_pro/WWW/DVWA-master/phpinfo.php

1604652389_5fa50d65ddb4c8a365a4e.png!small?1604652413405

明显读取不了,那么就加上file

1604652458_5fa50daa5d49645081a55.png!small?1604652481972

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;

}

?>

可以看到,Impossible级别的代码使用了白名单机制进行防护,简单粗暴,page参数必须为“include.php”、“file1.php”、“file2.php”、“file3.php”之一,彻底杜绝了文件包含漏洞。这个思路也是以后加固该漏洞的最好思路。

关于DVWA通关就到这里了,这是最后一篇了,专属自己的手册。其实很多内容都很浅,但学习和进步的过程本来就是由浅到深,往后继续加油!

来源:freebuf.com 2020-11-06 16:55:44 by: fu福lin林

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论