
1) 【一句话结论】:假设某Web应用在用户登录模块的用户名和密码验证环节,因对输入参数未做有效转义,导致SQL注入漏洞,可绕过身份验证,获取未授权访问权限。
2) 【原理/概念讲解】:老师口吻解释,SQL注入的核心是输入参数被错误地拼接进SQL语句,导致恶意SQL代码被执行。比如,正常情况下,用户名和密码通过SQL查询验证,但若代码写成SELECT * FROM users WHERE username='input_username' AND password='input_password',当用户输入' or 1=1 --时,SQL变为SELECT * FROM users WHERE username='' or 1=1 -- AND password='...',逻辑为“用户名为空或1=1(真)再减去注释”,结果为真,绕过验证。类比:就像把用户输入当成SQL命令的一部分,相当于把别人的话当成指令执行,导致系统执行了不该执行的查询。
3) 【对比与适用场景】:
| 特性 | SQL注入 | XSS(跨站脚本) |
|---|---|---|
| 目标 | 数据库 | 浏览器客户端 |
| 攻击方式 | 恶意SQL语句注入 | 恶意脚本注入 |
| 影响 | 数据泄露、权限提升、系统破坏 | 用户会话劫持、信息窃取、页面篡改 |
| 检测方式 | SQL报错、时间盲注、报文盲注 | 代码审查、输入过滤、内容安全策略 |
| 常见位置 | 登录、搜索、参数化查询的输入框 | 注入点在页面内容、表单、URL参数 |
| 注意点 | 需要数据库信息(如版本、列数) | 需要用户访问页面 |
4) 【示例】:Web应用登录页面(伪代码):
<input type="text" name="username"><input type="password" name="password"># 假设Python代码,错误拼接SQL
query = f"SELECT * FROM users WHERE username='{username}' AND password='{password}'"
result = db.execute(query)
if result: # 登录成功
return "登录成功"
else:
return "用户名或密码错误"
' or 1=1 --,密码任意,结果返回“登录成功”,说明存在注入。5) 【面试口播版答案】:(约80秒)
“我之前挖掘过一个Web应用的SQL注入漏洞,具体是在用户登录模块。发现过程是通过测试用户名和密码输入框,输入特殊字符(比如单引号)观察页面响应,发现登录失败后,尝试构造' or 1=1 --,页面显示登录成功,确认存在注入。利用方式是绕过身份验证,直接获取管理员权限。编写POC时,构造请求参数,比如POST请求携带username=' or 1=1 --'和任意密码,模拟登录。漏洞影响是用户可以绕过认证,访问敏感页面,甚至修改数据。修复方案是将用户输入参数进行SQL转义,比如使用参数化查询(预编译语句),避免拼接。比如用Python的psycopg2库的execute方法,传入参数列表,而不是拼接字符串,这样输入不会被当作SQL代码执行。”
6) 【追问清单】:
' or 1=1 --能直接绕过验证,说明是字符型注入,不需要时间判断。' or 1=1 --'的变体,或基于报文的方法,但这里主要是字符注入,可能需要调整输入,比如' or 1=1 --'加上空格或换行,或使用更隐蔽的注入语句。' or 1=1 -- and (select count(*) from users) > 0 --),然后逐列测试,确定列名(如' or 1=1 -- and (select column_name from information_schema.columns where table_name='users') > 0 --),逐步获取信息。7) 【常见坑/雷区】: