开学了学习时间少非常了,虽然是职高但不是计算机专业

sql注入打基础,之前都学习的sql注入原理,没有学习sql语句感觉有点迷糊,就直接拿别人的语句自己进行找网站漏洞,或者用sqlmp直接去扫,感觉很麻木不知道他是怎么交互的

学习笔记,英语不好,容易忘,写下笔记

问题解决

连接报错ERROR 1045 (28000): Access denied for user ‘root’@’::1’ (using password: YES)
在windows系统的数据库文件里面配置 my.ini文件添加内容

1
2
3
[mysqld]
# 其他已存在的配置项...
skip-grant-tables

数据库启动日志

1
2
3
4
5
6
7
[mysqld]
# 其他已存在的配置项...

# 启用查询日志
log-output=FILE
general-log=1
general-log-file="C:/phpstudy_pro/Extensions/MySQL5.7.26/data/query.log"

在 PowerShell 中,你可以使用 Get-Content 命令来实时监控文件。下面是一个示例:

1
Get-Content -Path "C:\phpstudy_pro\Extensions\MySQL5.7.26\data\query.log" -Wait

这个命令会实时显示日志文件的内容,并在文件被修改时持续更新。

修改密码

mysql修改密码
将root用户的密码由123456改为123

1
mysqladmin -u root -p 123456 password 123

连接数据库

1
mysql -h 地址 -u 用户 -p

在这里插入图片描述

允许外网访问

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
MySQL [(none)]>use mysql;
#查看现有用户,密码及允许连接的主机
MySQL [mysql]> SELECT User, Password, Host FROM user;
+------+-------------------------------------------+-----------+
| User | Password | Host |
+------+-------------------------------------------+-----------+
| root | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | localhost |
| root | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | 127.0.0.1 |
+------+-------------------------------------------+-----------+
2 rows in set (0.00 sec)

#设置为所有IP都可以访问,比较危险,不建议。
MySQL [mysql]> UPDATE user SET Host=@'%' where user='root' AND Host='localhost' LIMIT 1;
MySQL [mysql]> flush privileges;
#再次查看现有用户,密码及允许连接的主机
MySQL [mysql]> SELECT User, Password, Host FROM user;
+------+-------------------------------------------+-----------+
| User | Password | Host |
+------+-------------------------------------------+-----------+
| root | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | |
| root | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | 127.0.0.1 |
+------+-------------------------------------------+-----------+

基本命令

1
2
3
4
SHOW DATABASES; //查看数据库
use 要进入的数据库名;//选择数据库
SHOW TABLES;//查看表
desc 表名; //查看字段

# 创建数据库

1
CREATE DATABASE admin;

在这里插入图片描述

删除数据库

1
DROP DATABASE admin;

在这里插入图片描述

# 创建表和字段

1
CREATE TABLE user  (id INT,user VARCHAR(20),password VARCHAR(20));

user是表名
id是字段,IHT是类型数字类型
user是字段,VARCHAR(20)是字符串类型的
password 是字段,VARCHAR(20)是字符串类型的
在这里插入图片描述

删除表

1
DROP TABLE 要删除的表名; 

修改字段名称

语法

1
ALTER TABLE <表名> CHANGE <旧字段名> <新字段名> <新数据类型>;

添加表记录

这个添加和上面添加表是联系在一起的

1
insert into user(id,user,password) values (1,'admin','password'); 

user要添加的表名
第一个列的内容是1
第二个列的内容是admin
第三个列的内容是password
在这里插入图片描述

删除数据记录

1
delete from admin where id = 1

admin要删除的表名里面的数据

删除id列内容是1的一行数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
mysql> select * FROM admin; # 查看没有删除前
+------+----------+----------------------------------+
| Id | user | pswd |
+------+----------+----------------------------------+
| 1 | admin | 21232f297a57a5a743894a0e4a801fc3 |
| 2 | admin2 | pass2word |
| 3121 | 321admin | pass32131word |
+------+----------+----------------------------------+


mysql> delete from admin where id = 1; # 删除语句
Query OK, 1 row affected (0.00 sec)


mysql> select * FROM admin; # 查看删除后
+------+----------+---------------+
| Id | user | pswd |
+------+----------+---------------+
| 2 | admin2 | pass2word |
| 3121 | 321admin | pass32131word |
+------+----------+---------------+

修改数据记录

没有修改前

image-20221203203513223

用这个语句修改

1
update admin set user = 'aaa' where  Id=2;

admin是要修改的表名

user是要修改的内容是aaa

Id是要修改的是Id是2的内容

image-20221203203816097

SELECT 查询基本命令

学习参考https://www.runoob.com/sql/sql-distinct.html
dvwa库
在这里插入图片描述

用法
查看全部可以用

1
SELECT 字段,字段  FROM  表名;

库名dvwa
表名users

ORDER BY 关键字

ORDER BY 是用来排序的
进行排序这个ORDER BY 关键字经常用于sql注入的时候,根据错误,判断有几个表
列下面有6个表在这里插入图片描述
判断有几个表
ORDER BY 7就报错了,应为他只有6个表在这里插入图片描述
ORDER BY 6就对了

DISTINCT 语句

DISTINCT 语句过滤重复的值
用法

1
SELECT DISTINCT,字段  FROM 表名;

WHERE 子句

WHERE 子句用于提取那些满足指定条件的记录

用法

1
SELECT 字段,字段 FROM 表名 WHERE 字段='表数据内容';

在这里插入图片描述

库名dvwa
表名users

1
SELECT *  FROM users  WHERE user='1337';

AND 和 OR 运算符

and

如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。
如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录。
3.2.1AND就是两个都正确才显示,而且是在一行的数据内容都正确才可以

库名dvwa
表名users

1
SELECT * FROM users  WHERE last_name='Me' AND user_id=3;


如果user_id=2就会报错
在这里插入图片描述

OR

OR 只有一个正确就输入

如果user_id=2也是正确的

1
ELECT * FROM users  WHERE last_name='Me' OR user_id=2;

在这里插入图片描述

between .. and ..

between 指定范围内

语法

1
.... where 指定要取的字段 between 取值1 and 取值2

演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 查看first_name和password的内容
MySQL [dvwa]> select first_name,password from users;
+------------+----------------------------------+
| first_name | password |
+------------+----------------------------------+
| admin | 5f4dcc3b5aa765d61d8327deb882cf99 |
| Gordon | e99a18c428cb38d5f260853678922e03 |
| Hack | 8d3533d75ae2c3966d7e0d4fcc69216b |
| Pablo | 0d107d09f5bbe40cade3de5c71e9e9b7 |
| Bob | 5f4dcc3b5aa765d61d8327deb882cf99 |
+------------+----------------------------------+
5 rows in set (0.001 sec)

# 查看first_name和password的内容 用between查看first_name的admin到Hack底内容
MySQL [dvwa]> select first_name,password from users where first_name between 'admin' and 'Hack';
+------------+----------------------------------+
| first_name | password |
+------------+----------------------------------+
| admin | 5f4dcc3b5aa765d61d8327deb882cf99 |
| Gordon | e99a18c428cb38d5f260853678922e03 |
| Hack | 8d3533d75ae2c3966d7e0d4fcc69216b |
| Bob | 5f4dcc3b5aa765d61d8327deb882cf99 |
+------------+----------------------------------+
4 rows in set (0.001 sec)

in包含的内容

in这个就是查看指定的内容那一行的内容

