漏洞原理
程序开发人员通常会把可重复使用的函数写到单个文件中,在使用其它函数时,直接调用此文件,而无需再次编写,这种调用文件的过程一般称为包含。程序开发人员都希望代码更加灵活,所以通常会将被包含的文件设置为变量,用来进行动态调用。正是这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。
漏洞场景
php中引发文件包含漏洞的通常是以下四个函数:
1. include() 当使用该函数包含文件时,只有代码执行到include()函数时才将文件包含进来,发生错误时只给出一个警告,继续向下执行。
2. include_once() 功能和include()相同,区别在于当重复调用同一文件时,程序只调用一次。
3. require() 只要程序一执行就会立即调用文件,发生错误的时候会输出错误信息,并且终止脚本的运行
4. require_once() 它的功能与require()相同,区别在于当重复调用同一文件时,程序只调用一次。
当使用这四个函数包含一个新文件时,该文件将作为PHP代码执行,php内核并不在意该被包含的文件是什么类型。所以如果被包含的是txt文件、图片文件、远程url、也都将作为PHP代码执行。这一特性,在实施攻击时非常有用。
其他常见文件包含函数
jsp: ava.io.file()、java.io.filereader()……
asp: include file、include virtual…….
漏洞危害
- 服务器安全风险:攻击者可以利用文件包含漏洞在服务器上执行任意代码,从而控制系统。这可能导致数据泄露、数据篡改、拒绝服务攻击等严重后果。
- 数据泄露:攻击者可以利用文件包含漏洞访问敏感数据,如用户个人信息、信用卡信息等。这可能导致严重的隐私泄露和金融欺诈。
- 网站可用性下降:攻击者可以利用文件包含漏洞使网站无法正常运行,从而影响用户体验和业务运营。
- 法律责任:如果网站未能及时修复文件包含漏洞,导致用户遭受损失,网站可能会面临法律责任。
漏洞利用
漏洞的典型特征
变量的值为一个页面:
- ?page=a.php
-
?home=b.html
-
?file=content.........
漏洞利用的前提条件
-
web 应用采用 include 等文件包含函数,并且需要包含的文件路径是通过用户传输参数的
方式引入;
- 用户能够控制包含文件的参数,被包含的文件可被当前页面访问;
漏洞获取 webshell 的前提条件
1.攻击者需要知道文件存放的物理路径;
2.对上传文件所在目录拥有可执行权限;
3.存在文件包含漏洞;
分类
文件包含漏洞可以分为RFI(远程文件包含)和LFI(本地文件包含漏洞)两种。
而区分他们最简单的方法就是php.ini 中是否开启了allow_url_include。如果开启 了我们就有可能包含远程文件。
1、本地文件包含LFI(Local File Include)
2、远程文件包含RFI(Remote File Include)(需要php.ini中allow_url_include=on allow_url_fopen = On)
在php.ini中,allow_url_fopen默认一直是On,而allow_url_include从php5.2之后就默认为Off。
截断包含
%00截断
PHP内核是由C语言实现的,因此使用了C语言中的一些字符串处理函数。在连接字符串时,0字节(\x00)将作为字符串的结束符。所以在这个地方,攻击者只要在最后加入一个0字节,就能截断file变量之后的字符串?file=../../../../../../../../../etc/passwd%00(需要 magic_quotes_gpc=off,PHP小于5.3.4有效)
目录长度限制截断
Win 下可以利用 256 位截断,linux 下则需要 4096 位截断,最大值长度之后的字符将被丢弃。 而利用"./"的方式即可构造出超长目录字符串。
php伪协议文件包含
常见的 php 伪协议:
file://协议,php://协议,php://filter ,php://input ,zip://, bzip2://, zlib://协议,data://协议,http:// & https://
协议
file://协议
-
条件:
allow_url_fopen
:off/onallow_url_include
:off/on
- 作用:
用于访问本地文件系统,通常用来读取本地文件的且不受allow_url_fopen和allow_url_include的影响。
include()/require()/include_once()/require_once()参数可控的情况下,如导入为非.php文件,则仍按照php语法进行解析,这是include()函数所决定的。
php://协议
-
条件:
allow_url_fopen
:off/onallow_url_include
:仅php://input php://stdin php://memory php://temp
需要on
zip://, bzip2://, zlib://协议
-
条件:
allow_url_fopen
:off/onallow_url_include
:off/on
- 作用:
zip:// & bzip2:// & zlib://
均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名,可修改为任意后缀:jpg png gif xxx
等等。
data://协议
-
条件:
allow_url_fopen
:onallow_url_include
:on
- 作用:自
PHP>=5.2.0
起,可以使用data://
数据流封装器,以传递相应格式的数据。通常可以用来执行PHP代码。
http:// & https://
协议
-
条件:
allow_url_fopen
:onallow_url_include
:on
- 作用:常规 URL 形式,允许通过
HTTP 1.0
的 GET方法,以只读访问文件或资源。通常用于远程包含。
防护措施
1、包含目标的参数过滤
1) 文件名后缀固定:在包含的文件名前后加固定后缀;
2) 文件名过滤:白名单或者黑名单过滤;
2、路径限制
1) 目录限制,在用户提交的变量前增加固定的路径,限制用户可调用的目录范围;
2) 目录回退符过滤,避免回退符生效导致路径变化;
3、中间件的安全配置
1) Magic_quotes_gpc(5.4 以后被放弃用)
2) 限制访问区域:php.ini 中设置 open_basedir 来限制用户访问文件的活动范围
等;apache 也有相关配置
3) 设置访问权限:限制当前中间件所在用户的访问权限,例如;web 服务器独立
用户,并且只拥有访问目录和使用中间件的权限,从而有效避免越权访问其他文件;
常见系统默认路径
Windows 系统
C:\boot.ini //查看系统版本
C:\windows\system32\inetsrv\MetaBase.xml //IIS 配置文件
C:\windows\repair\sam //存储 windows 系统初次安装的密码
C:\Program Files\mysql\my.ini //mysql 配置
C:\Program Files\mysql\data\mysql\user.MYD //Mysql root
C:\windows\php.ini //php 配置信息
Linux 系统
/etc/passwd
/usr/local/app/apache2/conf/httpd.conf //apache2 默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置
/usr/local/app/php5/lib/php.ini //PHP 相关配置
/etc/httpd/conf/httpd.conf //apache
/etc/php5/apache2/php.ini //ubuntu 系统的默认路径
日志默认路径
标签:文件,include,包含,url,简介,漏洞,php From: https://blog.csdn.net/qq_74342020/article/details/139359384/etc/httpd/logs/access_log 或者 /var/log/httpd/access_log //apache+Linux 日志默认路径
D:\xampp\apache\logs\access.log
D:\xampp\apache\logs\error.log //apache+win2003 日志默认路径
C:\WINDOWS\system32\Logfiles //IIS6.0+win2003 默认日志文件
%SystemDrive%\inetpub\logs\LogFiles //IIS7.0+win2003 默认日志文件