SQL 注入(SQL Injection)是一种常见的网络攻击手段,攻击者通过在 Web 应用程序的输入字段中插入恶意 SQL 代码,欺骗后台数据库执行非授权的 SQL 语句。
SQL 注入可以用于获取、篡改或删除数据库中的数据,甚至可以用于执行系统命令,导致数据泄露、数据破坏或服务器被控制等严重后果。
1、SQL 注入的工作原理
**对用户输入验证不足:**当 Web 应用程序没有正确验证用户输入时,攻击者可以在输入字段中插入 SQL 代码。
**拼接 SQL 语句:**应用程序后端通常将用户输入与 SQL 查询拼接在一起,形成完整的数据库查询语句。
**执行恶意 SQL:**如果应用程序没有对输入进行适当的转义,恶意 SQL 代码将被数据库服务器执行。
**数据泄露或破坏:**攻击者可以利用 SQL 注入来查询、修改或删除数据库中的数据,或者执行数据库管理系统的系统命令。
当用户登录网站时,通常会输入用户名和密码。
以下是一段正常的 SQL 查询代码:
SELECT * FROM users WHERE username = 'user1' AND password = 'password1';
如果攻击者输入:
用户名:**admin' --**
密码:**anything**
SQL 查询变成:
SELECT * FROM users WHERE username = 'admin' --' AND password = 'anything';
其中 – 是 SQL 的注释符号,忽略了密码条件,直接绕过了身份验证。
比如以下代码,就会出现被注入的情况:
const express = require('express');``const mysql = require('mysql');`` ``const app = express();``app.use(express.json());`` ``const connection = mysql.createConnection({` `host: 'localhost',` `user: 'root',` `password: 'password',` `database: 'testdb'``});`` ``app.post('/login', (req, res) => {` `const { username, password } = req.body;`` ` `// 不安全的 SQL 查询` ``const query = `SELECT * FROM users WHERE username = '${username}' AND password = '${password}'`;`````connection.query(query, (error, results) => {` `if (error) {` `return res.status(500).send('Database error');` `}` `if (results.length > 0) {` `res.send('Login successful');` `} else {` `res.send('Invalid username or password');` `}` `});``});`` ``app.listen(3000, () => {` `console.log('Server running on http://localhost:3000');``});
2、常见 SQL 注入
2.1、基础型 SQL 注入
直接将恶意 SQL 代码嵌入用户输入中,并影响查询逻辑。
输入用户名:**admin' OR '1'='1**
输入密码:**anything**
执行的 SQL 查询:
SELECT * FROM users WHERE username = 'admin' OR '1'='1' AND password = 'anything';
结果:
OR ‘1’=‘1’ 总为 true,可以绕过验证。
2.2、UNION 查询注入
通过 UNION 将攻击者构造的查询结果与合法查询结果合并,从而获取敏感数据。
输入:
' UNION SELECT null, username, password FROM users --
执行的 SQL 查询:
SELECT id, name FROM products WHERE id = '' UNION SELECT null, username, password FROM users --';
结果:
将 users 表的 username 和 password 数据作为结果返回。
2.3、错误型 SQL 注入
通过故意触发数据库错误,利用错误信息推测表名、列名或数据。
输入:
' AND 1=CONVERT(int, (SELECT @@version)) --
执行的 SQL 查询:
SELECT * FROM users WHERE username = '' AND 1=CONVERT(int, (SELECT @@version)) --';
结果:
错误信息可能暴露数据库版本或其他信息。
2.4、盲注
无法直接获取查询结果,攻击者通过判断返回页面的响应(如布尔值或时间延迟)来逐步推测数据。
布尔型盲注,输入:
' AND (SELECT 1 WHERE SUBSTRING((SELECT database()), 1, 1)='t') --
执行的 SQL 查询:
SELECT * FROM users WHERE username = '' AND (SELECT 1 WHERE SUBSTRING((SELECT database()), 1, 1)='t') --';
结果:
根据返回结果判断数据库名首字母是否为 t。
时间盲注,输入:
' AND IF(1=1, SLEEP(5), 0) --
执行的 SQL 查询:
SELECT * FROM users WHERE username = '' AND IF(1=1, SLEEP(5), 0) --';
结果:
如果条件成立,服务器会延迟 5 秒响应,从而泄露信息。
2.5、堆叠查询注入
允许多条 SQL 语句同时执行。
输入:
'; DROP TABLE users; --
执行的 SQL 查询:
SELECT * FROM users WHERE username = ''; DROP TABLE users; --';
结果:
users 表被删除。
当然,也可以执行修改管理员密码的SQL命令:
SELECT * FROM users WHERE username = ''; UPDATE users set password='123456' where user='admin'; --';
某些数据库(如 MySQL)默认不支持多语句执行。
2.6、存储过程注入
利用存储过程的输入参数注入恶意 SQL。
输入:
'; EXEC xp_cmdshell('dir'); --
执行的 SQL:
EXEC LoginProcedure 'username', ''; EXEC xp_cmdshell('dir'); --'
结果:
执行系统命令(如列出目录)。
2.7、Cookie 注入
利用修改浏览器存储的 Cookie 值进行注入。
Cookie: session_id=' OR '1'='1;
服务器在解析 Cookie 时执行了恶意 SQL。
3、防范措施
3.1、参数化查询和预编译语句
使用参数化查询或预编译语句,将用户输入与 SQL 语句分离,避免用户输入被直接解析为 SQL 代码。
Java 代码:
String sql = "SELECT * FROM users WHERE username = ? AND password = ?";``PreparedStatement pstmt = connection.prepareStatement(sql);``pstmt.setString(1, username);``pstmt.setString(2, password);``ResultSet rs = pstmt.executeQuery();
Node.js (MySQL 模块):
const query = "SELECT * FROM users WHERE username = ? AND password = ?";``connection.query(query, [username, password], (err, results) => {` `if (err) throw err;` `// Handle results``});
3.2、使用 ORM 框架
核心思路 ORM(如 Hibernate、Sequelize 等)通过自动生成 SQL 查询,大幅减少手动拼接 SQL 的机会,从而避免注入。
// 使用 Sequelizeconst user = await User.findOne({` `where: { username: 'admin', password: 'password123' }});
3.3、输入验证
严格检查用户输入是否符合预期,拒绝不符合规则的输入。
对用户名、邮箱等使用正则表达式,数值类型字段只允许数字输入。
对特殊字符进行转义(如 " 转为 \")。
const username = req.body.username.replace(/[^a-zA-Z0-9]/g, ''); // 清理特殊字符
3.4、限制数据库权限
为数据库用户分配最小权限,只允许执行必要的操作。
**限制写入权限:**只允许插入、更新的用户操作对应的表,不允许 DROP、ALTER 等高危操作。
**分离读写权限:**使用只读账号访问数据库。
创建一个只读用户:
CREATE USER 'readonly_user'@'%' IDENTIFIED BY 'secure_password';`` ``GRANT SELECT ON database_name.* TO 'readonly_user'@'%';
3.5、定期安全测试
通过安全扫描工具或手动测试,定期检查代码中的潜在 SQL 注入漏洞。
我们可以使用开源工具 SQLMap 来测试。
SQLMap 是一个专门用于自动化进行 SQL 注入检测和利用的渗透测试工具。
SQLMap 广泛应用于网络安全评估和渗透测试中,帮助发现和修复SQL注入漏洞。
SQL 官方地址:https://sqlmap.org/
SQLMap 开源地址:https://github.com/sqlmapproject/sqlmap
黑客/网络安全学习路线
今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。
网络安全学习资源分享:
下面给大家分享一份2025最新版的网络安全学习路线资料,帮助新人小白更系统、更快速的学习黑客技术!
一、2025最新网络安全学习路线
一个明确的学习路线可以帮助新人了解从哪里开始,按照什么顺序学习,以及需要掌握哪些知识点。
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
读者福利 | CSDN大礼包:《网络安全入门&进阶学习资源包》免费分享 (安全链接,放心点击)
我们把学习路线分成L1到L4四个阶段,一步步带你从入门到进阶,从理论到实战。
L1级别:网络安全的基础入门
L1阶段:我们会去了解计算机网络的基础知识,以及网络安全在行业的应用和分析;学习理解安全基础的核心原理,关键技术,以及PHP编程基础;通过证书考试,可以获得NISP/CISP。可就业安全运维工程师、等保测评工程师。
L2级别:网络安全的技术进阶
L2阶段我们会去学习渗透测试:包括情报收集、弱口令与口令爆破以及各大类型漏洞,还有漏洞挖掘和安全检查项目,可参加CISP-PTE证书考试。
L3级别:网络安全的高阶提升
L3阶段:我们会去学习反序列漏洞、RCE漏洞,也会学习到内网渗透实战、靶场实战和技术提取技术,系统学习Python编程和实战。参加CISP-PTE考试。
L4级别:网络安全的项目实战
L4阶段:我们会更加深入进行实战训练,包括代码审计、应急响应、红蓝对抗以及SRC的挖掘技术。并学习CTF夺旗赛的要点和刷题
整个网络安全学习路线L1主要是对计算机网络安全的理论基础的一个学习掌握;而L3 L4更多的是通过项目实战来掌握核心技术,针对以上网安的学习路线我们也整理了对应的学习视频教程,和配套的学习资料。
二、技术文档和经典PDF书籍
书籍和学习文档资料是学习网络安全过程中必不可少的,我自己整理技术文档,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本,(书籍含电子版PDF)
三、网络安全视频教程
对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的网安视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识。
网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。
四、网络安全护网行动/CTF比赛
学以致用 ,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。
五、网络安全工具包、面试题和源码
“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。
面试不仅是技术的较量,更需要充分的准备。
在你已经掌握了技术之后,就需要开始准备面试,我们将提供精心整理的网安面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。
如果你是要找网安方面的工作,它们绝对能帮你大忙。
这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。
参考解析:深信服官网、奇安信官网、Freebuf、csdn等
内容特点:条理清晰,含图像化表示更加易懂。
内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…
**读者福利 |** CSDN大礼包:《网络安全入门&进阶学习资源包》免费分享 (安全链接,放心点击)