51mee - AI智能招聘平台Logo
模拟面试题目大全招聘中心会员专区

除了SQL注入,还有哪些常见的数据库相关攻击?请举例说明命令注入的原理,并说明如何通过参数化查询或白名单过滤来防御。

360安全开发初级工程师难度:中等

答案

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) 【追问清单】:

  • 问:命令注入的防御中,参数化查询和命令参数化有什么区别?答:参数化查询是针对数据库查询,将输入作为参数传递,防止SQL注入;命令参数化是将用户输入作为命令的参数,而非拼接进命令字符串,比如system("rm -rf " + os.path.join("/tmp", userInput)),这样即使输入包含恶意字符,也不会执行非法命令。
  • 问:白名单过滤的优缺点?答:优点是能精确控制允许的输入,缺点是维护成本高,容易遗漏或误判,且可能无法覆盖所有合法输入。
  • 问:跨数据库的命令注入如何防御?答:需要针对不同数据库的命令语法,分别进行参数化或白名单过滤,比如MySQL、PostgreSQL的命令语法不同,防御时需考虑具体数据库的命令结构。
  • 问:如果用户输入包含转义字符,参数化查询是否有效?答:参数化查询会将输入作为参数传递,数据库驱动会自动处理转义,避免转义字符被解释为命令的一部分,所以有效。
  • 问:命令注入是否只针对Web应用?答:不仅针对Web,也适用于任何将用户输入直接拼接进系统命令的程序,比如脚本、批处理文件等。

7) 【常见坑/雷区】:

  • 坑1:混淆SQL注入和命令注入,认为防御SQL注入的方法(如白名单过滤SQL关键字)也能防御命令注入。比如,只过滤SQL关键字(如select、union),但没考虑命令注入的拼接方式。
  • 坑2:参数化查询只针对SQL,没考虑命令的参数化,导致命令注入仍可发生。比如,用system()拼接用户输入,即使SQL注入防御了,命令注入仍可能存在。
  • 坑3:白名单过滤只允许特定命令,但没考虑命令的参数,比如允许rm命令,但输入的路径可能包含恶意路径,导致删除其他目录。
  • 坑4:忽略输入的上下文,比如用户输入可能包含空格或特殊字符,导致白名单过滤失效。
  • 坑5:认为命令注入只针对Linux系统,没考虑Windows系统,比如Windows的cmd.exe命令,输入拼接后可能执行恶意命令(如cmd.exe /c "rm -rf C:\")。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1