[〜#〜] dvwa [〜#〜] を使用してファイルアップロードの脆弱性について学習しています。
Webサイトのセキュリティレベルを高に上げた後、Webサイトはポストリクエストのコンテンツタイプとファイル拡張子の両方をチェックするため、バイパスするためにファイル拡張子を.jpg
に変更し、Burpプロキシを使用してファイル名をShell.php.jpg
からShell.jpg
に順に変更しましたシェルを実行します。
できます。私が理解していないのは、それが機能する理由です。私は、最も右側のファイル拡張子パターンのみがファイル拡張子として扱われることを読みました。つまり、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
という名前で期待どおりに機能しない例。
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.conf
行AddHandler php5-cgi .php
は、.php
ファイルのハンドラーを登録します。 AddHandlerが行うこと を読んでいない限り、すべてがOKです。
拡張引数は大文字と小文字を区別せず、先頭にドットを付けても付けなくても指定できます。 ファイル名には複数の拡張子がある場合があり、拡張子引数はそれらのそれぞれと比較されます。
すごい…うん。もちろん、ファイル名には複数の拡張子が付いている場合があります。これが唯一の論理的なデフォルトです。
ファイルに拡張子が1つしかないことを期待している変人の場合、Apache 答えがあります :
ファイル名の最後のドットで区切られた部分のみを特定のメタデータにマッピングする場合は、Add *ディレクティブを使用しないでください。
彼らは、1つの拡張性というあなたの奇妙な願望への解決策を参考にしてくれます。したがって、.phpファイルのみをphpとして実行するには、php.confのAddHandlerディレクティブを次のように置き換える必要があります。
<FilesMatch "[^.]+\.php$">
SetHandler php5-cgi
</FilesMatch>
結論として: