Shikata Ga Nai

Private? There is no such things.

DOM-Based XSS for fun and profit $$$! | Bug Bounty POCを訳してみた。

Hello there, ('ω')ノ

 

DOM ベースの XSS は楽しくて利益も得られますを。

 

脆弱性:

 DOM ベースXSS

 

記事:

 https://medium.com/@haroonhameed_76621/dom-based-xss-for-fun-and-profit-bug-bounty-poc-f4b9554e95d

 

今回は、https://redacted.comというメインドメインにあり。

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

幸運なことに、興味深い2つのJavaScriptファイルを見つかって。

 

function saveRegion(regionId, forceReload) {//Save selection
    customer_RegionId = regionId;

    $.ajax({
        type: 'POST',
        url: "/Unauthenticated/SaveRegion",
        data: {
            regionId: regionId
        },
        success: function (response) {
            setCookie('RegionId', regionId, 1);
            $('#select-region-modal').modal('hide');
            var url = getParameterByName('url');
            if (url != null && url != '') {
                createCookie('UAPathway', 'Start', 1);
                setTimeout(function () {
                    window.open(url, '_self');
                }, 1000);

 

上記のコードでは、認証されていないユーザが「Save Region」をクリックすると

Ajaxリクエストが送信されて。

 

Ajaxリクエストは、XMLHttpRequestオブジェクトを使用して

Webサーバと非同期にデータを交換するHTTPリクエストで。

これにより、完全なページの再読み込みなしで動的なWebページの更新が

可能になって。

 

POSTタイプのリクエストは、

/Unauthenticated/SaveRegionエンドポイントに送信され、

このコードは選択したregionId(regionIdは関数に渡されるパラメータ)を

クッキーに保存し、

ページを再読み込み(または指定されたURLにリダイレクト)し。

そして、ユーザのパスウェイ(UAPathway)に値「Start」のクッキーを設定して。

 

上記のコードはDOMベースのXSSの脆弱性を持っていて。

攻撃者が「url」パラメータに悪意のあるJavaScriptを注入できれば、

そのコードがページ上で実行され。

コードは「getParameterByName」関数を使用して「url」パラメータの値を取得し、

それが「window.open」関数で使用されて。

 

ソースコード:

function getParameterByName(name, url = window.location.href) {
name = name.replace(/[
]/g, '\$&');
var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),
results = regex.exec(url);
if (!results) return null;
if (!results[2]) return '';
return decodeURIComponent(results[2].replace(/+/g, ' '));
}

 

このJavaScriptコードでは、「getParameterByName()」という関数が

使用されていて。

この関数はURLからパラメータを取得するために使用され、

攻撃者は「url」パラメータを操作することでウェブサイト上で

悪意のあるコードを実行することができて。

 

 window.open(url, '_self');

 

以下は、document.domainやdocument.cookieなどのDOM要素にアクセスし、

JavaScriptコマンドを実行するために使用できるデモンストレーションペイロードの

いくつかで。

 

JavaScriptコードを理解した後、

ユーザが提供する「url」パラメータから入力を受け取り、

DOM(sink)で実行されることが明確になり。

したがって、次のJavaScriptペイロードを使用して。

 

 javascript:alert(document.domain)

 javascript:alert(document.cookie)

 

 

Best regards, (^^ゞ