
1) 【一句话结论】:除了SQL注入,常见的数据库相关攻击还包括命令注入(操作系统命令注入)、数据库权限提升、数据泄露等,核心是用户输入未经验证直接拼接进系统命令或数据库查询,导致执行非法操作或泄露敏感数据。
2) 【原理/概念讲解】:当应用程序将用户输入直接拼接进系统命令(如system()、exec()等函数)时,若输入未过滤,恶意输入会被当作命令执行。类比:就像你把用户输入的“rm -rf /”直接交给系统执行,因为程序没检查输入是否合法。原理是输入被当作命令的一部分,绕过程序对命令的验证,导致执行恶意命令(如删除文件、获取系统信息等)。
3) 【对比与适用场景】:
| 攻击类型 | 定义 | 攻击目标 | 常见场景 | 防御方法 |
|---|---|---|---|---|
| SQL注入 | 用户输入被拼接进SQL查询语句,绕过验证执行恶意SQL操作 | 数据库(如MySQL、PostgreSQL等) | Web表单提交、API参数、URL参数(如用户名、密码、参数等) | 参数化查询(预编译SQL,如PreparedStatement)、白名单过滤(限制SQL关键字或语句结构) |
| 命令注入 | 用户输入被拼接进系统命令(如操作系统命令),绕过验证执行恶意命令 | 操作系统(如Linux的shell、Windows的cmd.exe) | 执行用户输入的命令(如system()、exec()函数调用)、文件操作(如删除文件、读取文件内容) | 参数化命令(将用户输入作为参数传递,而非拼接进命令字符串)、白名单过滤(限制允许的命令或参数)、沙箱环境(限制命令的执行权限) |
4) 【示例】:伪代码示例(以文件删除功能为例):
# 恶意输入拼接进系统命令
user_input = "admin'; rm -rf /tmp; #"
command = f"rm -rf {user_input}" # 程序将用户输入直接拼接进命令
os.system(command) # 执行命令,实际执行的是 "rm -rf admin'; rm -rf /tmp; #",若用户意图是删除/tmp目录,但恶意输入可能更复杂(如删除根目录)
当用户输入为; rm -rf /时,实际执行的命令是rm -rf /,导致删除整个根目录(假设用户权限足够)。
5) 【面试口播版答案】:除了SQL注入,常见的数据库相关攻击还包括命令注入(操作系统命令注入)、数据库权限提升、数据泄露等。以命令注入为例,原理是用户输入被直接拼接进系统命令(如system()函数),若输入未过滤,恶意输入会被当作命令执行。比如,程序代码中用system("ls -l " + userInput),当用户输入; rm -rf /时,就会执行删除根目录的命令。防御方法包括:1. 参数化查询(针对数据库查询,将用户输入作为参数传递,而非拼接进SQL语句,如Java的PreparedStatement或Python的sqlite3库,通过预编译避免输入被解释为SQL代码);2. 白名单过滤(针对系统命令,只允许输入包含特定命令或参数,拒绝其他输入,如只允许输入“rm”命令,且路径在白名单内)。参数化查询通过将输入与SQL语句分离,确保输入不会被数据库解析为SQL代码;白名单过滤则是通过限制输入的字符或命令,防止恶意输入被执行。
6) 【追问清单】:
system("rm -rf " + os.path.join("/tmp", userInput)),这样即使输入包含恶意字符,也不会执行非法命令。7) 【常见坑/雷区】:
select、union),但没考虑命令注入的拼接方式。system()拼接用户输入,即使SQL注入防御了,命令注入仍可能存在。rm命令,但输入的路径可能包含恶意路径,导致删除其他目录。cmd.exe命令,输入拼接后可能执行恶意命令(如cmd.exe /c "rm -rf C:\")。