SQL注入(SQL Injection)是黑客通过构造恶意输入,篡改SQL查询逻辑的攻击方式。以下是 6种典型攻击手法及其影响。
攻击方式:利用未转义的 '
提前闭合SQL语句,插入恶意代码。
示例:
-- 原始SQL
SELECT * FROM users WHERE username = '[输入]' AND password = '[输入]';
-- 攻击者输入(用户名):
admin' --
-- 最终SQL(绕过密码检查):
SELECT * FROM users WHERE username = 'admin' --' AND password = 'xxx';
影响:
✅ 绕过登录验证(如 admin' --
注释掉密码检查)。
✅ 泄露敏感数据(如 ' OR 1=1 --
查询所有用户)。
攻击方式:利用 UNION SELECT
合并查询结果,窃取其他表数据。
示例:
-- 原始SQL(商品搜索):
SELECT * FROM products WHERE name LIKE '%[输入]%';
-- 攻击者输入:
' UNION SELECT username, password FROM users --
-- 最终SQL:
SELECT * FROM products WHERE name LIKE '%' UNION SELECT username, password FROM users --%';
影响:
✅ 泄露数据库所有用户密码(如 UNION SELECT 1,2,3,password FROM users
)。
✅ 获取管理员权限(如 UNION SELECT 'admin', 'hashed_password'
)。
攻击方式:通过 AND 1=1
/ AND 1=2
观察页面返回差异,逐字符猜解数据。
示例:
-- 攻击者输入(探测管理员密码长度):
' AND (SELECT LENGTH(password) FROM users WHERE username='admin')=10 --
-- 如果返回正常,说明密码长度为10
影响:
✅ 间接获取敏感信息(如密码、API密钥)。
✅ 适用于错误信息被隐藏的场景。
攻击方式:利用 SLEEP()
或 BENCHMARK()
延迟响应,判断条件真假。
示例:
-- 攻击者输入(判断数据库名首字母):
' AND IF(SUBSTRING(DATABASE(),1,1)='a', SLEEP(5), 0) --
-- 如果页面延迟5秒,说明数据库名以 'a' 开头
影响:
✅ 绕过无错误回显的防御措施。
✅ 可逐步提取完整数据库内容。
攻击方式:利用 ;
执行多条SQL语句(需数据库支持,如MySQL默认禁用)。
示例:
-- 攻击者输入:
'; DROP TABLE users; --
-- 最终SQL:
SELECT * FROM products WHERE id=1; DROP TABLE users; --
影响:
✅ 删除表、篡改数据(如 '; UPDATE users SET is_admin=1 WHERE id=1 --
)。
✅ 执行系统命令(如SQL Server的 xp_cmdshell
)。
攻击方式:恶意数据先存入数据库,后续查询时触发注入。
示例:
注册用户名:admin' --
后台查询时触发:
-- 管理员执行(修改用户权限):
UPDATE users SET role='admin' WHERE username='[输入]';
-- 实际执行:
UPDATE users SET role='admin' WHERE username='admin' --';
影响:
✅ 绕过输入过滤(因为首次存储时未检测)。
✅ 长期潜伏,危害更大。
攻击类型 | 可能的影响 |
---|---|
数据泄露 | 盗取用户密码、信用卡号、个人信息 |
权限提升 | 普通用户 → 管理员(如 UPDATE users SET is_admin=1 ) |
数据篡改 | 修改商品价格、删除订单(如 '; UPDATE products SET price=0 -- ) |
数据库破坏 | 删除表、清空数据(如 '; DROP TABLE users -- ) |
服务器沦陷 | 利用数据库功能执行系统命令(如 xp_cmdshell ) |
法律风险 | 数据泄露导致GDPR罚款、公司声誉受损 |
✅ 参数化查询(PreparedStatement
) → 彻底杜绝注入
✅ ORM框架(如Hibernate、Django ORM) → 减少手写SQL
✅ 输入验证(白名单过滤 a-zA-Z0-9
)
✅ 最小权限(数据库账号仅限 SELECT/INSERT
)
✅ WAF防火墙(拦截 UNION SELECT
、SLEEP()
等攻击)
攻击方式:单引号注入、UNION查询、盲注、堆叠查询、二次注入。
最大危害:数据泄露、删库、服务器被控。
最佳防御:参数化查询 + ORM + 输入过滤。
记住:永远不要信任用户输入! 使用 PreparedStatement
是黄金标准。