文件包含漏洞介绍当开发者对可以包含可控的文件来源没有做好检测和过滤时,会导致文件包含漏洞
危害导致攻击者可以通过文件包含漏洞包含敏感信息,利用php伪协议和或者配合文件上传漏洞执行木马
常出现文件包含漏洞的危险函数1. include(): 执行到include时才包含文件,找不到被包含文件时只会产生警告,脚本将继续执行
2. require(): 只要程序一运行就包含文件,找不到被包含的文件时会产生致命错误,并停止脚本
3. include_once(): 脚本执行期间包含并运行指定文件。此行为和 include 语句类似,唯一区别是如果该文件中已经被包含过,则不会再次包含。如同此语句名字暗示的那样,只会包含一次;
4. require_once(): 和 require 语句完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含。
漏洞分类本地文件包含
远程文件包含
本地文件包含只能包含本地服务器的文件,攻击者常用该类型的漏洞进行文件信息读取
远程文件包含能够包含本地服务器外的文件,攻击者常利用该漏洞来包含带有木马文件的服务器的木马文件,达到远程执行木马的目的
日志注入攻击者利用伪协议将一句话木马注入到日志中,然后在利用文件包含漏洞触发带有木马的日志,即可执行木马。
条件:服务器开启日志记录功能
常见中间件日志的位置
apache
Apache\logs\access.log #windows
/var/log/apache2/access.log.1 #linux
ngnix
/var/log/nginx/access.log #linux
触发远程文件包含漏洞的php配置条件:
//php.ini
allow_url_include=on
magic_quotes_gpc=off
文件包含常见绕过替换 ./可以通过双写绕过 ./-> .././
绝对路径绕过相对路径:../../../access.php-> 绝对路径:/var/html/www/access.php
垃圾字符绕过有些waf只过滤限定长度的字符,可以通过添加垃圾字符绕过
比如:一个waf只会过滤前20的敏感字符 ../
../../../etc/passwd-> aaaaaaaaaaaaaaaaaaaa../../../../etc/passwd
文件包含伪协议利用在文件包含漏洞中,伪协议的利用是很重要的
常见的伪协议有:
php://filter
data://text/plain
php://input
file://
phar://
zlib://
zip://
利用伪协议读取文件php://filter常被利用用于读取文件
zip://协议用来读取压缩包中的文件,可以配合文件上传开启后门,获取webshell
phar://协议和zip协议利用方式相同
php://filter常见利用方式:
php://filter/read/convert.base64-encode/resource=file 读取file文件,结果通过base64展示
php://filter/resource=file 读取file文件
php://filter/string.rot13/resource=file 读取file文件,结果通过rot13编码展示
zip://shell.php 先将shell.php压缩为zip文件,然后上传,利用zip://文件名读取
phar://shell.php 同zip伪协议
利用伪协议写入文件data://协议通过执行资源类型,使后面的内容当做文件内容来执行,从而造成任意代码执行
php://input协议可以访问请求的原始数据,配合文件包含漏洞可以将post请求体中的内容当做文件内容执行,从而实现任意代码执行,需要注意的是,当表单 enctype=multipart/form-data时,php://input将会无效
data://text/plain,
php://input post请求体:
资料:php://filter过滤器使用
php伪协议和死亡绕过
filter协议利用