基於 burpsuite的web邏輯漏洞插件開發(來自JSRC安全小課堂,柏山師傅)


 

基於 burpsuite的web邏輯漏洞插件開發

     BurpSuite 提供了插件開發接口,支持Java、Python、Ruby語言的擴展。雖然 BApp Store 上面已經提供了很多插件,其中也不乏優秀好用的插件。

推薦幾個個人感覺好的插件CO2,Logger++,Autorize,XSS Validator

      但是通用化的工具無法完全符合web安全測試人員的特定需求。
本節我和大家探討,如何根據實際需求自己開發出提高安全測試效率的插件。
      本次課程主要是從以下四個方面展開

 

 

 1.為什么要獨立開發插件

      隨着廠商安全意識增強,傳輸過程中,大多數線上業務通過https傳輸,傳輸流量加密。無法做中間人攻擊了就服務端,數據庫中的敏感數據加密存儲,訪問控制受限,即使拿到數據庫也無法拿到明文數據。但是數據在客戶端最終要展示給用戶,必然明文展現。

    傳統的安全防御設備和措施對邏輯漏洞收效甚微,現在攻擊者更傾向於在客戶端利用此類漏洞。而邏輯漏洞種類很多,通用化的工具無法完全符合web安全測試人員的特定需求。一個業務的邏輯漏洞抽象出來的模型,難以在其他業務層進行批量處理,通用的解決方案往往效果不佳。(但是一個業務層抽象出來的模型,在其自身站點往往具有通用性。)

    例如,某URL存在越權,可能該站點其他URL也可能存在類似的問題。我們基於該URL特征,開發burpsuite插件,批量掃描該站點,就能更全面的發現同類問題。

2. 開發環境配置

Burp支持Java、Python、Ruby語言的擴展,本次講座以python環境為 例進行說明。Burpsuite 是運行在java環境,所有的庫是java所寫。Python作為開發語言,調用Java庫就要用到Jython。

 Burpsuite Jython環境的配置

Extender -> options -> python Environment -> select file,導入下載好的jython jar包。

 

 

 3.插件開發關鍵接口的使用實例

    API接口查閱可以從以下拿到:
API接口文檔可以在burpsuite 的Extender -> APIs 
也可以通過https://portswigger.net/burp/extender/api/index.html進行查閱。

     IBurpExtender
IBurpExtender是Burpsuite插件的入口,所有插件的開發都必須要實現。當插件被建立以后,registerExtenderCallbacks也需要實現。

代碼如下:class BurpExtender(IBurpExtender):
def registerExtenderCallbacks(self, callbacks):

參數callbacks可獲取核心基礎庫,例如日志,請求,返回值修改等。IBurpExtenderCallbacks: 這個接口幾乎是必備的。在插件編寫的過程中會經常用到。

    IExtensionHelpers: 
提供了編寫擴展中常用的一些通用函數,比如編解碼、構造請求、獲取請求參數,獲取請求頭等。如:IRequestInfo analyzeRequest(byte[] request)
通過analyzeRequest函數,可以拿到請求的細節。

通過如下幾個接口方法可以拿到

 

 

 IHttpRequestResponse: 這個接口包含了每個請求和響應的細節。在Brupsuite中的每個請求或者響應都是IHttpRequestResponse實例。通過getRequest(), getResponse()方法可以獲取請求和響應的細節信息。

以registerHttpListener為例進行代碼說明:

    如圖所示,在user 和 webserver之間建立監聽,調用HttpListener接口。獲取請求,響應的日志。

 

 

 實現這個功能,最重要的是這個方法:
# register ourselves as an HTTP listener
callbacks.registerHttpListener(self)

def registerExtenderCallbacks(self, callbacks):

        self._callbacks = callbacks
        self._helpers = callbacks.getHelpers()
        ## 設置插件名
        self._callbacks.setExtensionName("getTheRequest")

# //如果沒有注冊,下面的processHttpMessage方法是不會生效的。處理請求和響應包的插件,這個應該是必要的

        callbacks.registerHttpListener(self)

