DVWA系列之14 文件包含漏洞分析

程序开发人员通常会把可重复使用的函数写入到单个文件中,在使用某些函数时,直接调用此文件,而无需再次编写,这种调用文件的过程一般被称为包含。程序开发人员都希望代码更加灵活,所以通常会将被包含的文件设置为变量,用来进行动态调用,但正是由于这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。

PHP中提供了四个文件包含的函数,分别是include()、include_once()、require()和require_once(),它们的区别如下:

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

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

  • include_once与include类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含。

  • require_once与require类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含。

比如我们看下面这个例子,01.txt是一个正常的文本文件,但文件内容却是符合PHP语法的代码:

DVWA系列之14 文件包含漏洞分析

在02.php文件中包含01.txt,代码如下:

DVWA系列之14 文件包含漏洞分析

将这两个文件都放到D:\AppServ\www目录,然后在浏览器中访问02.php,可以看到01.txt中的代码被正确执行了。接下来将02.txt文件的扩展名分别改为jpg、rar、doc、xxx进行测试,发现都可以正确显示phpinfo信息。由此可知,只要文件内容符合PHP语法规范,那么任何扩展名都可以被PHP解析。

DVWA系列之14 文件包含漏洞分析

我们再创建一个测试文件03.txt,文件内容是“Hello,world!”,并不符合PHP语法规范,可以发现这种文件可以直接显示其内容。