0x04-SQL注入-盲注

目錄

今日目標

Christmas Special. 正式進入 4 星俱樂部 😄

在這裏插入圖片描述

可以學到什麼?

SQL 盲注

本篇的主題,是 SQL 盲注。先了解一下 SQL 盲注是什麼,再學習如何進行模糊測試,最後獲取到想要的數據。

什麼是 SQL 盲注?

這個系列的前幾篇,如果大家還記得的話,在我們構造 SQL 表達式去試探服務端的時候,服務端會直接將 SQL 數據庫的錯誤返回給我們。我們可以清楚地看到後端使用的是什麼數據庫,我們構造的 SQL 語句哪裏有問題,是語法有誤?還是 UNION 的時候列數不對。

在這裏插入圖片描述

SQL 盲注,相反的就是服務端的錯誤處理是統一的頁面,諸如最簡單的,只給我們返回一個 500 Internal Server Error,無從知道後端數據庫的任何信息。這樣的情況下,做 SQL 注入仍然是可行的,只是困難一些。我們必須要構造一些 true or false 的問題去問數據庫,根據數據庫的返回結果,進一步判斷下一步操作。

只要目標是可以被注入的,那麼只要加以一定的耐心,仔細觀察返回結果,以及一點點的運氣,就可以完成盲注。

如何詢問數據庫?

基於返回內容

考慮有這樣一種情形,我想要獲取數據庫中 user_id = 1 的用戶的密碼。由於前端做了錯誤的統一處理,我無法知道我注入的 SQL 語句執行成功與否。

雖然說錯誤是統一處理了,如果我的 SQL 執行出錯,我將得不到任何有用的信息。那我要做的,就是構造能夠正確執行的 SQL 即可。只要後端沒有返回錯誤,說明我的 SQL 執行成功。

可以構造如下的 SQL 去探測數據庫返回。

xyz' UNION SELECT CASE WHEN (user_id= '1' and SUBSTRING(user_password, 1, 1)  == CHAR(50)) THEN NULL ELSE 1/0 END FROM users--

拆解說明一下:

  • CASE 打開一個條件,如果條件爲 true,返回 then 的內容,否則返回 else 的內容 CASE Function 文檔
  • SUBSTRING 方法三個參數分別是 string, start_pos, len,取出來的子字符串包含 start_pos SUBSTRING Function 文檔
  • CHAR(50) 是可打印字符 ‘2’ 在 SQL 數據庫中可以使用 print CHAR(50) 的方式打印 ASCII 字符 詳見文檔CHAR Function 手冊
  • 如果截取的第一個字符等於字符 ‘2’,那麼什麼都不執行 (null)一切正常,頁面不會變動;反之,則執行 1/0,服務端報錯

這就是基於返回內容的盲注操作方式。就像前面所說,盲注需要耐心,這個 SQL 表達式中,還需要我們猜測 user 表名。如果管理員使用了非默認列名,比如 id 一列叫 customer_id, password 一列叫 customer_pass,那麼這個 SQL 照樣都不成功。

不過原理纔是最重要的。

基於返回時間

另一種情形,錯誤處理很絕,如果是 SQL 錯誤,一律什麼返回都沒有,那麼就連執行正確或者錯誤都不知道。

這樣的情況下可以採用另一種基於返回時間的方式。

原理是如果條件成立,執行某個操作一定的次數,這個次數要足夠大,能讓數據庫處理上一定的時間,讓我們可以感知到頁面返回的時間差異。

看下面這個 SQL。

xyz’ UNION SELECT IF(SUBSTRING(user_password,1,1) = CHAR(50),BENCHMARK(5000000,ENCODE('MSG','by 5 seconds')),null) FROM users WHERE user_id = 1;

拆解說明一下:

  • BENCHMARK 方法的參數 loop_time, expr,也就是執行 expr loop_timeBENCHMARK Function 文檔
  • ENCODE 參數 str_to_encode, encode_with_str 用第二個字符串加密第一個字符串 ENCODE Function 文檔
  • 只要該用戶的密碼的第一位是字符 ‘2’,那麼就執行加密 5000000 次,頁面返回會有明顯的延遲;否則,頁面返回無延遲

這就是基於返回時間的盲注操作方式。

最後建議大家一定閱讀一下 OWASP 和 Portswigger 關於 Blind SQL Injection 的文章,也別是 Portswigger 那篇,十分詳細。

OWASP Blind SQL Injection

Portswigger Blind SQL Injection

這裏還有一篇 SQL Injection Chettsheet

如何利用這個漏洞?

本次練習中,我們要完成的挑戰是訂購已經被刪除的產品。也就是頁面上怎麼也不會出現的產品。

首先,頂部搜索產品的輸入框是有注入漏洞的,也就是 URL 上的 q 參數。

在這裏插入圖片描述

其實這是個半盲注的練習,後端還是會返回錯誤信息的,而且很詳細。

用 Burp Suite 攔截搜索請求,發送到 Repeater。測試一下常規的注入。

'--

後端報錯

在這裏插入圖片描述

看右邊紅框中的 SQL 語句,有兩個括號。那就構造一個 SQL 讓後端返回所有的產品,這所有的產品,也就包括了被刪除的商品。

嘗試如下 SQL

'))--

後端返回了所有產品,包括有 deletedAt 屬性的被刪除產品。

在這裏插入圖片描述

已經找到被刪除的商品了,下一步就是怎麼添加到購物車。

用任何用戶身份,登陸到應用。攔截一下添加正常商品到購物車的請求。將這個請求發送到 Repeater。

在這裏插入圖片描述

記住這裏的 BasketId,後面做一次請求,修改 ProductId 爲被刪除的商品,即可完成添加。這裏我的 BasketId1

找到 id10 的商品,該商品是被刪除商品。

在這裏插入圖片描述

添加商品到購物車。修改 ProductId10,在再次發送請求即可。

在這裏插入圖片描述

這是被刪除商品。

在這裏插入圖片描述

點擊 Checkout 即可完成挑戰。

在這裏插入圖片描述

在這裏插入圖片描述


參考鏈接:

  • https://owasp.org/www-community/attacks/Blind_SQL_Injection
  • https://portswigger.net/web-security/sql-injection/blind
  • https://www.w3schools.com/sql/func_mysql_substring.asp
  • https://dev.mysql.com/doc/refman/8.0/en/information-functions.html
  • https://www.w3resource.com/mysql/encryption-and-compression-functions/encode().php
  • https://www.mssqltips.com/sqlservertip/6022/sql-server-char-function-and-reference-guide/
  • https://docs.microsoft.com/en-us/sql/t-sql/functions/char-transact-sql?view=sql-server-ver15
  • https://portswigger.net/web-security/sql-injection/cheat-sheet
  • https://www.w3schools.com/sql/func_mysql_case.asp
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章