Shikata Ga Nai

Private? There is no such things.

A $$$ worth of cookies! | Reflected DOM-Based XSS | Bug Bounty POCを訳してみた

Hello there, ('ω')ノ

 

$$$相当のクッキー! | | 反映された DOM ベースの XSS | バグ報奨金 POCを。

 

脆弱性

 DOMXSS

 

記事:

 https://medium.com/@haroonhameed_76621/a-775-worth-of-cookies-reflected-dom-based-xss-bug-bounty-poc-3e7720c78fbe

 

今回は Synack Red Team の QR ベースのターゲットで。

 

脆弱性分析:

主な焦点は、https://redacted.com であるメイン ドメインにあったため。

サブドメインの列挙は行わず、ジューシーな JavaScript ファイルを探し始めて。

幸いなことに、次の JavaScript を見つけた 2 つの。

興味深い JavaScript ファイルを見つけて。

 

function:

code: function(e) {
                    var a = e.car,
                        t = e.articleUuid,
                        i = e.returnPath,
                        u = e.moreInfoData,
                        m = e.currentUser,
                        o = m.canPrint,
                        d = void 0 === o || o,
                        E = m.canBookmark,
                        b = void 0 === E || E,
                        f = a.uuid,
                        h = i ? "Search Results" : "Car";
                    return l.createElement("div", null, l.createElement("div", {
                        className: "viewer-header"
                    }, l.createElement("div", {
                        className: "car-form-container"
                    }, l.createElement("div", {
                        className: "article-toolbar-container"
                    }, l.createElement("div", {
                        className: "page-width article-toolbar"
                    }, l.createElement(l.Suspense, {
                        fallback: l.createElement("div", null)
                    }, l.createElement(s, a)), l.createElement("ul", {
                        className: "back-to-search-ul"
                    }, l.createElement("li", {
                        className: "back-to-search-results"
                    }, l.createElement("a", {
                        className: "button",
                        href: i || "/car/" + f + "/search"
                    },

 

このコードは、React アプリケーションで car viewer コンポーネントを。

レンダリングするために使用され。

このコンポーネントは、車の詳細のほか、検索に戻るボタンや。

ユーザが特定のアクションを実行できるツールバーなど。

その他の情報を表示して。

 

「a」タグの href 属性が適切にサニタイズされていない場合は。

このコードで DOM ベースの XSS が可能になり。

ユーザ入力が適切にサニタイズされていない場合は。

悪意のあるコードが実行される可能性があり。

DOM ベースの XSS 攻撃が可能になって。

 

2 番目の JavaScript ファイルで、Reflected DOM-Based XSS の。

適切なソースとシンクを見つけて。

以下はソースとシンクで。

 

Source:

document.addEventListener("DOMContentLoaded", (function() {
            var e = document.getElementById("search-application-container")
              , t = JSON.parse(e.getAttribute("state")) || window.initialState;
            a.render(r.createElement(rr, t), e)

 

この Source は、DOM で React コンポーネントを。

レンダリングするために使用され。

ID「search-application-container」を持つ要素から状態を解析し。

React コンポーネントに渡して。

次に、コンポーネントが要素にレンダリングされます。

 

Sink:

l.createElement("a", {
                        className: "button",
                        href: i || "/car/" + f + "/search"
                    }

 

DOM 関数 l.createElement は HTML タグ a を作成し。

その属性値を HTML href 属性に設定し。

これは、ユーザが制御できる returnPath パラメータで。

 

JavaScript コードを理解すると、returnPath パラメータからユーザ提供の入力を。

取得し、それを DOM 別名シンクで実行することが明確にわかり。

そこで、次の JavaScript ペイロードを使用して。

 

 javascript:alert(document.domain)

 

 

Best regards, (^^ゞ