演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 查看first_name和password的内容
MySQL [dvwa]> select first_name,password from users;
+------------+----------------------------------+
| first_name | password |
+------------+----------------------------------+
| admin | 5f4dcc3b5aa765d61d8327deb882cf99 |
| Gordon | e99a18c428cb38d5f260853678922e03 |
| Hack | 8d3533d75ae2c3966d7e0d4fcc69216b |
| Pablo | 0d107d09f5bbe40cade3de5c71e9e9b7 |
| Bob | 5f4dcc3b5aa765d61d8327deb882cf99 |
+------------+----------------------------------+
5 rows in set (0.001 sec)

# 查看first_name和password的内容过滤里面带admin和Bob
# where first_name 就是过滤first_name的字段的内容
MySQL [dvwa]> select first_name,password from users where first_name in ('admin','Bob');
+------------+----------------------------------+
| first_name | password |
+------------+----------------------------------+
| admin | 5f4dcc3b5aa765d61d8327deb882cf99 |
| Bob | 5f4dcc3b5aa765d61d8327deb882cf99 |
+------------+----------------------------------+
2 rows in set (0.001 sec)

not in不包含的内容

他和in是相反的

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
# 查看first_name和password的内容
MySQL [dvwa]> select first_name,password from users;
+------------+----------------------------------+
| first_name | password |
+------------+----------------------------------+
| admin | 5f4dcc3b5aa765d61d8327deb882cf99 |
| Gordon | e99a18c428cb38d5f260853678922e03 |
| Hack | 8d3533d75ae2c3966d7e0d4fcc69216b |
| Pablo | 0d107d09f5bbe40cade3de5c71e9e9b7 |
| Bob | 5f4dcc3b5aa765d61d8327deb882cf99 |
+------------+----------------------------------+
5 rows in set (0.001 sec)



# 查看first_name和password的内容过滤里面不能带有admin和Bob
# where first_name 就是过滤first_name的字段的内容
MySQL [dvwa]> select first_name,password from users where first_name not in ('admin','Bob');
+------------+----------------------------------+
| first_name | password |
+------------+----------------------------------+
| Gordon | e99a18c428cb38d5f260853678922e03 |
| Hack | 8d3533d75ae2c3966d7e0d4fcc69216b |
| Pablo | 0d107d09f5bbe40cade3de5c71e9e9b7 |
+------------+----------------------------------+
3 rows in set (0.001 sec)

like 过滤要的

语法

1
.... where 过滤要的字段  like '要的内容';

演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 查看first_name和password的内容
MySQL [dvwa]> select first_name,password from users;
+------------+----------------------------------+
| first_name | password |
+------------+----------------------------------+
| admin | 5f4dcc3b5aa765d61d8327deb882cf99 |
| Gordon | e99a18c428cb38d5f260853678922e03 |
| Hack | 8d3533d75ae2c3966d7e0d4fcc69216b |
| Pablo | 0d107d09f5bbe40cade3de5c71e9e9b7 |
| Bob | 5f4dcc3b5aa765d61d8327deb882cf99 |
+------------+----------------------------------+
5 rows in set (0.001 sec)

# 我只查看admin内容
MySQL [dvwa]> select first_name,password from users where first_name like 'admin';
+------------+----------------------------------+
| first_name | password |
+------------+----------------------------------+
| admin | 5f4dcc3b5aa765d61d8327deb882cf99 |
+------------+----------------------------------+
1 row in set (0.000 sec)

not like 过滤不要的

他和like是相反的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 查看first_name和password的内容
MySQL [dvwa]> select first_name,password from users;
+------------+----------------------------------+
| first_name | password |
+------------+----------------------------------+
| admin | 5f4dcc3b5aa765d61d8327deb882cf99 |
| Gordon | e99a18c428cb38d5f260853678922e03 |
| Hack | 8d3533d75ae2c3966d7e0d4fcc69216b |
| Pablo | 0d107d09f5bbe40cade3de5c71e9e9b7 |
| Bob | 5f4dcc3b5aa765d61d8327deb882cf99 |
+------------+----------------------------------+
5 rows in set (0.001 sec)

