目录
基础概念
文件包含的介绍
程序开发人员通常会把可重复利用的函数写到单个文件中,在使用某些函数时直接调用此文件,无需再次编写,这种调用文件的过程一般称为文件包含。
为什么要包含文件?
1、一种是包含内容
2、一种是包含函数
文件包含漏洞介绍
什么是文件包含漏洞?
随着网站业务的需求,程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,但是正是这种灵活性通过动态变量的方式引入需要包含的文件时,用户对这个变量可控而且服务端又没有做合理的校验或者校验被绕过就造成了文件包含漏洞。
文件包含漏洞分类&包含文件的函数
本地文件包含漏洞(LIF):
当被包含的文件在服务器本地时,就形成的本地文件包含漏洞。
远程文件包含漏洞(RLF):
本地文件包含和远程文件包含造成漏洞的原因是一样的,当php.ini 中的配置选项allow_url_fopen和allow_url_include(默认是关闭的)为ON的话,则包含的文件可以是第三方服务器中的文件,这样就形成了远程文件包含漏洞。
PHP中常见的包含文件的函数
include:
当使用该函数包含文件时,只有代码执行到include()函数时才将文件包含进来发生错误时之给出一个警告,继续向下执行。
include_once:
功能与Include()相同,区别在于当重复调用同一文件时,程序只调用一次
require:
require()与include()的区别在于require( )执行如果发生错误,函数会输出错误信息
require_once:
功能与require()相同,区别在于当重复调用同一文件时,程序只 调用一次
文件包含漏洞挖掘及危害
文件包含漏洞挖掘
其实在文件包含在URL中能够明显的看出来,但是不代表含有这些特征就一 定有文件包含漏洞。只不过有这些特征可以进行判断是存在文件包含的,但 是能不能利用是另一方面。 http://www.xxx.com/index.php/?name=x.php http://www.xxx.com/index.php/?file=index2
文件包含漏洞的危害
- PHP包含漏洞结合上传漏洞
- 读文件
- 写文件
包含漏洞读取敏感文件
Unix/Linux系统
/etc/passwd /usr/local/app/apache2/conf/httpd.conf //apache2默认配置文件
/usr/local/app/php5/lib/php.ini /etc/my.cnf //PHP相关设置 //MySQL配置文件
Windows系统
C:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件
C:\windows\repair\sam
C:\boot.ini //存储Windows系统初始安装密码 //查看系统版本
CVE典型案例 CVE-2018-12613 PHPMyAdmin后台 任意文件包含漏洞 源码下载地址:https://www.phpmyadmin.net/files/4.8.1/
本地文件包含漏洞利用技巧
1.配合文件上传使用:有时候我们找不到文件上传漏洞,无法上传webshell, 可以先上传一个图片格式的webshell到服务器,再利用本地文件包含漏洞进行解析。
2.包含Apache日志文件:有时候网站存在文件包含漏洞,但是却没有文件上传点。这个时候我们还可以通过利用Apache的日志文件来生成一句话木马
什么是日志文件
当我们安装Apache后,Apache会自动给生成两个日志文件,这两个日志文件分别是访问日志access_log和错误日志error_log(在windows上是access.log和error.log)Access.log为访问日志,记录所有对apache服务器进行请求的访问。
利用条件
对日志文件可读
知道日志文件存储目录
实践步骤
一、我们随便访问一个文件
二、查看日志,发现了访问记录,那么我就可以利用这个日志文件,来写一个一句话木马,
三、打开浏览器,写入对应payload
四、查看日志文件,发现上传的php代码经过了url编码,所以我们必须把url编码干掉
文件目录:D:phpstudy pro\Extensions\Apache2.4.39Vogs\access.log.1721952000
五、bp抓包修改,把url编码部分更改成php源码
六、找到对应文件位置,查看解析执行结果 (127.0.0.1 /file include/file.php?file=D:phpstudy pro\Extensions\Apache2.4.39Vogs\access.log.1721952000)
PHP伪协议
PHP伪协议(PHP Protocol Override)是一种在PHP处理数据时,通过替换数据包的头部信息来欺骗网络协议的方式来提高性能的技术
PHP 支持的伪协议
file:// — 访问本地文件系统 (常用)
http:// — 访问 HTTP(s) 网址
ftp:// — 访问 FTP(s) URLs
php:// — 访问各个输入/输出流(I/O streams) (常用)
zlib:// — 压缩流 data:// — 数据(RFC 2397)
phar:// — PHP 归档
rar:// — RAR
ogg:// — 音频流
ssh2:// — Secure Shell 2
php://filter介绍
php://filter是一种元封装器,这个伪协议提供了对数据流进行过滤的能力, 可以对输入数据进行编码、解码、加密、解密等各种操作
php://filter 和 php://input
php://filter 用于读取源码
php://input 用于执行php代码
php://filter参数详解
示例:
# 编码读取 index.php?file=php://filter/read=convert.base64-encode/resource=flag.php
php://filter伪协议包含文件漏洞复现
一、使用php://filter/read=convert.base64-encode/resource=file.php获取源码
二、使用在线解密站点解密Base64编码,获得源码
php:input
php://input 可以访问请求的原始数据的只读流,将 post 请求的数据当作 php代码执行http://127.0.0.1/include.php?file=php://input [POST DATA部分] <?phpfputs(fopen('yinan.php','w'),'<?php @eval($ GET[cmd]); ?>');?>
php://input伪协议文件包含漏洞复现
第一步:使用burp suite软件抓包使用php://input伪协议将一句话木马写入
第二步:将数据包发送后,观察到一句话木马被包含
修复防范
1、数据输入验证
对用户提交的文件路径参数进行严格的格式检查和白名单策略,只允许包含 预定义的、安全的文件路径 禁止包含绝对路径,转而使用相对路径,并且确保相对路径不会超出预期的 目录范围
2、禁用危险函数或配置
如果不是必须,尽量避免使用容易导致文件包含漏洞的函数,如PHP中的 allow_url_include配置项应设为Off以禁用远程文件包含 在php.ini配置文件中,可以设置open_basedir限制PHP脚本只能访问指定目 录及其子目录下的文件
3、使用安全函数
使用更安全的函数替代易出问题的文件包含函数,例如在PHP中,可以使用 readfile()配合自定义的文件路径处理逻辑来代替include()
4、错误处理与日志记录
正确处理文件包含失败的情况,不要暴露过多的错误信息,以免给攻击者提供有用的信息记录详细的日志,以便在发生异常时追溯分析问题