文件包含漏洞是“代码注入”的一种。“代码注入”这种攻击,其原理就是注入一段用户能控制的脚本或代码,并让服务器端执行。“代码注入”的典型代表就是文件包含(File Inclusion)。文件包含可能会出现在JSP、PHP、ASP等语言中
常见的导致文件包含的函数如下。
PHP:include(), include_once(), require(), require_once(), fopen(), readfile(), …
JSP/Servlet:ava.io.File(), java.io.FileReader(), …
ASP:include file, include virtual, …
文件包含是PHP的一种常见用法,主要由4个函数完成:include()require()include_once()require_once()
当使用这4个函数包含一个新的文件时,该文件将作为PHP代码执行,PHP内核并不会在意该被包含的文件是什么类型。所以如果被包含的是txt文件、图片文件、远程URL,也都将作为PHP代码执行
将test.php文件放到已配置到的web服务器所在目录,直接使用url即可访问并执行该php文件
文件内容为
include ($_GET[test]);
?>
包含该目录下的文件,这个文件在目录是不存在的,所以提示没找到。
那么访问一个存在的文件如a.txt,内容为
phpinfo();
?>
可以看到该txt文件中的函数已经被执行了。
要想成功利用文件包含漏洞,需要满足下面两个条件:
(1)include()等函数通过动态变量的方式引入需要包含的文件;
(2)用户能够控制该动态变量。
能够打开并包含本地文件的漏洞,被称为本地文件包含漏洞(Local File Inclusion,简称LFI)
使用了“…/…/…/”这样的方式来返回到上层目录中,这种方式又被称为“目录遍历,php设置open_basedir可以预防目录遍历
要解决文件包含漏洞,应该尽量避免包含动态的变量,尤其是用户可以控制的变量。可以使用白名单,枚举可以被包含的文件
如果PHP的配置选项allow_url_include为ON的话,则include/require函数是可以加载远程文件的,这种漏洞被称为远程文件包含漏洞(Remote File Inclusion,简称RFI)。如图可见提示all_url_include=0所以不允许包含http远程地址。
在php.ini文件设置
如果远程地址的文件包含可执行代码,则会被执行。
安全开发流程,能够帮助企业以最小的成本提高产品的安全性。它符合“Secure at the Source”的战略思想.
SDL的全称是Security Development Lifecycle,即:安全开发生命周期。它是由微软最早提出的,在软件工程中实施,是帮助解决软件安全问题的办法
自2004年起,SDL一直都是微软在全公司实施的强制性策略。SDL的大致步骤如下
微软为敏捷开发专门设计了敏捷SDL