1. 从一次“意外”的服务器宕机说起:命令注入到底是什么?
几年前,我还在负责一个内部运维系统,当时有个功能是让管理员可以快速检查服务器网络状态,输入IP就能ping一下。听起来很普通对吧?结果有天下午,整个测试环境突然卡死,一查日志,好家伙,有人在这个输入框里敲了点“别的东西”。不是恶意攻击,就是某个新来的哥们想秀一下操作,输入了个 8.8.8.8; cat /etc/passwd。就因为这个分号,后面查看系统用户的命令也被服务器老老实实地执行了。虽然没造成实际损失,但那次经历让我对“命令注入”(Command Injection)这个听起来有点技术范儿的漏洞,有了切肤之痛的理解。
简单来说,命令注入就像是你让助手(Web应用程序)去传个话(执行系统命令),但你没想到这个助手特别“实诚”,它会把你说的每一个字,包括那些恶意的指令,原封不动地转达给执行者(服务器操作系统)。关键在于,应用程序把不可信的用户输入,未经任何检查或清洗,就直接拼接到了要执行的系统命令字符串里。比如,原本应该执行 ping 用户输入的IP,但如果用户输入的是 127.0.0.1; ls -la,最终执行的命令就变成了 ping 127.0.0.1; ls -la。分号在Linux/Unix系统里是命令分隔符,于是服务器在ping完之后,顺手就把当前目录的文件列表给列出来了。
这漏洞的危害有多大呢?这么说吧,一旦成功利用了命令注入,攻击者就相当于在Web服务器上拿到了一个“命令行终端”。他能做的事情,取决于运行Web服务的那个系统账户(比如 www-data, apache, nobody)拥有什么权限。从查看敏感文件(/etc/passwd, 配置文件)、探测内网、到上传木马、甚至直接反弹一个Shell回来获得完全控制权,都是可能的。它不像SQL注入那样“只”影响数据库,命令注入的战场是整个服务器系统,危害等级通常非常高。
而今天我们要用的“训练场”,就是DVWA(Damn Vulnerable Web Application)。它是一个故意设计得漏洞百出的PHP/MySQL应用,专门用来学习网络安全攻防技术。里面的Command Injection模块,完美复现了从毫无防护到层层设防的几种常见场景,是我们理解这个漏洞原理和防御手法的最佳沙盒。无论你是刚开始接触Web安全的新手,还是想巩固基础的开发者,跟着我一步步拆解DVWA的这三个难度等级,你不仅能学会“攻击”,更能深刻理解如何从代码层面“筑墙”。
2. Low级别:毫无防备的“裸奔”现场与基础攻击手法
DVWA的Low级别,模拟的就是我开头提到的那个“实诚”助手的状态——对用户输入零过滤、零验证。我们直接来看它的后台代码(为了清晰,我稍作整理和注释):
if( isset( $_POST[ 'Submit' ] ) ) {
// 1. 直接获取用户输入,没有任何处理
$target = $_REQUEST[ 'ip' ];
// 2. 判断操作系统类型,拼接不同的ping命令
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows系统
$cmd = shell_exec( 'ping ' . $target );
} else {
// Linux/Unix系统
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
// 3. 把命令执行的结果直接输出给用户
echo "<pre>{$cmd}</pre>";
}
这段代码的漏洞点清晰得刺眼:第2步中,$target 被直接拼接到 shell_exec() 函数的参数字符串里。shell_exec() 这个函数在PHP里就是用来执行系统命令的。攻击者可以完全控制 $target 的内容,这意味着他能控制 shell_exec() 里面要执行的那一整段命令。
实战操作: 在DVWA的Command Injection页面,将安全级别调到Low。你会看到一个简单的输入框,提示你输入一个IP地址。正常的用法是输入 127.0.0.1 或 8.8.8.8,然后点击“Submit”,页面会返回ping的结果。
现在,我们来点“不正常”的。在输入框里尝试以下内容,并观察结果:
-
基本注入:
127.0.0.1; whoami- 原理: 分号
;
- 原理: 分号

35

被折叠的 条评论
为什么被折叠?



