SQL注入概述
SQL注入是一种通过将恶意SQL代码插入输入参数,从而欺骗服务器执行非预期SQL命令的攻击方式。常见于未严格过滤用户输入的Web应用,可能导致数据泄露、篡改或删除。
常见SQL注入类型
基于错误的注入
通过构造非法输入触发数据库报错,从错误信息中获取数据库结构或数据。例如:
' OR 1=1 --
联合查询注入
利用UNION操作符合并恶意查询到原查询中,泄露其他表数据。示例:
' UNION SELECT username, password FROM users --
布尔盲注
通过条件语句的真假推断数据内容。例如:
' AND (SELECT SUBSTRING(password,1,1) FROM users WHERE username='admin')='a' --
时间盲注
利用延时函数(如SLEEP())判断条件真假。示例:
' AND IF(1=1, SLEEP(5), 0) --
防御措施
参数化查询
使用预编译语句(Prepared Statements)分离SQL逻辑与数据。例如Java中:
java
String query = "SELECT * FROM users WHERE username = ?";
PreparedStatement stmt = connection.prepareStatement(query);
stmt.setString(1, userInput);
输入验证与过滤
- 白名单验证:仅允许预期字符(如字母、数字)。
- 转义特殊字符:如将单引号
'转为\'。
最小权限原则
数据库账户仅授予必要权限,避免使用root或sa等高权限账户。
启用WAF
部署Web应用防火墙(WAF)拦截常见注入攻击特征。
错误信息处理
避免向用户暴露详细数据库错误信息,使用通用错误页面。
自动化检测工具
- SQLMap:开源渗透测试工具,支持多种注入技术。
- Burp Suite:集成扫描功能的Web代理工具。
- OWASP ZAP:自动化安全测试工具。
通过结合技术手段与开发规范,可显著降低SQL注入风险。