MySQL [dvwa]> select first_name,password from users where first_name not like 'admin';
+------------+----------------------------------+
| first_name | password |
+------------+----------------------------------+
| Gordon | e99a18c428cb38d5f260853678922e03 |
| Hack | 8d3533d75ae2c3966d7e0d4fcc69216b |
| Pablo | 0d107d09f5bbe40cade3de5c71e9e9b7 |
| Bob | 5f4dcc3b5aa765d61d8327deb882cf99 |
+------------+----------------------------------+
4 rows in set (0.001 sec)

他的使用参考https://www.runoob.com/sql/sql-orderby.html

更多参考https://www.runoob.com/sql/sql-insert.html

hex和unhex 16进制转换

hex:可以用HEX()函数将一个字符串或数字转换为十六进制格式的字符串

unhex:把十六进制格式的字符串转化为原来的格式

演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# hex演示
MySQL [security]> select hex('abc');
+------------+
| hex('abc') |
+------------+
| 616263 |
+------------+
1 row in set (0.001 sec)

# unhex演示
MySQL [security]> select unhex('616263');
+-----------------+
| unhex('616263') |
+-----------------+
| abc |
+-----------------+
1 row in set (0.001 sec)

LIMIT限制

LIMIT子句来限制SELECT语句返回记录的行数

语法

1
xxxx LIMIT 初始位置,记录数;

没有用LIMIT

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
MySQL [security]> SELECT * FROM users;
+----+----------+------------+
| id | username | password |
+----+----------+------------+
| 1 | Dumb | Dumb |
| 2 | Angelina | I-kill-you |
| 3 | Dummy | p@ssword |
| 4 | secure | crappy |
| 5 | stupid | stupidity |
| 6 | superman | genious |
| 7 | batman | mob!le |
| 8 | admin | admin |
| 9 | admin1 | admin1 |
| 10 | admin2 | admin2 |
| 11 | admin3 | admin3 |
| 12 | dhakkan | dumbo |
| 14 | admin4 | admin4 |
+----+----------+------------+
13 rows in set (0.001 sec)

LIMIT

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
MySQL [security]> SELECT * FROM users LIMIT 0,1;  #演示1
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | Dumb | Dumb |
+----+----------+----------+
1 row in set (0.001 sec)

MySQL [security]> SELECT * FROM users LIMIT 4,1; #演示2
+----+----------+-----------+
| id | username | password |
+----+----------+-----------+
| 5 | stupid | stupidity |
+----+----------+-----------+
1 row in set (0.001 sec)

MySQL [security]> SELECT * FROM users LIMIT 4,3; #演示3
+----+----------+-----------+
| id | username | password |
+----+----------+-----------+
| 5 | stupid | stupidity |
| 6 | superman | genious |
| 7 | batman | mob!le |
+----+----------+-----------+
3 rows in set (0.001 sec)

if判断

select if(1>2,2,3); # 真就返回第二个参数假就返回第三个参数

结果=3

1
2
3
4
5
6
7
MySQL [security]> select if(1>2,2,3); 
+-------------+
| if(1>2,2,3) |
+-------------+
| 3 |
+-------------+
1 row in set (0.001 sec)

用于时间盲注

regexp正则查询函数

语法

1
select "数据" regexp '查询匹配';

例如

1
2
3
4
5
6
7
MySQL [security]> select "aaabbbccc" regexp 'b'; # 里面有b他就返回了1
+------------------------+
| "aaabbbccc" regexp 'b' |
+------------------------+
| 1 |
+------------------------+
1 row in set (0.001 sec)

通常我们用在布尔盲注里面

union 操作符

union操作符是用于,并合两个或者多个select语句的结果
注意,union内部的 select语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 select语句中的列的顺序必须相同
默认情况,union操作符选取不同的值。如果允许重复的值,请使用 union ALL.

下面是查询user_id和first_name

