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参数没有做任何的过滤跟检查。
这里有三个文件:file1.php、file2.php、file3.php
可以都点开看看
同时需要注意的是,看看本地的php配置文件,php.ini
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
那么就可以尝试访问:http://172.21.98.85/vulnerabilities/fi/?page=hacker.php
其实hacker.php并不存在,看看什么效果
肯定是不存在内容的,但是并没有报错信息,这个时候就需要仔细回顾了。
The PHP function allow_url_include is not enabled
PHP功能allow_url_include未启用
这个算是个问题了,如果继续往下,你会发现,你跟网上资料写的操作一样,但就是结果不一样,进而打击自己的信心,其实心细一点儿就好了。
怎么解决这个问题呢?
打开phpstudy,点击设置:
选中php.ini,然后点击下面php7.3.4nts,需要修改参数,我这个php版本比较高。
改完后保存,然后重启phpstudy。再继续上面的操作。
这回没有这句话了:The PHP function allow_url_include is not enabled
访问http://172.21.98.85/vulnerabilities/fi/?page=..\..\php.ini,成功读取php.ini文件。
再多说一句,..\..\的用法
.\ 表示项目文件所在目录之下的目录。 ..\ 表示项目文件所在目录向上一级目录下的目录。 ..\..\表示项目文件所在目录向上二级目录之下的目录
这就是本地包含了,远程包含就算了。
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,没有影响。
再来试试相对路径的,http://172.21.98.85/vulnerabilities/fi/?page=http://172.21.98.85/phpinfo.php
不能读取,说明源码里的函数多少还是有点作用的,但是绝对路径就没事了。
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
明显读取不了,那么就加上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;
}?>
可以看到,Impossible级别的代码使用了白名单机制进行防护,简单粗暴,page参数必须为“include.php”、“file1.php”、“file2.php”、“file3.php”之一,彻底杜绝了文件包含漏洞。这个思路也是以后加固该漏洞的最好思路。
关于DVWA通关就到这里了,这是最后一篇了,专属自己的手册。其实很多内容都很浅,但学习和进步的过程本来就是由浅到深,往后继续加油!
来源:freebuf.com 2020-11-06 16:55:44 by: fu福lin林
请登录后发表评论
注册