解题步骤
![](https://i-blog.csdnimg.cn/blog_migrate/06568422791e181afe84358b83512df0.png)
拿到题目输入1后发现id=‘1’可以得出题目类型为字符型注入,直接通过order by 进行判断数据一共有几列,但是因为第一次做字符型注入的题目所以用了错误的注入方式
原因(自己理解的):在字符型注入中传的值是用‘’单引号括起来的,其中的数据如果不为数值类型就会出错,为了让后注入的语句正常回显,就需要在1之后添加‘单引号使其与前面的单引号发生闭合,不影响我们的注入语句
原语句:select *from news where id='1'
改变后:selece * from news where id='1''
但是因为注入了单引号就会使语句多了一个单引号,造成报错,无法正常回显,还需在之后添加一个注释符将多的引号给注释掉
selece * from news where id='1' --+ '(注释符)
![](https://i-blog.csdnimg.cn/blog_migrate/7e9438bd3bd90292c4e6fae45f5defc2.png)
正常回显,知道order by 3之后无回显,说明一共包含两个字段,利用union联合查询
![](https://i-blog.csdnimg.cn/blog_migrate/2a7e6ee4b2a2c8cc490e1041f6bfa730.png)
利用联合查询语句 select * from news where id='1' union select 1,2 将2代替为database()查询所在数据库名称
![](https://i-blog.csdnimg.cn/blog_migrate/b12eac6bba633d52f7db8673a74aa6d6.png)
这里页面没有变化是因为只显示了联合查询的第一行内容,我们需要更改id的传值使第二行内容显示在页面上,可以更改为id='-1'或者id='1' and 1=2 都行,只要让联合查询union左边的数据判断为假就可以使第二行的数据代替第一行显示出来 。得知数据库名称为sqli
![](https://i-blog.csdnimg.cn/blog_migrate/6520c2edfeb354d146a3909dc071d8fe.png)
现在开始利用数据库名称查询,其中包含的所有表名称
再来复习一下,information_schema数据库是mysql自带的数据库,里面包含了很多信息,其中的schemata、tables、cloumns表中储存量了所有数据库、表和字段信息,可以通过这些将我们想要的信息显示出来。
group_concat(table_name) from informtion_schema.tables where table_schema='sqli'
翻译过来就是
在information_schema数据库的tables 表中查询sqli数据库包含的所有表有哪些,并将表名称组合成一行,表名之间用逗号隔开。
![](https://i-blog.csdnimg.cn/blog_migrate/2017d48cf76319c6e826519aee49da9f.png)
找出两个表,之后查询flag表中的所有字段名称在information_schema数据库的columns表中查询flag表所包含的字段名称
![](https://i-blog.csdnimg.cn/blog_migrate/61ce4d30ade9cc5c484a8c58ebf15bd2.png)
查找到flag表中一共包含了一个字段,字段名为 flag,继续查询flag字段里面的所有数据
知道了数据库名称和表名称就可以直接查询利用 数据库名称.表名称 结构获取到flag。
![](https://i-blog.csdnimg.cn/blog_migrate/ac427a84dec4ab961e3ae05318c51645.png)
注意:复制flag时注意不要多复制空格,多个空格会造成flag错误,提交失败。
总结
与前面整数型的题目差距不大,只是需要注意引号闭合的问题
有了先前的经验,做起来相对轻松,很快就完成了靶场练习
虽然很快就完成了,但也让我理解到这只是SQL注入中的初级入门题目,还需加强学习