Blind SQL injection with conditional errors

Lab: Blind SQL injection with conditional errors | Web Security Academy

這一次不像上一題Blind SQL injection with conditional responses,上一題如果邏輯錯誤會使得網頁上的welcome back消失,所以不管邏輯對錯都無法從網頁上看出端倪,只能強制觸發error(比如500 internal server error)來辨別。

step 1: (準備工作)

按Access the lab以後,進入以下網頁:

接下來把下圖的intercept設成on後,再去點上圖的Gifts。

這時會發現burp的畫面如下圖所示,而注入點是在下圖三角形處,以後所有的語句都是貼在三角形那,也就是W後面。

step 2: (漏洞測試)

首先先來個SQL語句' AND 1=2--,雖然預期會是error,但依然像下圖那樣回200 OK。所以想利用邏輯上的false是不行的,要利用conditional false。

step 3: (攻擊語句測試 1)

SQL語句:

' AND (SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE NULL END FROM dual) = '1'--

語句來源:

SQL injection cheat sheet | Web Security Academy

語句解析:

直接先挑上圖第一句。當然,是不是orcale,其實也要花些功夫去偵測。

SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE NULL END FROM dual

代表的是如果1和1是相等,就會回傳TO_CHAR(1/0),否則回傳NULL。

當然1和1相等沒錯,所以回傳TO_CHAR(1/0),整句的語句會變成

' AND TO_CHAR(1/0) = '1'--

那再來關注1/0,因為0當分母不合理,所以1/0會出現錯誤,把它TO_CHAR後也一樣是個錯誤,所以整句不成立,網頁會出現status 500,這種利用條件裡的語法錯誤即為conditional false。

執行結果:

step 4: (攻擊語句測試 2)

SQL語句:

' AND (SELECT CASE WHEN (1=2) THEN TO_CHAR(1/0) ELSE NULL END FROM dual) = '1'--

語句解析:

SELECT CASE WHEN (1=2) THEN TO_CHAR(1/0) ELSE NULL END FROM dual

代表的是如果1和1是相等,就會回傳TO_CHAR(1/0),否則回傳NULL。

1和2不相等,所以回傳NULL,整句的語句會變成

' AND NULL = '1'--

這時沒有錯誤,所以網頁會出現status 200

執行結果:

知道了這一點,就可以把WHEN()括號裡的東西換成我們的條件式。

step 5: (正式攻擊語句)

SQL語句:

' AND (SELECT CASE WHEN (SUBSTR((SELECT password from users WHERE username='administrator'),1,1)='0') THEN TO_CHAR(1/0) ELSE NULL END FROM dual) = '1'--

語句解析:

先看WHEN()括號裡的東西:

SUBSTR((SELECT password from users WHERE username='administrator'),1,1)='0'

這是指administrator的password第一個字是不是0。

再看AND ()括號裡的東西:

SELECT CASE WHEN (SUBSTR((SELECT password from users WHERE username='administrator'),1,1)='0') THEN TO_CHAR(1/0) ELSE NULL END FROM dual

這是指如果WHEN裡面的東西如果成立,則回傳TO_CHAR(1/0),否則回傳NULL。

再看整句:

因為administrator的password第一個字不是0,所以會回傳NULL,所以整句變成' AND NULL = '1',因為沒觸發到TO_CHAR(1/0)這個語法錯誤的式子,所以還是會回200 OK。

執行結果:

step 6: (攻擊語句暴力枚舉)

而接下來就可以猜密碼裡每個字是什麼了。我們需要枚舉第n個字是不是26個字母或是10個數字的其中之一,如果確定第n個字是什麼字,應該status會出現500。

需要送到intruder做暴力破解。上圖的畫面按右鍵後會出現以下畫面,按下圖紅底線處:

下圖的1-5是操作順序。先把1的那個字反白,按add \$;接下來再把3的那個字反白,再按add \$;接下來是把attack type改成下圖的,才能一次設定剛剛反白的兩個變數。

首先設定第一個變數,它是指password的第幾個字,所以設定如下。下圖payload settings的to的值設成20,當然第一次做不確定是幾個字,可以設多一點,反正到時看結果時只要看status 500就好。

第二個變數是26個英文字母跟數字:

接下來就可以按上圖右上角的start attack來開始猜密碼。

可以從上圖看到是先固定第二個變數,然後第一個變數先跑。上圖反藍處代表password第3個字是a。

當然這樣找很慢,可以按上圖紅圈處,讓status照大小排:

Blind SQL injection with time delays

Lab: Blind SQL injection with time delays | Web Security Academy

這一題很單純,就是只要DELAY10秒就可以了。官方提供的cheat sheet如下:

SQL injection cheat sheet | Web Security Academy

一個一個試過以後,可以發現只有PostgreSQL可以延遲10秒,不過不能直接把上面照貼,要稍微加工一下。

step 1:

跟上一題step 1一樣,按access the lab進入網站後,先把intercept開啟:

step 2:

再去點網頁裡的refine your search下面的其中一個:

step 3:

一樣把網頁的request送到repeater,並把語句插入到下圖紅底線所示的游標的後面:

step 4:

問題是要插入什麼語句。如果直接照貼' SELECT pg_sleep(10)是不行的。

最後試出來是

'||(SELECT pg_sleep(10)) --

||是連接的意思,比如說A||B就是AB。注意,不能用+號代替。

Blind SQL injection with time delays and information retrieval

Lab: Blind SQL injection with time delays and information retrieval | Web Security Academy

這一題是上一題的進階版。要利用time delay來判斷密碼的每個位置是哪個字,所以是要符合條件式後才能sleep 10秒。

先看看cheat sheet:

SQL injection cheat sheet | Web Security Academy

問題是底線處要換成什麼條件式。不過其實已經看過這條件式很多次了,就是:

SUBSTR((SELECT password from users WHERE username='administrator'),1,1)='0'

再重新解釋一次,這條件式的意思就是administrator的第1個字(第一個粗體)是不是0(第二個粗體)。

所以整個完整語句是:

SELECT CASE WHEN (SUBSTR((SELECT password from users WHERE username='administrator'),1,1)='0') THEN pg_sleep(10) ELSE pg_sleep(0) END

但是現在要可以注入,所以前後還要加一點東西:

'||(SELECT CASE WHEN (SUBSTR((SELECT password from users WHERE username='administrator'),1,1)='0') THEN pg_sleep(10) ELSE pg_sleep(0) END)--

第一個字元是單引號,應該算是注入必備。接下來是||,這比較難解釋;然後最後面加個--,功用是註解掉後面語句。

接下來就可以仿造Blind SQL injection with conditional errors這一題的step 6,去建構兩個變數後開始猜密碼。開始猜的時候,記得要先選下圖左邊紅圈,才會顯示請求的時間。

按一下上圖右邊紅圈後,可以把時間照大小排,就只要看超過10000(10秒)的就好了。


#blind sql injection: with conditional errors #blind sql injection: 攻擊語句暴力枚舉、類for loop #burp suite: 類for loop #blind sql injection: time delays #blind sql injection: 利用time delays猜密碼







Related Posts

[ 筆記 ] JavaScript 進階 06 - Closure

[ 筆記 ] JavaScript 進階 06 - Closure

一看就懂的 React 開發環境建置與 Webpack 入門教學

一看就懂的 React 開發環境建置與 Webpack 入門教學

從使用者的角度來看,什麼是 API ?

從使用者的角度來看,什麼是 API ?


Comments