1.初步了解数据库(MySQL)
1. 数据库核心概念
数据库(Database)是按一定规则组织、存储和管理数据的仓库,MySQL 是最流行的开源关系型数据库(RDBMS),基于「表」结构存储数据,核心特点:
- 关系型:数据以行(记录)、列(字段)的二维表组织,表之间可通过「主键 / 外键」建立关联;
- 开源免费:社区版完全免费,广泛用于中小型项目;
- 跨平台:支持 Windows、Linux、macOS 等;
- 客户端 - 服务端架构:MySQL 服务端运行在服务器,客户端(如 Navicat、命令行)通过网络连接操作。
2. MySQL 核心组件
| 组件 | 说明 |
|---|---|
| 数据库(DB) | 一个存储多个表的容器(如test_db) |
| 表(Table) | 数据的基本存储单元(如user表) |
| 字段(Column) | 表的列(如id、username、password) |
| 记录(Row) | 表的行(一条用户数据) |
| 主键(PK) | 唯一标识记录的字段(如id自增) |
| 索引(Index) | 加速查询的结构(如给username建索引) |
-- 1. 登录MySQL(默认端口3306)
mysql -u root -p # 输入密码后登录
-- 2. 查看所有数据库
SHOW DATABASES;
-- 3. 创建数据库
CREATE DATABASE test_db DEFAULT CHARSET utf8mb4;
-- 4. 使用数据库
USE test_db;
-- 5. 创建表(用户表示例)
CREATE TABLE user (
id INT PRIMARY KEY AUTO_INCREMENT, -- 自增主键
username VARCHAR(50) NOT NULL UNIQUE, -- 用户名唯一
password VARCHAR(100) NOT NULL, -- 密码
create_time DATETIME DEFAULT NOW() -- 创建时间默认当前
);
-- 6. 查看表结构
DESC user;
-- 7. 删除数据库/表(谨慎使用)
DROP DATABASE test_db;
DROP TABLE user;
2.初步了解sql注入漏洞
1. 什么是 SQL 注入?
SQL 注入(SQL Injection)是攻击者通过在用户输入中插入恶意 SQL 语句,欺骗数据库执行非预期操作的漏洞。核心原因:程序未对用户输入做严格过滤,直接拼接 SQL 语句执行。
2. 漏洞原理(示例)
假设有一个用户登录功能,后端代码(PHP 示例)未过滤输入:
php
运行
// 危险代码:直接拼接用户输入
$username = $_POST['username'];
$password = $_POST['password'];
$sql = "SELECT * FROM user WHERE username='$username' AND password='$password'";
mysqli_query($conn, $sql);
攻击者在用户名输入框输入:admin' OR '1'='1,拼接后的 SQL 变成:
sql
SELECT * FROM user WHERE username='admin' OR '1'='1' AND password='任意值';
由于 '1'='1' 恒成立,攻击者无需正确密码即可登录。
3. SQL 注入的危害
- 窃取数据库数据(用户账号、密码、敏感信息);
- 修改 / 删除数据库数据(如删表、改密码);
- 提权操作(如获取服务器权限);
- 拖库(导出整个数据库)。
4. 防御措施
- 参数化查询(预编译):使用
?占位符,避免直接拼接(推荐);php
运行
// 安全代码:参数化查询 $sql = "SELECT * FROM user WHERE username=? AND password=?"; $stmt = mysqli_prepare($conn, $sql); mysqli_stmt_bind_param($stmt, "ss", $username, $password); mysqli_stmt_execute($stmt); - 输入过滤 / 转义(如 MySQL 的
mysqli_real_escape_string); - 最小权限原则(数据库账号仅赋予必要权限);
- 使用 WAF(Web 应用防火墙)拦截注入攻击。
3.练习sql语句
1. 新增数据(INSERT)
sql
-- 插入单条数据
INSERT INTO user (username, password) VALUES ('zhangsan', '123456');
-- 插入多条数据
INSERT INTO user (username, password) VALUES
('lisi', '654321'),
('wangwu', 'abc123');
2. 查询数据(SELECT)
sql
-- 查询所有字段、所有记录
SELECT * FROM user;
-- 查询指定字段
SELECT id, username FROM user;
-- 条件查询(WHERE)
SELECT * FROM user WHERE username='zhangsan';
-- 模糊查询(LIKE):查询用户名含「li」的用户
SELECT * FROM user WHERE username LIKE '%li%';
-- 排序(ORDER BY):按id降序
SELECT * FROM user ORDER BY id DESC;
-- 限制结果数量(LIMIT):只查前2条
SELECT * FROM user LIMIT 2;
-- 去重(DISTINCT):假设存在重复用户名时
SELECT DISTINCT username FROM user;
3. 修改数据(UPDATE)
sql
-- 修改指定用户的密码(务必加WHERE,否则改全表!)
UPDATE user SET password='newpass123' WHERE username='zhangsan';
-- 同时修改多个字段
UPDATE user SET password='111111', create_time='2025-01-01 00:00:00' WHERE id=2;
4. 删除数据(DELETE)
sql
-- 删除指定记录(务必加WHERE,否则删全表!)
DELETE FROM user WHERE id=3;
-- 清空表(保留表结构,自增主键重置)
TRUNCATE TABLE user; -- 比DELETE * 更高效,但不可回滚
5. 进阶练习(聚合 / 关联查询)
sql
-- 统计用户总数
SELECT COUNT(*) AS total FROM user;
-- 按条件统计(密码长度>6的用户数)
SELECT COUNT(*) FROM user WHERE LENGTH(password) > 6;
-- 多表关联查询(假设有`order`表,关联user表查用户订单)
-- 先创建order表:
CREATE TABLE `order` (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT,
order_no VARCHAR(50),
FOREIGN KEY (user_id) REFERENCES user(id)
);
-- 关联查询:查用户名+订单号
SELECT u.username, o.order_no
FROM user u
JOIN `order` o ON u.id = o.user_id;
(4)靶场搭建

510

被折叠的 条评论
为什么被折叠?



