面试题答案
一键面试命令注入漏洞原理
命令注入漏洞指攻击者通过在输入字段中插入恶意命令,利用程序对用户输入的不恰当处理,使这些恶意命令在服务器端执行。在Bash脚本中,若脚本直接使用未经过滤或验证的用户输入作为系统命令的一部分去执行,攻击者就可通过构造恶意输入,让脚本执行非预期的命令。例如,脚本中有如下代码:
#!/bin/bash
command="ls -l " + $user_input
$command
若$user_input
可控,攻击者输入; rm -rf /
,脚本实际执行的命令就变成了ls -l ; rm -rf /
,从而可能导致整个根目录被删除,造成严重后果。
防止命令注入漏洞的措施
- 使用参数化执行:尽量使用命令的参数形式,而不是将用户输入直接嵌入命令字符串。例如,使用
find
命令查找文件时:
#!/bin/bash
file_name=$1
find . -name "$file_name"
这里将文件名作为参数传递给find
命令,而不是拼接命令字符串。
2. 输入验证:对用户输入进行严格验证,确保输入符合预期格式。比如只允许字母、数字等特定字符。可以使用正则表达式来验证,示例如下:
#!/bin/bash
input=$1
if [[ $input =~ ^[a-zA-Z0-9]+$ ]]; then
command="echo $input"
$command
else
echo "Invalid input"
fi
- 转义特殊字符:对用户输入中的特殊字符进行转义,使其失去执行命令的能力。在Bash中,可以使用
printf %q
来转义字符串。例如:
#!/bin/bash
user_input=$1
escaped_input=$(printf %q "$user_input")
command="echo $escaped_input"
$command
- 使用安全的函数库:如果可能,使用一些已经过安全处理的函数库来代替直接执行系统命令。例如,在处理文件操作时,一些脚本语言有内置的文件操作函数,比直接调用系统的文件操作命令更安全。