2026-10-25 21:12:32
SQL注入攻击是通过在用户输入中插入恶意SQL命令,绕过程序限制直接操作数据库,从而获取敏感信息或提升权限的攻击方式。其防御核心在于输入验证、参数化查询和最小权限原则。
一、SQL注入攻击的分类与原理数字型注入
特点:针对整型参数(如ID、年龄),通过构造逻辑表达式(如and 1=1)测试漏洞。
原理:弱类型语言(如PHP)可能将用户输入错误推导为字符串,导致SQL语句逻辑被篡改。例如:
原始请求:select * from table where id=8
注入测试:id=8 and 1=1(返回正常数据)→ id=8 and 1=2(返回异常)→ 确认漏洞存在。
适用场景:ASP、PHP等弱类型语言开发的Web应用。
字符型注入
特点:针对字符串参数(如用户名),需闭合单引号并注释多余代码。
原理:通过注入单引号和逻辑表达式(如admin' and 1=1 --)篡改SQL语句。例如:
原始请求:select * from table where username='admin'
注入后:select * from table where username='admin' and 1=1 --'(注释掉后续代码)。
复杂场景:在UPDATE或INSERT语句中,需根据数据库类型使用连接符(如SQL Server用+,MySQL用空格)闭合字符串。
数据库特定注入
SQL Server:利用xp_cmdshell执行系统命令,或通过UNION查询提取数据。
MySQL:通过information_schema获取元数据,或利用宽字节注入绕过过滤。
Oracle:使用UTL_HTTP调用外部服务,或通过DBMS_METADATA提取数据库结构。
查询数据
通过UNION联合查询或错误消息泄露(如MySQL显错注入)获取数据库内容。
示例:id=1 UNION SELECT username,password FROM users。
读写文件
利用数据库函数(如MySQL的LOAD_FILE())读取系统文件,或通过INTO OUTFILE写入Webshell。
示例:SELECT LOAD_FILE('/etc/passwd')。
执行命令
在数据库支持的情况下(如SQL Server的xp_cmdshell),直接执行系统命令。
示例:EXEC master..xp_cmdshell 'whoami'。
参数化查询(预编译语句)
使用数据库提供的参数化接口(如JDBC的PreparedStatement、PHP的PDO),将用户输入与SQL逻辑分离。
示例:SELECT * FROM users WHERE id = ?(?为参数占位符)。
输入验证与过滤
类型检查:强制验证输入是否为预期类型(如整型参数拒绝非数字字符)。
长度限制:限制输入长度(如用户名不超过20字符)。
关键字过滤:屏蔽SELECT、UNION等危险关键字(需结合白名单策略)。
最小权限原则
数据库账户仅授予必要权限(如仅允许SELECT,禁止DROP或EXECUTE)。
避免使用root或sa等高权限账户连接Web应用。
错误处理与日志监控
关闭详细错误消息(如MySQL的sql_mode=STRICT_TRANS_TABLES),避免泄露数据库结构。
记录异常SQL请求,定期分析攻击模式。
编码统一与转义
确保Web应用各层(如前端、后端、数据库)使用统一编码(如UTF-8),防止乱码导致注入。
对特殊字符(如单引号)进行转义处理(如PHP的mysqli_real_escape_string())。
工具检测与补丁更新
使用自动化工具(如SQLMap)定期扫描漏洞。
及时更新Web服务器(如Apache、Nginx)和数据库(如MySQL、SQL Server)的补丁。
WAF防护
部署Web应用防火墙(WAF),拦截常见注入特征(如and 1=1、UNION SELECT)。
参数化查询防御数字型注入:
// Java示例:使用PreparedStatement防止注入String query = "SELECT * FROM users WHERE id = ?";PreparedStatement stmt = connection.prepareStatement(query);stmt.setInt(1, userInputId); // 自动处理类型转换白名单过滤防御字符型注入:
# Python示例:仅允许字母和数字的用户名import reif not re.match(r'^[a-zA-Z0-9]+$', username): raise ValueError("Invalid username")最小权限配置防御提权攻击:
-- MySQL示例:创建低权限账户CREATE USER 'web_user'@'localhost' IDENTIFIED BY 'password';GRANT SELECT ON app_db.* TO 'web_user'@'localhost';总结:SQL注入的防御需结合技术手段(如参数化查询)和管理策略(如最小权限),同时通过工具检测和日志监控持续优化安全体系。