BUUCTF之[GYCTF2020]Blacklist #
handler语句 #
HANDLER 是 MySQL 中用于直接访问表存储引擎接口的语句,类似于文件操作:
-- 打开表
HANDLER table_name OPEN [AS alias];
-- 读取数据
HANDLER table_name READ FIRST; -- 读取第一行
HANDLER table_name READ NEXT; -- 读取下一行
HANDLER table_name READ {索引名} {操作};
-- 关闭表
HANDLER table_name CLOSE;
与union的对比 #
handler的优势 #
- 不需要知道列数,即不需要
order by来查询 - 不受
select限制,如果select被ban了也能查询到数据 - 访问数据更灵活,可以精确控制读取到哪一行
注入过程 #

首先测试一下是什么类型的注入,输入1'报错,即为字符型注入。

然后测试了1' order by 3,没有这一列,测试order by 2则通过。
尝试经典的联合查询注入,结果回显:

回显了waf,select等查询字符被过滤。大概率是堆叠注入。然后测试show语句,输入1';show databases;#,回显:

确认是堆叠注入,也能看到这些数据库名。然后看一下当前数据库的数据表,输入1';show tables;#,回显:

此时很明显了,flag就在这。然后查一下FlagHere这个表的字段,输入1';show columns from FlagHere;#,回显:

此时我们需要查询到flag字段里面的数据,这时就可以用上面讲到的handler语句来获取数据,输入1';handler FlagHere open;handler FlagHere read first;handler FlagHere close;#,即可回显flag。
总结 #
一般来说如果是有回显的SQL注入,而select之类的查询语句又被ban了,很大可能是堆叠注入。这可能需要对数据库有更深的理解,有机会的话还是可以再多学习一点数据库的知识。