但是我要是添加上 union语句后面就可以在执行一个查询的语句了

但是我要是添加上 union语句后面就可以在执行一个查询的语句了

注入的常用的函数

select system_user(); 系统用户名

select user();   当前数据库用户名

select current_user();   当前用户名

select session_user(); 连接数据库的用户名

select version(); 数据库版本

select @@datadir; 数据库路径

select @@basedir; 数据库安装路径

select version();   数据库版本

select @@global.version_compile_os; 操作系统的信息

1
2
3
4
5
6
7
MySQL [(none)]> select @@global.version_compile_os;
+-----------------------------+
| @@global.version_compile_os |
+-----------------------------+
| Win64 |
+-----------------------------+
1 row in set (0.001 sec)

select @@version_compile_os; 操作系统的信息

select database(); 返回当前使用的数据库

在这里插入图片描述

count() 返回运行结果的数量

image-20211228174318004

concat() 叫我们的内容进行连接起来

可以看见下面的结果叫我们的abc和def进行了连接

image-20211228174722963

我们在注入查询到时候通常会下面这样做,结果会输入到一起

image-20211228175023543

concat_ws() 叫我们的内容进行连接起来

可以看见上面concat()中间连接没有缝隙的concat_ws()是可以添加分隔符的

image-20211228175353626

group_concat() 叫结果输入成一行

image-20211228175636534

load_file() 读取本地文件

image-20211228180624830

查询是否有写入的权限

下面的Value说明

Value 列说明
NULL 不允许导入或导出
/tmp 只允许在 /tmp 目录导入导出
不限制目录
1
2
3
4
5
6
7
8
9
10
11
12
MySQL [mysql]> show global variables like '%secure_file_priv%';
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 5
Current database: mysql

+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| secure_file_priv | |
+------------------+-------+
1 row in set (0.012 sec)

在 MySQL 5.5 之前 secure_file_priv 默认是空,这个情况下可以向任意绝对路径写文件

在 MySQL 5.5之后 secure_file_priv 默认是 NULL,这个情况下不可以写文件

into outfile 写文件可以写入多行数据,并且字段和行终止符都可以作为格式输出。

image-20211228181201769

into dumpfile 写文件只能写一行,并且输出中不存在任何格式

select ascii() ; 返回字符的ASCII值

image-20211228181658892

select char() ; #他和ascii()是相反的,数字对应字符

image-20220106104117285

select ord(); 返回第一个字符的ASCII值

image-20211228181841904

select mid(‘字符串’,从哪,到哪); 指定返回字符串的,类似切片

image-20211228182452380

select substr(‘字符串’,从哪,到哪); 和上面的一样

select substring() 截取字符串

1
2
3
4
5
6
7
mysql>  select SUBSTRING('abce',3);
+---------------------+
| SUBSTRING('abce',3) |
+---------------------+
| ce |
+---------------------+
1 row in set (0.00 sec)

select length() 返回字符串的长度

image-20211228182734436

select left() 指定返回从左边开始长度,类似切片

image-20211228183041604

select floor() 返回整数,这个不四十五路

image-20211228183254512

select rand() 生成0到1随机数

image-20211228183527014

extractvlue()

updatexml()

select sleep() # 设置语句执行暂停几秒

select strcmp(); # 比较字符串的大小

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
MySQL [dvwa]> select strcmp('a','b');
+-----------------+
| strcmp('a','b') |
+-----------------+
| -1 |
+-----------------+
1 row in set (0.001 sec)

MySQL [dvwa]> select strcmp('b','a');
+-----------------+
| strcmp('b','a') |
+-----------------+
| 1 |
+-----------------+
1 row in set (0.001 sec)

MySQL [dvwa]> select strcmp('a','a');
+-----------------+
| strcmp('a','a') |
+-----------------+
| 0 |
+-----------------+
1 row in set (0.001 sec)

MySQL [dvwa]>

