文件包含漏洞
作者: 分类: 网络安全 发布于: 2024-06-27 20:12:32 浏览:1,176 评论(0)
概述
程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这种文件调用的过程一般被称为文件包含。程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,但正是由于这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。 简单来说就是攻击者可以通过前端url链接包含任意他想要的文件并展示。
在通过PHP的函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,导致意外的文件泄露甚至恶意的代码注入。
分类
本地文件包含
只能包含本地服务器上存在的文件。
- 用户对输入可控且无过滤
- 可以利用相对路径或绝对路径读取系统敏感文件
远程文件包含
包含远程服务器上的文件。
需要php.ini开启了allow_url_fopen和allow_url_include的配置。包含的文件是第三方服务器(比如:攻击者搭建的一个Web服务器)的文件。
-
allow_url_fopen=On (默认为On) 规定是否允许从远程服务器或者网站检索数据
-
allow_url_include=On (php5.2之后默认为Off) 规定是否允许include/require远程文件
远程与本地包含的区别
本地文件包含就是通过浏览器包含web服务器上的文件,这种漏洞是因为浏览器包含文件时没有进行严格的过滤,允许遍历目录的字符注入浏览器并执行。
远程文件包含就是允许攻击者包含一个远程的文件,一般是在远程服务器上预先设置好的脚本并对外开放一个web服务,以确保该脚本能被访问到。此漏洞是因为浏览器对用户的输入没有进行检查,导致不同程度的信息泄露、拒绝服务攻击,甚至在目标服务器上执行代码。
本地文件包含与远程文件有着相同的原理,但前者只能包含本地服务器上存在的文件,而后者可以包含远程服务器上的文件。
PHP中文件包含函数有以下四种
require() //数出现错误的时候,会直接报错并退出程序的执行
include() //在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行
require_once() //与require一致,但是多次包含同一文件时会过滤
include_once() //与include一致,但是多次包含同一文件时会过滤
如何发现文件包含漏洞
- 观察URL链接是否包括以下类似的关键字:page/include/path/file/link/url等,如果有,则可能存在文件包含漏洞;
- 可以观察在URL中,出现的赋值参数等号后跟的信息,是否为一个文件,如果是,则可能存在文件包含漏洞;
- 在关键字处或明显被文件赋值的参数处,尝试进行赋值,如:https://www.baidu.com;或系统常见文件,如:/etc/passwd(Linux)
- 使用漏洞扫描工具如
xray
- 配合文件上传漏洞进行验证
常见检测绕过方式
- 双写绕过: 如后端通过str_replace函数验证时
- 通过
file:///etc/passwd
也可读取到文件, 部分情况下可用此绕过 - 中间件日志包含绕过: 如apache的日志文件在
/var/log/apache2/access.log
在链接上输入如http://www.example.com?page=<?php phpinfo();?>
会将日志写到日志文件中, 这样日志文件就包含一句话木马了。使用文件包含漏洞包含此文件时会自动执行 - 配合文件上传getshell
文件包含漏洞防御
- 设置白名单(文件名可以确定)
- 过滤危险字符(判断文件名称是否为合法的php文件)
- 设置文件目录权限(对可以包含的文件进行限制,可以使用白名单的方式,或者设置可以包含的目录)
- 关闭危险配置(无需情况下设置allow_url_include和allow_url_fopen为关闭)
转载时请注明出处及相应链接。
本文永久链接: https://blog.baigei.com/articles/file-include-bug