直接回答:命令注入指应用把用户输入拼接进操作系统命令执行,攻击者通过 ;、&&、|、$() 等元字符注入额外命令,往往直接拿到服务器 shell。防御的正确姿势是避免经过 shell:使用"程序名 + 参数数组"形式的 API(如 Python 的 subprocess.run([...], shell=False)),让参数永远只是参数,不进入 shell 解析流程。
展开解析:黑名单过滤不可靠的根本原因,是无法穷尽 shell 的解析规则:$()、反引号、换行、通配符、环境变量替换,任何遗漏都是突破口。白名单校验只能作深度防御的补充。确实要执行外部命令时:命令写死,用户输入只作受校验的参数;进程以低权限用户运行。审计时重点搜 exec、system、popen 等危险调用点。
# 危险:host 进入 shell 解析
os.system("ping -c 1 " + host)
# 安全:不经 shell,host 只是 ping 的参数
subprocess.run(["ping", "-c", "1", host], check=True)
追问方向:escapeshellarg 为什么历史上仍出过问题?命令注入如何盲注外带数据?
(约 400 字)