### processHttpMessage(int toolFlag, boolean messageIsRequest, IHttpRequestResponse messageInfo),
### 在messageInfo這個參數中,我們可以獲取到request和response日志。

 def processHttpMessage(self, toolFlag, messageIsRequest, messageInfo):
        if toolFlag == 4:
            if not messageIsRequest:
                request = messageInfo.getRequest()
                analyzedRequest = self._helpers.analyzeResponse(request)
                request_header = analyzedRequest.getHeaders()

                try:
                    method, path = res_path.findall(request_header[0])[0]
                    host = res_host.findall(request_header[1])[0]
                    url = method + " " + host + path
                except:
                    url = ""

                if method == "GET":
                    print “[+++++]The URL is ", url
                    print "[+++++]The host is ",host
                    print "[++++] The URI is following"
                    print path
                    for iterm in path.split("/"):
                        print iterm
                    print 

代碼如上所示,就可以打印出URL,HOST,URI日志信息

 

 

    如果做掃描類插件:
class BurpExtender(IBurpExtender,IScannerCheck)
callbacks.registerScannerCheck(this);


    實現IScannerCheck后需要重寫被動掃描的函數。
doPassiveScan(IHttpRequestResponse baseRequestResponse) {}

doPassiveScan這個接口,在baseRequestResponse獲取請求和響應數據,並利用這些數據進行基於掃描規則進行掃描。

 

   邏輯漏洞檢測插件開發探討

這個插件實現的基本功能是:確定哪些cookie有效cookie,可以基於這些URL,生成字典,進行目錄爆破

首先,我們需要拿到requests 的 cookie

request = messageInfo.getRequest()
            analyzedRequest = self._helpers.analyzeResponse(request)
            requestHeaders = analyzedRequest.getHeaders()

            newHeaders = dict()
            cookies = dict()

            for header in requestHeaders:
                header = header.encode('utf-8')
                if "HTTP/" not in header and "Host" not in header and "Cookie" not in header:

                    header_item = header.split(": ")
                    newHeaders[header_item[0]] = ": ".join(header_item[1:])

                if header.lower().startswith("cookie"):

                    rawCookie =  header.strip("Cookie: ")

                    for item_cookie in rawCookie.split("; "):
                        key = item_cookie.split("=")[0]
                        value = "=".join(item_cookie.split("=")[1:])
                        cookies[key] = value
                lengthList = {}
                for key,value in cookies.items():
                    tempcookie = {}
                    tempcookie[key] = value
                    response = requests.get(url,headers=newHeaders,cookies=tempcookie,verify=False)
                    lengthList[key] = len(response.content)
                if lengthList.keys():
                    print url
                    print lengthList
根據響應長度的不同確定哪些cookie是有效cookie

 

 

 針對DES,AES加密參數的邏輯漏洞挖掘:

AES,DES屬於對稱加密,所以客戶端和服務器端都會有秘鑰存在,也就是說密鑰在客戶端肯定能找到。網頁,微信小程序中,往往在js代碼中就能找到,找到密鑰即可進行邏輯漏洞測試。

在一次對微信小程序滲透測試中,抓包發現訂單ID參數以密文形式進行傳輸。因此,我們需要獲取加密方法。通過反編譯微信小程序包,發現了密鑰,加密方法是DES加密。
這是在一次滲透測試過程中獲取DES秘鑰的截圖;

昨天分享了一下,今題講一些插件的tips

 

 

 ## 代碼編寫獲取訂單ID密文。

 

 

 在burpsuite測試過程:
由於是對訂單ID加密,我們先遍歷明文ID,再對明文Id進行加密,生成字典。再利用burp 的爆破插件,進行爆破即可。

tips:遇到參數加密的情況並不可怕,既然是對稱加密,秘鑰一定能在客戶端拿到。對js代碼進行分析,往往就可以獲取到秘鑰。

# 對消息體進行解析
analyzeRequest= helpers.analyzeRequest(messageInfo); 
# 獲取請求頭
headers= analyzeRequest.getHeaders()
# 獲取參數列表
paraList= analyzeRequest.getParameters();#獲取參數列表,參數分為三種類型,URL中的參數,cookie中的參數,body中的參數。

for para in paraList:
# 這里可以考慮對加密參數進行篩選
key= para.getName() # 獲取參數名
value= para.getValue() # 獲取參數
aesValue = aes.encrypt(value); 
aesValue = URLEncoder.encode(aesvalue); 

遍歷參數,可以對參數名進行過濾,處理需要加密的參數

newPara= helpers.buildParameter(key, aesValue, para.getType()); #構造新的參數                          
updateRequest = helpers.updateParameter(new_Request, newPara); #構造新的請求包
messageInfo.setRequest(updateRequest);//設置最終新的請求包

//如果作為插件開發的話,只需要更改AES秘鑰即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM