思路:
依据常见的判断注入的方法,判断是数字型注入还是字符型注入。
利用 1’ and 1=1# 结果回显,1’ and 1=2# 结果不回显; 得出结论:字符型注入。
然后下边就是字符注入的常见思路了:
通过利用单引号闭合后,引入自己的代码,实现:
- 判断有表中有几个字段 order by
eg: order by 3 根据第三列字段排序
输入 1’ order by 1~4 # 可以显示数据,而1’ order by 5#不行,说明有四列字段
- 试探有哪些字段会被在前端使用放到界面显示(判断回显),
说明4个字段都被回显,而且也知道了对应字段所回显的位置
注: select 1,2,3,4 返回的就是1 2 3 4
select 1,2,3,4 from 某表 返回该表的内容,只不过所有内容都被1,2,3,4替换
例如:
- 当前数据库名查询, 利用database()函数
- 查询当前数据库里有哪些表,查询表中的字段名,查询表中某个字段的内容。
以mysql为例,所有数据的信息都存储在mysql自带的information_schema数据库中
information_schema有有很多表,这道题中我们用到两个,columns表和tables表
columns表存储着所有列的名字,以及其所在的表命,所在的数据库名
tables表中存储着所有表名,以及该表所在的数据库的名字
所以,我们通过database()获得数据库名为skctf,然后在information_schema数据库的tables表中找到skctf的所有表名,并把它们放到一行显示(这里要用到group_concat函数)
0' union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema='skctf' #
可知,skctf数据库中有两个表 fl4g,sc
然后,在information_schema的columns表中,找出fl4g表的所有字段,并把它们放在一行显示。
0' union select 1,2,3,group_concat(column_name) from information_schema.columns where table_name='fl4g' #
可知,有一个字段,名字为skctf_flag
最后一步就是查询fl4g表种的skctf_flag字段的值,刚好该表只有一条记录,所以直接查询即可
0' union select 1,2,3,skctf_flag from fl4g #