通过sql注入得到flag
题目:http://ctf5.shiyanbar.com/423/web
打开题目:
先随便输了些数字,发现只有1、2、3查询结果
接下来进行第一步测试
输入一个带单引号的数据,目的是测试是否存在注入点,输入1’发现报错,说明此处存在注入点。且后台代码应该是一般的seletc语句,可以通过开闭合单引号来进行注入。
输入1 and 1=1发现id后显示1 1=1说明存在过滤。
第二步关键字过滤
看到过滤,就随便输了些语句,发现空格、union、select等等的语句关键词都被过滤了,测试时我发现输入1’select’,会报错,而输入1’select '不会,说明select关键词是否被过滤,与其后面的空格有关,那么我们只需要绕过这个空格过滤就可以了
第三步空格过滤
绕过空格过滤的方法有很多:+、%0a、%0b、/**/等等,这里我用的是最后一种 。
开始注入
1、数据库名
在报错时就可以看到是MYSQL,因此用database()来获取当前数据库名
输入:
1'union/**/select/**/database()'
我们能够得到数据库名为web1
2、表名
在MYSQL中有一张表information_schema,该表存储了MYSQL服务器中的所有信息,那么接下来就要用得到的数据库名web1去查其中的表
输入:
1‘union/**/select/**/table_name/**/from/**/information_schema.tables/**/where/**/table_schema/**/=’web1
发现关键词被过滤了
既然过滤关键词之后的空格不管用,那应该是针对关键词的,那我们可以用关键词嵌套关键词的方法绕过,比如说and会被过滤,那我们用aandnd,这样第2、3、4个字母就会被过滤,剩下的就是and,就成功绕过了。
那就输入:
1' union/**/select/**/table_name from/**/information_schema.tables/**/where/**/table_schemtable_schemaa/**/='web1
就可以看到表名
flag这个表应该就是我们的目标
3、段名
一样的思路,用表名查字段
输入:
1'union/**/select/**/column_nacolumn_nameme/**/from/**/information_schema.columinformation_schema.columnsns/**/where/**/table_name='flag
得到两个字段flag和id,很明显,我们要的应该是flag字段
4、flag
直接查看flag字段的内容
输入:
1' union/**/select/**/flag from/**/flag where/**/'1'='1
就得到flag了