MySQL知识点
一、基础语句骨架
SELECT 字段 FROM 表名 WHERE 条件 ORDER BY 列 LIMIT 行数;
- *号表示所有列
- 条件用AND、OR、=、用( )分组
SQL注入关联性:所有查询都基于这个骨架,注入就是破坏原来的WHERE条件。
二、注释
-- 这是注释(注意:--后面必须有空格,或者--+)
# 这也是注释
/*这是块注释*/
在SQL注入的用途: admin ' -- 把后面的密码验证给注释掉。
/**/可以绕过空格过滤,如:
SELECT/**/1
三、字符串与十六进制
'hello' "hello" -- 单/双引号
CONCAT('a','b') -- 拼接
CONCAT_WS(',',a,b) -- 带分隔符拼接
GROUP_CONCAT(col) -- 将多行结果拼接成一行字符串注入中用来一次性显示多行数据
0x68656c6c6f -- 十六进制字符串,等价'hello'
注入用途:
- 绕过引号过滤可以使用ox...表示字符串。
- groupconcat(tablename)一次性爆出所有表名
- 拼接符号0x3a表示:,用于美化输出
四、MySQL核心元数据库(information_schema)
-- 先自己建一个数据库和一个表。自己起名字 DATABASE_NAME 和 TABLE_NAME 是你自己起的名字。做实验~
-- 找到phpstudy目录 我的:D:\phpstudy_pro\Extensions\MySQL8.0.12\bin 使用cmd 输入mysql按TAB 补齐后 使用 -u root -p 示例:mysql.exe -u root -p
-- 所有数据库名
SELECT SCHEMA_NAME FROM information_schema.SCHEMATA;
-- 切换数据库
USE 数据库名;
-- 当前库的所有表
SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'DATABAE_NAME';
-- 某表的所有列
SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='DATABASE_NAME' AND TABLE_NAME = 'TABLE_NAME';
- 脱库的数据来源。发现SQL注入后,我们不是直接猜表名,而是通过这些系统表把所有的表、列查出来。
# 连接(-u 用户,-p 密码,-h 主机,-P 端口) 端口默认:3306
mysql -u root -p
mysql -u root -p -h 127.0.0.1 -P 3306
# 指定数据库连接
mysql -u root -p 数据库名
# 退出
exit;
quit;
五、MySQL操作
5.1 数据库操作
SHOW DATABASES; -- 查看所有数据库
CREATE DATABASE test_db CHARSET utf8mb4; -- 创建数据库
DROP DATABASE test_db; -- 删除数据库
USE test_db; -- 切换/选择数据库
SELECT DATABASE(); -- 查看当前使用的数据库
5.2 数据表操作
5.2.1 查看表
SHOW TABLES; -- 查看当前库所有表
DESC 表名; -- 查看表结构(字段、类型、键)
DESCRIBE 表名; -- 查看表结构
SHOW COLUMNS FORM 表名; -- 查看列详细信息
SHOW CREATE TABLE 表名; -- 查看建表完整语句
创建表
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
password VARCHAR(50) NOT NULL,
email VARCHAR(100),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- 仅了解:created_at:时间戳类型,默认值为当前时间
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 仅了解:存储引擎引用InnoDB(支持事务),默认字符集utf8mb4(支持emoji)
修改表
ALTER TABLE 表名 ADD 列名 类型; -- 添加列
ALTER TABLE 表名 DROP COLUMN 列名; -- 删除列
ALTER TABLE 表名 MODIFY 列名 新类型; -- 修改列类型(仅了解)
ALTER TABLE 表名 CHANGE 旧列名 新列名 类型; -- 重命名列(仅了解)
ALTER TABLE 表名 RENAME TO 新表名; -- 重命名表(仅了解)
DROP TABLE 表名; -- 删除表
TRUNCATE TABLE 表名; -- 清空表数据,重置自增(仅了解)
5.3 数据操作
插入
INSERT INTO users (username,password) VALUES ('admin', '123456');
INSERT INTO users (username,password) VALUES
('user1', '123456'),
('user2', '456789');
查询
SELECT * FROM users -- 查询users表的所有列
SELECT username, password FROM users; -- 指定列
(关键词)
WHERE -- 条件查询
LIKE '%admin%' -- 模糊查询 包含admin (如: xxadminxx,superadmin1)%代表任意字符出现任意次数
'admin%' -- 以admin开头(如:admin、admin123)
'%admin' -- 以admin结尾(如:testadmin)
ORDER BY -- 排序【DESC 降序 ASC 升序(默认)】
LIMIT 0,10 -- 分页(偏移0,取10条)
COUNT(*) -- 计数
DISTINCT -- 去重(仅了解)
更新
UPDATE users SET password = 'newpass' WHERE id = 1;
删除
DELETE -- 删除
5.4 条件与运算符
-- 比较
=, !=或<>, >, <, >=, <=
-- 逻辑
AND, OR, NOT
-- 范围
BETWEEN 1 AND 10
IN(1, 2, 3)
-- 空值
IS NULL
IS NOT NULL
-- 模糊
LIKE
REGEXP -- 正则
5.5 函数
5.5.1 字符串
CONCAT('A', 'B') -- 拼接
GROUP_CONCAT(列名) -- 多行拼接
SUBSTRING(str, 1, 3) -- 截取
LENGTH(str) -- 长度
REPLACE(str, 'a', 'b') -- 替换
5.5.2 数值
COUNT(), SUM(), AVG(), MAX(), MIN()
5.5.3 时间
NOW(), CURDATE(), YEAR(),MONTH(),DAY()
5.5.4 条件判断
IF(condition, true_val, false_val) -- SQL盲注的核心
CASE WHEN condition THEN val ELSE val END -- 仅了解
5.6 联合查询与子查询
-- UNION (列数必须相同)
SELECT id, username FROM users
UNION
SELECT id, password FROM admins;
-- 子查询
SELECT * FROM users WHERE id = (SELECT MAX(id) FROM users);
SELECT * FORM users WHERE id IN (SELECT id FROM admins);
5.7 导入导出
-- 导出整个库(命令行)
mysqldump -u root -p 数据库名 > backup.sql
-- 导出某张表
mysqldump -u root -p 数据库名 表名 > table.sql
-- 导入(先进入MySQL命令行)
source D:/backup.sql;
-- cmd 直接导入
mysql -u root -p 数据库名 < backup.sql
5.8 用户权限(拓展)
-- 创建用户
CREATE USER 'test'@'localhost' IDENTIFIED BY 'password';
-- 授权
GRANT ALL PRIVILEGES ON test_db.* TO 'test'@'localhost';
GRANT SELECT, INSERT ON test_db.* TO 'test'@'localhost';
-- 刷新权限
FLUSH PRIVILEGES;
-- 查看用户权限
SHOW GRANTS FOR 'test'@'localhost';
-- 删除用户
DROP USER 'test'@'localhost';
5.9常用函数
5.9.1 获取环境信息
SELECT DATABASE(); -- 当前库名
SELECT USER(); -- 当前用户
SELECT VERSION(); -- 版本
SELECT @@datadir; -- 数据目录
SELECT @@version_compile_os; -- 操作系统