####一、什么是文件包含漏洞?
服务器通过php的特性(函数)去包含任意文件时,由于要包含的这个文件来源过滤不严,从而可以去包含一个恶意文件,而我们可以构造这个恶意文件来达到邪恶的目的。
####二、常见文件包含函数有哪些?
常见包含函数有:include()、require()
区别:
include是当代码执行到它的时候才加载文件,发生错误的时候只是给一个警告,然后继续往下执行
require是只要程序一执行就会立即调用文件,发生错误的时候会输出错误信息,并且终止脚本的运行
require一般是用于文件头包含类文件、数据库等等文件,include一般是用于包含html模版文件
include_once()、require_once()与(include\require)的功能相同,只是区别于当重复调用的时候,它只会调用一次。
####三、为什么要包含文件?
程序员写程序的时候,不喜欢干同样的事情,也不喜欢把同样的代码(比如一些公用的函数)写几次,于是就把需要公用的代码写在一个单独的文件里面,比如 share.php,而后在其它文件进行包含调用。在php里,我们就是使用上面列举的那几个函数来达到这个目的的,它的工作流程:如果你想在 main.php里包含share.php,我将这样写include(“share.php”)就达到目的,然后就可以使用share.php中的函数了。
####四、为什么会产生漏洞?
你也许要说,这样很好呀,可以按照URL来动态包含文件,多么方便呀,怎么产生漏洞的呢?问题的答案是:我们不乖巧,我们总喜欢和别人不一样,我们不会按照他的链接来操作,我们可能想自己写想包含(调用)的文件,比如我们会随便的打入下面这个URL:http: //hi.baidu.com/m4r10/php/index.php?page=hello.php。然后我们的index.php程序就傻傻按照上面我们说得步骤去执行:取page为hello.php,然后去include(hello.php),这时问题出现了,因为我们并没有hello.php这个文件,所以它 include的时候就会报警告,类似下列信息:
Quote:
Warning: include(hello.php) [function.include]: failed to open stream: No such file or directory in /vhost/wwwroot/php/index.phpon line 3
Warning: include() [function.include]: Failed opening hello.php for inclusion (include_path=.? in /vhost/wwwroot/php/index.php on line 3
注意上面的那个Warning就是找不到我们指定的hello.php文件,也就是包含不到我们指定路径的文件;而后面的警告是因为前面没有找到指定文件,所以包含的时候就出警告了。
####四、如何利用文件包含漏洞
1.包含读出目标机上其它文件
由前面我们可以看到,由于对取得的参数page没有过滤,于是我们可以任意指定目标主机上的其它敏感文件,例如在前面的警告中,我们可以看到暴露的绝对路径(vhost/wwwroot/php/),那么我们就可以多次探测来包含其它文件,比如指定URL为:http://hi.baidu.com/m4r10/php/index.php?page=./txt.txt可以读出当前路径下的txt.txt文件,也可以使用…/…/进行目录跳转(在没过滤…/的情况下);也可以直接指定绝对路径,读取敏感的系统文件,比如这个URL:http://hi.baidu.com/m4r10/php/index.php?page=/etc/passwd,如果目标主机没有对权限限制的很严格,或者启动Apache的权限比较高,是可以读出这个文件内容的。否则就会得到一个类似于:open_basedir restriction in effect.的Warning。
####五、参考文献
1、https://blog.csdn.net/chence19871/article/details/51906523
2、文件包含漏洞小结
#Webug3.0第10题
(1)进去后发现Not Found 错误,如下图所示。这道题是要我们根据提示下载需要的文件,可似乎没有什么提示,我们去扫描一下有关目录一下,有没有什么隐藏的文件。
(2)我们可以发现有download.php,进去瞧瞧,如下图所示:
(3)尝试下载图片,发现下载失败,如下图所示:
(4)题目说通过提示下载文件,扫描后发现只有一个config.php。这时候可以通过文件包含漏洞来下载文件,先构造url,比如:
http://172.20.10.14/pentest/test/6/1/download.php?fname=../../../pentest/test/6/1/db/config.php。如图所示:
(5)成功了。最后总结一下思路:
扫描目录----》下载尝试-----》根据提示构造url(这里利用到文件包含漏洞,若没有该漏洞,估计服务器会阻止下载的)。