在PHP文件包含漏洞利用中,常通过伪协议绕过过滤机制。常见的技术问题是:如何利用`php://filter`伪协议读取敏感文件,如`/etc/passwd`,在存在白名单或路径限制的情况下实现本地文件包含(LFI)到远程代码执行(RCE)的跨越?
1条回答 默认 最新
舜祎魂 2025-10-22 03:30关注PHP文件包含漏洞中伪协议利用技术详解
1. PHP文件包含漏洞基础
PHP中的文件包含函数(如
include()、require())在处理用户输入时若未正确过滤,可能导致本地文件包含(LFI)或远程文件包含(RFI)漏洞。攻击者可借此读取敏感文件、执行任意代码。2. 伪协议在PHP中的作用
PHP支持多种伪协议,如
php://filter、php://input、data://等,用于数据流处理。其中,php://filter常用于在读取或写入流时进行编码转换,攻击者可利用其绕过路径限制。php://filter/read=convert.base64-encode/resource=:读取文件并进行Base64编码。- 配合LFI漏洞可读取系统敏感文件如
/etc/passwd。
3. 利用
php://filter读取敏感文件假设存在LFI漏洞的代码如下:
include($_GET['page'] . ".php");若过滤机制限制了路径(如不允许包含
/etc/passwd),攻击者可尝试:?page=php://filter/read=convert.base64-encode/resource=/etc/passwd服务器响应将返回Base64编码的文件内容,解码后即可获取明文。
4. 从LFI到RCE的跨越
若仅能读取文件而不能执行代码,则攻击者需寻找其他方式实现RCE。常见方法包括:
- 利用日志文件写入PHP代码(如访问日志
/var/log/apache/access.log)。 - 通过
php://input伪协议直接执行代码(需允许远程文件包含)。 - 结合会话文件(
/var/lib/php/session/sess_*)注入恶意代码。
5. 绕过白名单限制的技巧
部分系统使用白名单机制限制包含路径,例如:
if (in_array($_GET['page'], ['home', 'about', 'contact'])) { include($_GET['page'] . ".php"); }攻击者可通过以下方式绕过:
- 使用路径穿越技巧:
?page=../../etc/passwd(需未过滤../)。 - 利用PHP封装器:
?page=php://filter/...。
6. 防御与加固建议
为防止文件包含漏洞被利用,应采取以下措施:
防御措施 说明 避免动态包含用户输入 尽量使用静态文件或白名单机制控制包含内容。 过滤特殊字符 对 ../、://等字符进行严格过滤。关闭远程文件包含 设置 allow_url_include=Off。7. 攻击流程示意图
graph TD A[用户输入可控参数] --> B{存在文件包含漏洞?} B -->|是| C[尝试读取敏感文件] C --> D[使用php://filter伪协议] D --> E[获取Base64编码内容] E --> F[解码获取明文文件] F --> G{是否可写入PHP代码?} G -->|是| H[注入恶意代码] H --> I[实现远程代码执行]本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报