从Ping到Shell:手把手复现ACTF2020新生赛Exec 1靶场命令注入漏洞
在网络安全领域,命令注入漏洞一直是Web应用安全中最基础也最危险的漏洞类型之一。今天,我们将通过复现ACTF2020新生赛中的Exec 1靶场,来深入理解这种漏洞的成因、利用方式以及防御思路。这个靶场非常适合刚接触CTF比赛或Web安全的新手,因为它展示了一个非常典型的命令注入场景——通过Ping功能实现系统命令执行。
我们将使用Docker在本地搭建这个靶场环境,从最基本的Ping测试开始,逐步探索如何利用命令分隔符突破限制,最终获取系统flag。整个过程会详细记录每个步骤的输入输出,并解释背后的原理,确保即使是完全没有经验的新手也能跟上节奏。
1. 环境准备与初步探测
首先,我们需要一个干净的测试环境。推荐使用Docker快速部署靶场:
docker pull vulhub/actf2020-exec1 docker run -d -p 8080:80 vulhub/actf2020-exec1访问http://localhost:8080,你会看到一个简单的Ping测试页面。这个页面设计得非常简洁,只有一个输入框和一个提交按钮,看起来就像普通的网络工具。
初始测试步骤:
- 输入
127.0.0.1并提交 - 观察返回结果是否包含Ping的响应
- 查看网页源代码寻找隐藏线索
注意:在实际CTF比赛中,查看网页源代码往往是第一步,开发者有时会在注释中留下提示。
通过初步测试,我们发现这个页面确实执行了Ping命令,并将结果返回给了用户。这看起来很正常,但问题在于——它是如何执行Ping命令的?
2. 理解命令注入漏洞原理
命令注入漏洞的核心在于用户输入被直接拼接到了系统命令中。在这个例子中,后端代码可能是这样的:
<?php $ip = $_GET['ip']; system("ping -c 3 " . $ip); ?>这种直接将用户输入拼接到系统命令中的做法极其危险。攻击者可以通过精心构造输入,在原始命令后追加额外的系统命令。
常见的命令分隔符及其作用:
| 分隔符 | 作用描述 |
|---|---|
; | 顺序执行多条命令 |
&& | 前命令成功则执行后命令 |
| ` | |
| ` | ` |
& | 后台执行命令 |
$() | 命令替换(现代shell) |
` | 命令替换(传统方式) |
3. 基础注入尝试
让我们从最简单的注入开始测试:
- 输入
127.0.0.1; whoami - 观察返回结果是否包含当前用户信息
如果注入成功,你会在Ping结果后面看到类似这样的输出:
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data. 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.034 ms www-data这个www-data就是当前Web服务运行的用户身份,说明我们的命令注入成功了!
新手常见问题排查:
- 如果没有任何额外输出,检查分隔符是否正确(尝试
&&或|) - 确保没有输入多余的空格或特殊字符
- 尝试不同的命令(如
id或uname -a)
4. 进阶利用:获取系统信息
确认注入点有效后,我们可以进一步收集系统信息:
127.0.0.1; ls -la /这个命令会列出根目录下的所有文件和目录。在CTF比赛中,flag文件通常位于根目录或特定目录下,名称可能包含"flag"字样。
关键信息收集命令:
uname -a- 查看系统内核信息ls /- 列出根目录find / -name "*flag*"- 搜索包含"flag"的文件cat /etc/passwd- 查看系统用户列表
提示:在真实环境中,这些信息收集步骤对于后续渗透至关重要,但在CTF中通常是为了快速定位flag文件。
5. 读取flag文件
通过前面的信息收集,我们通常会发现flag文件位于/flag或/var/www/html/flag.txt等位置。尝试读取:
127.0.0.1; cat /flag但有时候,出题者会设置一些简单的过滤机制。如果cat被过滤了,可以尝试以下替代方法:
绕过简单过滤的技巧:
- 使用
tac代替cat(反向输出文件内容) - 使用
more、less或head、tail等命令 - 使用通配符:
cat /fl* - 使用变量拼接:
a=c;b=at;$a$b /flag - 使用Base64编码输出:
cat /flag | base64
在本次靶场中,最简单的cat /flag就能获取到flag内容。恭喜你,已经成功复现了这个命令注入漏洞!
6. 深入理解防御措施
作为负责任的网络安全学习者,我们不仅要会攻击,更要理解如何防御。针对命令注入漏洞,以下是一些有效的防护措施:
输入验证:
- 白名单验证:只允许数字和点号(对于IP地址)
- 正则表达式过滤:
/^[0-9.]+$/
安全的API使用:
- 使用
escapeshellarg()或escapeshellcmd()函数处理参数 - 避免直接拼接命令,改用参数化调用
系统加固:
- 限制Web服务器的执行权限
- 使用chroot等隔离技术
- 定期更新系统和应用补丁
7. 扩展练习与思考
为了加深理解,建议尝试以下扩展练习:
- 尝试使用不同的命令分隔符实现相同效果
- 编写一个简单的PHP脚本模拟这个漏洞,然后尝试修复它
- 研究其他类型的命令注入场景,如SQL注入、LDAP注入等
- 在Docker环境中搭建其他类似的漏洞靶场进行练习
命令注入漏洞虽然原理简单,但在实际应用中变化多端。通过这个靶场的练习,你应该已经掌握了最基本的识别和利用方法。记住,这些技术只能用于合法授权的测试,真正的黑客精神是建设而非破坏。