Shikata Ga Nai

Private? There is no such things.

Filename manipulation led to webshell upload!を訳してみた

Hello there, ('ω')ノ

 

ファイル名の操作により、webshell がアップロードされましたを。

 

脆弱性:

 無制限のファイルアップロード

 任意のファイル書き込み

 

記事:

 https://systemweakness.com/uploading-the-webshell-using-filename-of-content-disposition-header-story-59ba87752311

 

今回は、Web サイトの API に関する私の最新の調査結果の 1 つを。

 

サイトについて:

テストしていたサイトは、Linux サーバ上でホストされる。

Web アプリケーションであり、「/files/input」という API を使用して。

ファイルを入力として受け取り、処理して。

 

ユーザがその API にファイルを送信すると、アプリはファイルをサーバ上の。

一時ディレクトリに保存し、サーバーのファイルの状態を追跡するために。

ファイルに一意の GUID を割り当て。


ファイルを API に送信:「/files/input」

 

「/files/status/{guid}」という別の API を使用すると。

ユーザーはプロセスのステータスを確認でき。

テスト中に、(ユーザとして) 自分のファイルの GUID を API に送信すると。

プロセスのステータスを取得するために。

「/files/status/{guid}」ということがわかり。

 

サーバは自分のファイルの正確なアドレスを返し。

サーバ上のファイルであり、サーバ側でファイルが正確にどこに。

保存されているかを知ることは、(攻撃者として)自分にとって良い知識で。


サーバ上のファイルの場所を取得

 

サーバーへの HTML ファイルのアップロードには制限がなかったため。

webshell をサーバに簡単にアップロードできましたが。

一時ディレクトリのアクセス許可が制限されていたため。

ブラウザを使用して Web シェルにアクセスできず。

プロセスのために作成され、プロセスの完了後に削除されて。

 

そこで、外部からアクセス可能で削除されていない別のパスに。

webshell をアップロードできれば素晴らしいと思い。

クローリング中に、サイトのメイン ページのパスがどこにあるのかがわかったので。

外部から webshell にアクセスできるようにする場合は。

サイトのメイン ページがある場所に配置する必要があり。

そこで、サーバに送信する HTTP パケットに変更を加えることにし。

Content-Deposition ヘッダの「filename」引数を次のように変更して。

 

Content-Disposition: form-data; name="file"; filename="webshell.html"
Content-Type: text/html

 

以下のように:

Content-Disposition: form-data; name="file"; filename="../../../opt/main/site/webshell.html"
Content-Type: text/html

 

注:これらの文字「../../../」は、現在の場所 (一時ディレクトリ) から。

 3 つ戻るためのもので。

 サーバのルート ディレクトリ (これは Linux のアドレス指定構文です) にあり。

 サイトのメイン ページの場所である /opt/main/site に webshell を。

 アップロードして。

 

webshell がアップロードされ、外部からアクセスできるようになり。


webshell 

 

このバグには複数の理由があり。

理由の 1 つは、セキュリティで保護されていないコードと。

サニタイズされていない入力が原因で。

おそらくサーバ側に文字列を入力として取り。

文字列の内容をチェックせずに保存する機能があって。

 

Best regards, (^^ゞ