目录
文件包含
程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某些函数时直接调用此文件,无需再次编写,这种调用文件的过程一般被称为文件包含。
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
文件包含漏洞的危害
1.PHP包含漏洞结合上传漏洞
2.读文件
3.写文件
包含漏洞读取敏感文件
Unix/Linux系统
/etc/passwd
/usr/local/app/apache2/conf/httpd.conf //apache2默认配置文件
/usr/local/app/php5/lib/php.ini //PHP相关设置
/etc/my.cnf //MySQL配置文件
Windows系统
C:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件
C:\windows\repair\sam //存储Windows系统初始安装密码
C:\boot.ini //查看系统版本
CVE典型案例
CVE-2018-12613 PHPMyAdmin后台 任意文件包含漏洞
本地文件包含漏洞利用技巧
1.配合文件上传使用:有时候不到文件上传漏洞,无法上传webshell,可以先上传一个图片格式的webshell到服务器,再利用本地文件包含漏洞进行解析。
2.包含Apache日志文件:有时候网站存在文件包含漏洞,但是却没有文件上传点。这个时候还可以通过利用Apache的日志文件来生成一句话木马
利用条件:
对日志文件可读
知道日志文件存储目录、
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://input 用于执行php代码
PHP伪协议
# 编码读取
index.php?file1=php://filter/read=convert.base64- encode/resource=flag.php
php:input
php://input 可以访问请求的原始数据的只读流,将 post 请求的数据当作php代码执行
http://127.0.0.1/include.php?file=php://input[POST DATA部分]<?php fputs(fopen('juran.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?>
修复防范
1.数据输入验证
对用户提交的文件路径参数进行严格的格式检查和白名单策略,只允许包含预定义的、安全的文件路径禁止包含绝对路径,转而使用相对路径,并且确保相对路径不会超出预期的目录范围。
2.禁用危险函数或配置
如果不是必须,尽量避免使用容易导致文件包含漏洞的函数,如PHP中的allow_url_include配置项应设为Off以禁用远程文件包含在php.ini配置文件中,可以设置open_basedir限制PHP脚本只能访问指定目录及其子目录下的文件。
3.使用安全函数
使用更安全的函数替代易出问题的文件包含函数,例如在PHP中,可以使用readfile()配合自定义的文件路径处理逻辑来代替include()。
4.错误处理与日志记录
正确处理文件包含失败的情况,不要暴露过多的错误信息,以免给攻击者提供有用的信息记录详细的日志,以便在发生异常时追溯分析问题。