基於 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秘鑰即可。