1.原理
文件包含是因为服务器端某些程序对用户提交参数过滤不当造成的,该程序一般具有以读取方式输出文件内容或者下载文件,前者也可以叫做任意文件读取,两者本质上是一样的。
1. 通常在以下情况下存在该漏洞。通过在请求参数中传入文件路径,包括相对路径和绝对路径,如:download.php?filename=index.html
2. PHP代码中存在的本地文件包含漏洞,如include、 include_ once、 require、require__once
3. 一Web目录映射到根目录,导致可直接下载任意文件,如:
htttp://127.0.0.1/etc/ passwd
2.介绍
程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某些函数时,直接调用此文件,而无须再次编写,这种调用文件的过程一般被称为包含。
程序开发人员都希望代码更加灵活,所以通常会将被包含的文件设置为变量,用来进行动态调用,但正是由于这种灵活性,从而导致客户端可以调用一一个恶意文件,造成文件包含漏洞。文件包含漏洞在PHP Web Application中居多,而在JSP,ASP,ASP.NET程序中却非常少,甚至没有包含漏洞的存在。
3.导致文件包含的函数:
- include()
- include_ once()
- require()
- require_ _once()
- fopen()
- readfile()
当使用前4个函数包含一个新的文件时,只要文件内容符合PHP语法规范,那么任何扩展名都可以被PHP解析。包含非PHP语法规范源文件时,将会暴露其源代码。可以使用file://和php://协议进行读取。php://filter/read/ convert. base64-encode/resource=
include和require区别主要是,include在 包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行;而require函 数出现错误的时候,会直接报错并退出程序的执行。
而include_ once(),require_ once()这 两个函数,与 前两个的不同之处在于这两个函数只包含一次,适用于在脚本执行期间同一个文件有可能被包括超过一次的情况下,你想确保它只被包括一次以避免函数重定义,变量重新赋值等问题。
返回1.php的源代码
http://127.0.0.1/DVWA-2.0.1/vulnerabilities/fi/?page=php://filter/read/convert.base64-encode/resource=file1.php
4.文件包含的种类
1、本地文件包含
假如用户可以控制file参数,那么通过控制file的值来读取文件。如etc/passwd等等。
定义了后缀名=>使用%00(%00截断条件: magic_ quotes _gpc = Offphp版本<5.3.4)
读取其他目录=> …目录遍历
这种包含本地文件的形式的漏洞就叫做本地文件包含漏洞
<?php
$file = $_ GET['file'];
if (file_ exists( 'home/' .