javascriptファイルを分析すると、リモートでコードが実行される可能性がありますか?
今日のブログでは、JavaScriptファイルを分析することで、無制限のエンドポイントにアクセスする方法と、アプリケーションがそれをどのように処理するかを理解する方法を紹介します。また、ASP.NETアプリケーションでRCEを取得するために、2つのファイルアップロードエンドポイントをバイパスする方法についても説明します。
まず、これはプライベートプログラムだったので、target.comで参照します。
エンドポイントの検索:
アプリケーションを数時間試した後、「Taking a Short Break」というメッセージが表示されるサブドメインを見つけました。これは、ディレクトリのファジングを開始するのに良い兆候であることを意味します。

エラーコード403Forbiddenページを返すエンドポイントが見つかるまでディレクトリをファジングし始めました。エンドポイントを除い/tools
て、ログインページが表示され、管理者専用だと思いました。見てみましょう。
デフォルトのクレデンシャルでサインインしようとしましたが、成功しませんでした。
通常、ログインできないログインパネルを見つけたら、資格情報の漏洩、APIキー、非表示のエンドポイントなどがある可能性があるため、javascriptファイルを確認します。
Webアプリケーションの大部分はjavascriptファイルを難読化するため、これらのファイルがどのように、何をするのかを理解するのは時間の無駄になりますが、ブラウザーの検索機能を利用していくつかの機能を検索できます。
、、、などapi
を検索しようとします。また、AjaxおよびXMLリクエストも検索しようとします。secret
token
admin
そして、このログインパネルが管理者向けであることを確認するエンドポイントをいくつか見つけました。

これらのエンドポイントをすべてチェックしたところ、空の応答/path/to/assetmain.aspx
が返されました。ただし、これを除いて、白いページとインポートされたCSSファイルとjavascriptファイルが返されます。特に、これらのファイルの名前が関連するものを示しているため、これらのファイルについて詳しく見ていきましょう。アップロードに。

最初のファイル(xproupload.js)を分析します。
xproupload.jsから始めて、私はこの混乱を見つけました。

分析しやすいように、オンラインのjavascriptビューティファイアを使用することにしました。
このファイルは+550行のコードだったので、重要なオブジェクトと関数のみに焦点を当てます。

465行目からバックエンドアップロード関数を処理する関数に到達するまでこのファイルを分析しました。オブジェクト「o 」が宣言され、 473行目で開始されたAjaxリクエストのリクエスト本文として準備され、次の要素が含まれています(パラメーター):
- フォルダ→アップロード先のディレクトリ。
- thefile →ファイル名とその内容を持つパラメータ。
- currentFilter →後の分析からの空の文字列だけで、それは必要ありません。
- getRS → getAKrs関数からの戻り値、それが何であるかはまだわかりませんでした。また、このファイルには同じ名前の関数がないため、後で他のjavascriptファイルを検索します。
- akap →javascriptでは、値!0は「true」を意味します。

また、379行目にいくつかのアップロードルールがあり、そのうちの1つが許可されたファイル拡張子であることに気付くかもしれません。
2番目のファイル(xprofile.js)を分析します。
このファイルには多くの機能があるので、重要なオブジェクトと機能だけに焦点を当てます。

新しいハンドラープロパティが追加されたことに加えて、同じアップロードルールがここでも宣言され、それらは異なるエンドポイントから呼び出されました
- _fileHandler → filemgn.ashx
- _rsHandler → fileUtility.ashx
burp suiteを使用してこのリクエストを送信しようとしましたが、結果はリクエストごとにランダムな文字列でした。このコードは、動的CSRFトークンと同じように、サーバーに送信されたすべてのリクエストを検証できると思います。

これで、ファイルをアップロードするために必要なすべてのパラメーターとその値がここにあります。テキストファイルをアップロードして、ファイルをアップロードする権限があるかどうか、または管理者としてログに記録する必要があるかどうかをテストしましょう。また、リクエスト本文のエンコーディングをmultipart/form-data;
サーバーに変更しました。ファイルを受信する準備をします。

いいですね、うまくいきました!また、応答により、ファイルがアップロードされたディレクトリが表示され、/assets
ディレクトリの下にあります。チェックしてみましょう。

良さそうです。シェルをアップロードするには、アプリケーションの拡張ホワイトリストをバイパスする必要があります。これはASP.NETアプリケーションであることに注意してください。
二重拡張、ヌルバイトなどの既知のすべての方法でバイパスしようとしましたが、機能しませんでした。また、 ASP.NETやexeなどのMicrosoftサーバーアプリケーションで機能するすべての可能な構成と実行可能拡張で試行しました。bat、configなどですが、運がありません。
xprofile.jsファイルに戻って、このアップロードを活用できる他の機能があるかもしれません。
このファイルで使用されているAjaxリクエストの数に注意を払いました。ある種のファイルマネージャーで処理するために送信されたものがいくつかあり、 getFiles、deleteFile、createFolderなどの関数があり、これらの関数の1つが呼び出されます。renameFile !、そしてファイルの名前変更は絶対に必要なものです!

この関数を確認すると、これは_fileHandler(filemgn.ashx)に送信されるAjaxリクエストであり、 4つのパラメーターが必要です。
- fn→そしてそれは「rename_file」 文字列値を取ります。
- getRS → getAKrs関数からの戻り値。
- akap → as mentioned above, it is just a “true” value.
- param → takes the value of the “t” variable, which was declared as an array in line 131, and was assigned with three values in line 132.
A few minutes later, and since the parameter param was meant to be sent as an array of 3 elements, I finally found that:
- The 1st param[] was the directory that contained the file we want to rename.
- The 2nd was for the new name.
- The 3rd was for the current file name.

Nice!, I also tried to change the file extension to a NOT allowed one, like aspx, and it works as well, so let’s upload a malicious file!
I used cmd.aspx but changed it to cmd.txt and uploaded it, then changed its name to testshell.aspx, then I navigated to the file.

My baby uploaded successfully, and I can now run commands on the system!
Report Timeline:
25 Mar: Submitted.
28 Mar: Triaged.
29 Mar: Bounty Rewarded.

Digging More:
I got interested to know what’s behind this code, especially the filtration that was implemented on the file extension, so as we have the privilege to write commands on the server, I started to read this part of the code inside the fileUtility.aspx file, and here is what I found

The application converts the file extension to lowercase and then filters all executable files, and I realized it can not be exploitable without finding the rename function, but in the same file, I found something related to uploading a zip file that took my attention!

As you can see in line 126, it checks for two main things:
- If the last 4 characters on the filename are “.zip”
- 抽出要求パラメーターの値。


ろ過せずに抽出しますか?
- はい!さあ行こう!
同じシェルファイルを使用しましたが、今回はそれをZipアーカイブに追加し、簡単なPythonスクリプトを作成してアップロードし、 true値を使用してextractパラメーターを追加します。
それではブラウザで確認してみましょう

正常にアップロードされた2番目のベビーシェルを見てください!

新しいレポートを提出したかったのですが、とにかくサーバーが閉鎖されました。楽しんで読んでいただければ幸いです。フィードバックがあれば喜んでいます。