select ifnull(参数1,参数2); # 如果参数1不是null就返回参数1,如果参数1是null就返回参数2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
MySQL [dvwa]> select ifnull(4,6);
+-------------+
| ifnull(4,6) |
+-------------+
| 4 |
+-------------+
1 row in set (0.001 sec)

MySQL [dvwa]> select ifnull(null,6); # 这个是null就返回6
+----------------+
| ifnull(null,6) |
+----------------+
| 6 |
+----------------+
1 row in set (0.001 sec)

MySQL [dvwa]> select ifnull(0,6);
+-------------+
| ifnull(0,6) |
+-------------+
| 0 |
+-------------+
1 row in set (0.000 sec)

select exp(参数); # 返回参数的几次方

CONCAT_WT()是叫函数连接起来

sql注入方法在我的笔记
5.手动漏洞挖掘,sql注入

查看information_schema库

sql的查询的操作

功能名称 查询语句
查库 select schema_name from information_schema.schemata
查表 select table_name from information_schema.tables where table_schema=’库名’
查列 select column_name from information_schema.columns where table_name=’列名’;
查数据 select 列名 from 库名.表名
1
2
3
4
5
6
7
8
9
10
如数据库名,数据库的表,表栏的数据类型与访问权限等。
再简单点,这台MySQL服务器上,到底有哪些数据库、各个数据库有哪些表,
每张表的字段类型是什么,各个数据库要什么权限才能访问,等等信息都保存在 information_schema里面。

information_schema的表schemata中的列schema_name记录了所有数据库的名字
information_schema的表tables中的列table_schema记录了所有数据库的名字
information_schema的表tables中的列table_name记录了所有数据库的表的名字
information_schema的表columns中的列table_schema记录了所有数据库的名字
information_schema的表columns中的列table_name记录了所有数据库的表的名字
information_schema的表columns中的列column_name记录了所有数据库的表的列的名字

查看以下所有的mysql里面就肯定有个明叫information_schema的库

SHOW DATABASES; //查看数据库

在这里插入图片描述

进入information_schema的库
命令use information_schema
查看information_schema的库的表

tables

tables存储数据库中的表信息(包括视图),包括表属于哪个数据库,表的类型、存储引擎、创建时间等信息。SHOW TABLES FROM XX; 命令从这个表获取结果。

1、查看一下表tables中的全部列

在这里插入图片描述

​ 查看以下information_schema的库里面的tables表里面的东西非常的多
在这里插入图片描述

2、查看以下information_schema的库里面的tables表里面的table_name记录了所有数据库的表的名字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
MySQL [information_schema]> select table_name from tables;
+---------------------------------------+
| table_name |
+---------------------------------------+
| CHARACTER_SETS |
| COLLATIONS |
| COLLATION_CHARACTER_SET_APPLICABILITY |
| COLUMNS |
| COLUMN_PRIVILEGES |
| KEY_COLUMN_USAGE |
| PROFILING |
| ROUTINES |
| SCHEMATA |
下面结果太多

USER_PRIVILEGES 表

COUNT()函数

COUNT()函数是用来统计数量的
用法

1
COUNT(列名)

在这里插入图片描述

使用COUNT()函数
统计数量
在这里插入图片描述

load_file()函数

load_file()函数读取一个文件并将其内容作为字符串返回
列/etc/passwd文件

1
select load_file('/etc/passwd');

在这里插入图片描述
sql注入方法在我的笔记
5.手动漏洞挖掘,sql注入

魔术引号开关

判断数据库或表是否存在

  1. 判断数据库存在, 则删除:

    1
    drop database if exists db_name;
  2. 判断数据表存在, 则删除:

    1
    drop table if exists table_name;
  3. 如果单纯显示是否存在数据库, 则可用

    1
    show databases like '数据库名';   
  4. 单纯显示是否存在数据表, 则可用

    1
    show tables like '数据表名';