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秒)的就好了。