web-dev-qa-db-ja.com

ファイル「Shell.php.jpg」はphpファイルとして実行できますが、「Shell.jpg」は実行できないのはなぜですか?

[〜#〜] dvwa [〜#〜] を使用してファイルアップロードの脆弱性について学習しています。

Webサイトのセキュリティレベルを高に上げた後、Webサイトはポストリクエストのコンテンツタイプとファイル拡張子の両方をチェックするため、バイパスするためにファイル拡張子を.jpgに変更し、Burpプロキシを使用してファイル名をShell.php.jpgからShell.jpgに順に変更しましたシェルを実行します。

changing filename with burp

できます。私が理解していないのは、それが機能する理由です。私は、最も右側のファイル拡張子パターンのみがファイル拡張子として扱われることを読みました。つまり、Shell.php.jpg.jpgファイルとして扱われるべきであり、それはそのように扱われ、アップロードは成功します。

しかし、ファイル拡張子が同じで、Shell.jpgの部分がファイル名の一部にすぎない場合、.phpファイルではなく、このファイルを実行できるのはなぜですか?

root @ kali#weevely http://10.0.2.4/dvwa/hackable/uploads/Shell2.php.jpg yuval 
 
 [+] weevely 3.7.0 
 
 [ +]ターゲット:[email protected]:/ var/www/dvwa/hackable/uploads 
 [+]セッション:/root/.weevely/sessions/10.0.2.4/Shell2.php_0.session 
 [+]シェル:システムシェル
 
 [+]ファイルシステムを参照するか、コマンドを実行してターゲットへの接続を開始します
 [+]。詳細については、:helpと入力してください。
 
 weevely> id 
 [-] [channel]リモートスクリプトの実行によりエラー500がトリガーされ、スクリプトとペイロードの整合性を確認します
 uid = 33(www-data)gid = 33(www-data)groups = 33(www-data)
 [email protected]:/ var/www/dvwa/hackable/uploads $ 

Shell.php.jpgという名前のファイルが期待どおりに動作する例。

root @ kali#weevely http://10.0.2.4/dvwa/hackable/uploads/Shell.jpg yuval 
 
 [+] weevely 3.7.0 
 
 [+]ターゲット:10.0.2.4 
 [+]セッション:/root/.weevely/sessions/10.0.2.4/Shell_1.session

[+]ファイルシステムを参照するか、コマンドを実行するターゲットへの接続
 [+]。詳細については、:helpと入力してください。
 
 weevely> id 
 [!] [terminal]バックドア通信に失敗しました。URLの可用性とパスワードを確認してください

同じファイルがShell.jpgという名前で期待どおりに機能しない例。

2
Yuval

Shell.php.jpgは.jpgファイルとして扱われるべきです

DVWAを探索しているので、すべてのである必要はありませんisを意味します。推測する必要がある場合、アップロードスクリプトはファイルの拡張子を適切にチェックして許可しますが、Webサーバーは同じ方法でチェックせず、実行を許可します。

詳細については、Webサーバー(nginxまたはApache)の構成ファイルを調べて、リクエスト処理のためにphpパーサーへのハンドオーバーを実行するブロックを探してください。

明確化:

しかし、ファイル拡張子が同じで、Shell.jpgの部分がファイル名の一部にすぎないのに、なぜ.phpファイルではなく、このファイルを実行できるのでしょうか。

拡張子はファイル名の単なる文字であり、Webサーバーがファイルを処理する方法を決定するのではなく、Webサーバーが決定します。一般的なアルゴリズムの1つは次のとおりです。

If the requested file name ends with “php”
    Invoke php to handle the request
Else
    Serve the requested file like any other static file
End

あなたのケースではrequested file name ends with “php”requested file name contains “.php”に変更されていると思います。このルールは、リクエストを処理しているウェブサーバーの構成ファイルで確認できます。

更新:

これは、Apacheの予想され、文書化された動作です。私は少し驚いていますが、これは私たちが住んでいる世界です。

構成ファイル/etc/Apache2/mods-enabled/php.confAddHandler php5-cgi .phpは、.phpファイルのハンドラーを登録します。 AddHandlerが行うこと を読んでいない限り、すべてがOKです。

拡張引数は大文字と小文字を区別せず、先頭にドットを付けても付けなくても指定できます。 ファイル名には複数の拡張子がある場合があり、拡張子引数はそれらのそれぞれと比較されます。

すごい…うん。もちろん、ファイル名には複数の拡張子が付いている場合があります。これが唯一の論理的なデフォルトです。

ファイルに拡張子が1つしかないことを期待している変人の場合、Apache 答えがあります

ファイル名の最後のドットで区切られた部分のみを特定のメタデータにマッピングする場合は、Add *ディレクティブを使用しないでください。

彼らは、1つの拡張性というあなたの奇妙な願望への解決策を参考にしてくれます。したがって、.phpファイルのみをphpとして実行するには、php.confのAddHandlerディレクティブを次のように置き換える必要があります。

<FilesMatch "[^.]+\.php$">
  SetHandler php5-cgi
</FilesMatch>

結論として:

  • ソフトウェアには常識が存在しない
  • ユーザーから提供されたデータを決して信頼しない
  • 必要に応じて元のファイル名をデータベースに保存し、アップロード後に名前を変更します
  • ファイル名をライブ爆弾のように扱う
7
Andrew Morozko