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

请描述SQL注入漏洞的原理,并举例说明如何利用该漏洞获取数据库内容,同时分析360安全卫士在防止SQL注入方面的防护措施(如输入验证、参数化查询等)。

360助理安全研究实习生(漏洞挖掘与利用)——北京难度:中等

答案

1) 【一句话结论】
SQL注入是攻击者通过用户输入注入恶意SQL语句,绕过应用层验证,直接操作数据库,从而获取敏感数据或执行非法操作(如删除数据、提升管理员权限)。

2) 【原理/概念讲解】
SQL注入的核心是应用将用户输入直接拼接进SQL语句,导致SQL解析器执行恶意代码。例如,当用户在登录表单输入用户名为“' or 1=1 --”时,原本用于验证用户名的SQL查询“SELECT * FROM users WHERE username='admin'”会被解析为“SELECT * FROM users WHERE username='admin' or 1=1 --”,绕过用户名验证逻辑,返回所有用户数据。类比:就像数据库管理员按正常流程处理一封“正常”的邮件,但邮件内容中隐藏了“执行任意数据库命令”的指令,管理员按流程处理后,执行了隐藏的恶意命令。关键在于“拼接”导致SQL逻辑被篡改,解析器按篡改后的逻辑执行。

3) 【对比与适用场景】

维度内容
定义通过用户输入注入恶意SQL语句,绕过应用层验证,直接操作数据库。
原理应用未对用户输入进行过滤或转义,将输入直接拼接进SQL语句。
常见位置用户登录、搜索框、表单提交(如注册、修改信息、订单查询等)。
防护措施- 输入验证:检查输入是否含SQL关键字(如'、or、union等),但存在局限性(如验证逻辑被绕过)。<br>- 参数化查询:使用预编译语句,输入作为参数传递,避免SQL拼接(核心防护手段)。<br>- 预编译语句:数据库层面编译SQL,参数作为占位符(如?),执行时替换,防止解析恶意字符。

4) 【示例】
伪代码示例(用户登录场景):
用户输入:用户名 = “admin' or '1'='1”,密码 = “123”
代码(错误处理方式):

String sql = "SELECT * FROM users WHERE username='" + username + "' AND password='" + password + "'";
// 执行sql查询

执行后,实际SQL语句为:SELECT * FROM users WHERE username='admin' or '1'='1' AND password='123'。由于“1='1”为真,查询返回所有用户,包括管理员,从而绕过验证,获取管理员权限。

5) 【面试口播版答案】(约90秒)
“SQL注入是攻击者利用应用对用户输入的SQL语句拼接处理不当,注入恶意SQL代码,绕过应用层验证,直接操作数据库。原理是应用将用户输入直接拼进SQL语句,导致SQL解析器执行恶意语句。比如用户登录时输入‘' or 1=1 --’,原本验证用户名的查询变成‘SELECT * FROM users WHERE username='admin' or 1=1 --’,绕过验证。360安全卫士的防护措施包括输入验证(检查输入是否为SQL关键字,如'、or等,防止恶意字符注入,但可能被绕过,比如用双引号绕过单引号验证),参数化查询(使用PreparedStatement,SQL语句模板不变,用户输入作为参数传递,数据库预编译SQL,参数作为占位符,执行时替换,避免解析恶意字符,这是核心防护手段)。”

6) 【追问清单】

  • 问题1:如何检测SQL注入?
    回答要点:黑盒测试(输入特殊字符,观察响应,如SQL错误或数据泄露,例如输入' or 1=1 --',若返回所有用户则可能存在注入);白盒测试(检查代码中SQL拼接逻辑,看是否使用拼接);工具辅助(如SQLMap自动化检测,输入URL和参数,扫描注入点)。
  • 问题2:参数化查询和预编译语句有什么区别?
    回答要点:参数化查询是预编译SQL语句,输入作为参数传递,避免拼接;预编译语句是数据库层面编译SQL,参数作为占位符(如?),更严格,防止注入(比如PreparedStatement是Java中的预编译语句,属于参数化查询的一种,底层由数据库编译,参数替换后执行,避免解析)。
  • 问题3:除了输入验证和参数化,还有哪些防护措施?
    回答要点:输出编码(防止XSS,但SQL注入用输入验证和参数化);Web应用防火墙(WAF)拦截恶意请求;数据库权限最小化(限制用户权限,仅能操作必要数据,即使注入成功,权限受限)。
  • 问题4:如果应用用了输入验证,为什么还会被注入?
    回答要点:输入验证可能不全面(如只检查长度,未检查特殊字符,或验证逻辑被绕过,比如注入绕过验证,因为验证在拼接前,拼接后执行,恶意代码已执行);或者验证逻辑被绕过,如单引号验证后注入双引号绕过(如输入“" or 1=1 --”拼接后变成“username='admin' or 1=1 --”)。
  • 问题5:如何防止数据库内容泄露?
    回答要点:对敏感数据加密存储(如密码哈希,使用bcrypt等算法);使用参数化查询防止注入;限制数据库访问权限(最小权限原则,用户只能访问所需表,不能执行删除、更新等操作)。

7) 【常见坑/雷区】

  • 坑1:混淆输入验证与参数化查询,仅强调输入验证,未提及参数化查询的具体实现(如PreparedStatement),导致防护措施不完整,面试官会追问“如何防止拼接”。
  • 坑2:忽略输入验证的局限性,未举例绕过案例(如双引号绕过单引号验证),导致回答不深入,面试官会反问“如果输入验证检查了单引号,如何绕过?”
  • 坑3:不解释参数化查询的底层编译机制,比如“数据库预编译SQL,参数作为占位符替换”,导致回答停留在表面,面试官会问“为什么参数化能防止注入?”
  • 坑4:示例错误,如将注入后直接获取数据库内容描述为“直接返回所有数据”,而实际可能需要结合其他技巧(如获取管理员密码,需结合UNION查询),导致理解不全面。
  • 坑5:忽略数据库权限的影响,认为注入后只能读取数据,但实际可通过注入获取管理员权限(如修改用户权限),导致风险评估不完整。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1