题目:[GYCTF2020]Blacklist 1
类型:SQL注入
测试
- 这个给的是一个单选框,通过输入的数字会对应返回一个数组,这里有回显的信息,就可以尝试在1的后面加一个’观察闭合的情况。
发现有报错说是存在SQL语法错误,因此可以判断此处存在SQL注入漏洞。 - 接着利用联合注入进行测试
1' union select 1,2,3#
发现存在利用正则写的黑名单,尝试利用大小写,双写等操作均无法成功绕过,因此尝试堆叠注入
堆叠注入
- 先简单解释下堆叠注入的原理:因为mysql数据库中的SQL语句基本上都是以;作为结束的标志的,因此可以通过;作为分割符同时执行多条SQL语句。但是这里需要注意堆叠注入的条件是比较苛刻的,除了基本的存在SQL注入的漏洞、黑名单没有过滤掉;,最重要的是后端代码必须含有如mysqli_multi_query函数类似的可以调用多条SQL语句执行的函数,否则堆叠注入将无法执行。
- 那么我们可以利用简单的语法去尝试查看数据表:
1';show tables;
- 这里成功发现存在一个FlagHere的表,接下来就是爆出其中的列和字段了1’;show columns from FlagHere;
发现列名,但是字段数并没有显示出来,这里由于select被过滤,无法直接读出数据,因此要考虑其他的方法讲数据读出。
Handler命令
- HANDLER语句提供通往表的直接通道的存储引擎接口,可以用于MyISAM和InnoDB表。也就是说Handler命令也可以像select一样进行查询,基本的语法可以参考SQL注入之Handler命令和堆叠注入这篇大佬的文章。
- Handler只需要知道数据表就可以完成字段的获取,构造的payload为1’;Handler FlagHere open;Handler FlagHere read first;Handler FlagHere close;
总结
这题主要考察的是绕过黑名单,当select被过滤之后我们应该考虑其他方法进行查看,这里是利用了堆叠注入,我们需要注意堆叠注入的条件以及当没有select时可以采用Handler命令进行查询