文件包含:程序开发人员通常会把可重复使用的函数写到单个文件,在使用某些函数时,直接调用此文件,这种调用过程叫做文件包含。
文件包含漏洞:开发人员为了让代码的书写变得更加灵活,通常把被包含的文件设置为变量,用来动态调用,但如果用户对这个变量可控而且服务器端又没有对动态调用的文件进行足够的监测,或者校验被绕过就造成了文件包含漏洞。
PHP中常见的文件包含函数:
(1)include() :使用该函数包含文件,只有当代码执行到include()时,文件才会被包含进来,如果被包含的代码出错,系统会给一个警告,然后继续执行函数。
(2)include_once():功能与include()相同,但是当程序重复调用同一个文件时,只会调用一次。
(3)require(): require和include()类似,但是当require()调用的文件发生错误时,程序会输出错误信息,并终止脚本的执行。
(4)require_once():该函数和require()函数用法一样,区别类似与于include_once(),调用的文件发生错误信息,并终止脚本的执行。
当使用这四个函数包含一个新文件时,该文件将作为 PHP 代码执行,php 内核并不在意该被包含的文件是什么类型。所以如果被包含的是 txt 文件、图片文件、远程 url、也都将作为 PHP 代码执行。这一特性,在实施攻击时非常有用。
文件包含漏洞的分类:
文件包含漏洞分为LFI(本地文件包含)和RFI(远程文件包含)。
而区分他们最简单的方法就是php.ini中是否开启了allow_url_include。如果开启了我们就可能包含远程文件。
在php.ini中,allow_url_fopen默认一直是on,而allow_url_include从php5.2之后默认为off。
借助实验效果来更好的演示文件包含以及利用文件包含漏洞来获取信息:
(1)LFI(本地文件包含)
vim /etc/php5/cli/php.ini ##查看owasp靶机的php.ini文件,我使用的php版本是5.3.2
访问本地系统账户信息以及其他敏感信息:
(1) http://192.168.95.128/dvwa/vulnerabilities/fi/?page=/etc/passwd
(2) http://192.168.95.128/dvwa/vulnerabilities/fi/?page=/etc/shadow
(3) http://192.168.95.128/dvwa/vulnerabilities/fi/?page=/etc/mysql/my.cnf
以上只要本地文件有被读的权限都可以访问到。
(2)LFI(本地文件包含)+webshell:
结合上章文件上传漏洞,我们将制作一句话木马图片,然后上传图片,再执行图片,执行完图片会在服务器本机中生成一句话木马脚本文件,我们再来访问这个文件,最后利用中国菜刀来获取服务器的webshell。
步骤如下:
1)制作一句话图片木马:
网上制作方式有很多,这里我用copy法制作图片木马,大致步骤是
首先准备一张.jpg的图片 ——>再写一个一句话木马.php ——>然后执行命令copy /a 3.php + /b 1.jpg = 2.jpg
最后生成结果如下:
2)上传图片木马文件:
3)执行文件包含并生成后门:
当图片被执行之后,可以在/var/www/dvwa/vulnerabilities/fi目录下看到生成的木马文件shell2.php,如下:
4) 使用中国菜刀,向里面添加地址为/var/www/dvwa/vnlnerabilities/fi/shell2.php来获取服务器的webshell
以上通过上传图片木马利用本机文件包含漏洞来获取webshell就完成了。
(3)远程文件+webshell:
这种方式是指包含的文件来自远程服务器。具体实现步骤如下:
1) 首先我们可以用kali机来搭建一个远程服务器,
systemctl start apache2 ##开启apache服务器
systemctl status apache2 ##查看apache服务器的状态
vim /var/www/html/shell2.txt ##在apache目录下生成一个shell2.txt文件
2) 远程文件包含
当执行完远程主机上的shell.txt文件后,会在文件包含目录下生成一个shell3.php木马文件:
3)此时利用中国菜刀来获取webshell
我们来看一下低风险的文本包含漏洞源代码,如下可以看到,这时服务器对包含的文本没有局限,就是你包含任意文件都可以执行成功。
但是当遇到中风险等级的文件包含漏洞时,他的源代码如下:
为了解决这类问题,需要在输入包含文件时防止http/https头丢失:
当遇到高风险等级的文件包含漏洞时,他的源代码如下:
由上面可以知道,高风险等级的文件包含漏洞指定了包含文件必须为include.php,否则输出"ERROR: File not found!"