Hello there, ('ω')ノ
ファイル名の操作により、webshell がアップロードされましたを。
脆弱性:
無制限のファイルアップロード
任意のファイル書き込み
記事:
今回は、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, (^^ゞ