面试题答案
一键面试可能存在的安全漏洞及修复方案
- 命令注入漏洞
- 漏洞表现:如果脚本中使用了用户输入来构造命令,如
eval
等函数,可能会导致命令注入。例如:
- 漏洞表现:如果脚本中使用了用户输入来构造命令,如
input=$1
eval "echo $input"
若用户输入 ; rm -rf /
,则会执行删除根目录下所有文件的危险操作。
- 修复方案:避免使用
eval
,对用户输入进行严格校验和过滤。例如,使用case
语句对合法输入进行匹配:
input=$1
case $input in
[a-zA-Z0-9])
echo $input
;;
*)
echo "Invalid input"
;;
esac
- 文件权限不当
- 漏洞表现:在进行文件传输或修改系统配置文件时,如果设置的文件权限过于宽松,可能导致其他用户可以随意修改这些文件。比如使用
chmod 777
对重要配置文件进行权限设置。
- 漏洞表现:在进行文件传输或修改系统配置文件时,如果设置的文件权限过于宽松,可能导致其他用户可以随意修改这些文件。比如使用
chmod 777 /etc/someconfig.conf
- 修复方案:根据实际需求设置合适的文件权限。对于系统配置文件,通常应该是只有管理员(root)可写,其他用户可读,如
chmod 644 /etc/someconfig.conf
。
- 未验证的网络连接
- 漏洞表现:在建立网络连接时,如果没有对目标主机进行身份验证,可能会连接到恶意主机,导致数据泄露。例如使用
ftp
连接时没有验证主机密钥。
- 漏洞表现:在建立网络连接时,如果没有对目标主机进行身份验证,可能会连接到恶意主机,导致数据泄露。例如使用
ftp -n somehost <<END_SCRIPT
user username password
get somefile
END_SCRIPT
- 修复方案:使用更安全的协议如
sftp
,并验证主机密钥。例如:
sftp -o StrictHostKeyChecking=yes username@somehost <<END_SCRIPT
get somefile
END_SCRIPT
- 密码硬编码
- 漏洞表现:如果在脚本中直接硬编码了系统登录密码或其他敏感信息,一旦脚本泄露,密码就会暴露。例如:
sshpass -p "mypassword" ssh user@host
- 修复方案:使用环境变量来存储敏感信息,并且确保环境变量的安全性。例如:
export SSH_PASSWORD="mypassword"
sshpass -p "$SSH_PASSWORD" ssh user@host
- 缺乏错误处理
- 漏洞表现:如果脚本在执行系统配置修改、网络连接建立或文件传输等操作时没有适当的错误处理,可能会在出现错误时继续执行,导致系统处于不一致或不安全的状态。例如:
sed -i 's/oldvalue/newvalue/' /etc/someconfig.conf
scp somefile user@host:/destination
如果 sed
命令失败,scp
命令仍会执行,可能传输错误的文件。
- 修复方案:在每个关键操作后检查返回状态码。例如:
sed -i 's/oldvalue/newvalue/' /etc/someconfig.conf
if [ $? -ne 0 ]; then
echo "Sed command failed. Aborting further operations."
exit 1
fi
scp somefile user@host:/destination
if [ $? -ne 0 ]; then
echo "SCP command failed."
exit 1
fi
-
未加密传输敏感数据
- 漏洞表现:在文件传输功能中,如果使用如
ftp
等未加密协议传输敏感数据文件,数据可能被中间人截取。 - 修复方案:使用加密协议如
scp
或sftp
进行文件传输。
- 漏洞表现:在文件传输功能中,如果使用如
-
SUID/SGID 位不当设置
- 漏洞表现:如果脚本创建的可执行文件或修改现有文件设置了不当的 SUID/SGID 位,可能会导致权限提升漏洞。例如,将一个普通用户可执行文件设置为 SUID 位且所有者为 root。
chmod u+s /path/to/executable
- 修复方案:仔细评估是否真的需要设置 SUID/SGID 位。如果确实需要,确保程序逻辑安全,不会被恶意利用。如果不需要,去除 SUID/SGID 位,如
chmod u-s /path/to/executable
。