検証のために画像をアップロードするセクションがあります。高いスコアは抜け穴を見つけるのに役立ちます。

WBOY
リリース: 2016-06-13 13:48:07
オリジナル
907 人が閲覧しました

画像アップロード検証用のコードがあり、抜け穴を見つけるのに役立ちます
私の小さな Web サイト http://hitaow.sinaapp.com にコードが含まれています。 PHP イメージのアップロードの確認。ハッカーが抜け穴があると言っています。抜け穴を見つけるのを手伝ってください。見つかったらポイントを獲得します。


if (is_uploaded_file($_FILES['upfile']['tmp_name'])){

$upfile=$_FILES["upfile" ];

$name = $upfile["name"];
$type = $upfile["type"];
$size = $upfile["size"];
$tmp_name = $upfile["tmp_name"];
$error = $upfile["error"];

switch ($type) {
case 'image/jpg' : $ok= 1;
ブレーク;
ケース 'image/jpeg' : $ok=1;
ブレーク;
ケース 'image/pjpeg' : $ok=1;
ブレーク;
case 'image/gif' : $ok=1;
ブレーク;
case 'image/png' : $ok=1;
ブレーク;
case 'image/x-png' : $ ok=1;
Break;
}
}
?>

if($ok && $error=='0'){
move_uploaded_file($tmp_name,'../img/index/'.$name);
echo "画像アップロードに成功しました
";
}

if(is_uploaded_file($_FILES['upfile']['tmp_name']) && $ok!=1){
echo "画像のアップロードに失敗しました。アップロードされた画像は jpg jpeg gif png 形式である必要があります!
";
}

このコードには抜け穴があるとも思います。この検証を回避するにはどうすればよいですか?見つけるのを手伝ってください。

-----解決策--------------------------------
悪魔の酸素を見てください。

作者: Lao Wang

最悪の方法は、タイプを検出するために $_FILES[...]['type'] を使用することです。アップロードされたファイルの拡張子を変更するだけで偽装できるためです。

もう 1 つの比較的安全な方法は、ファイルの最初の 2 バイトの内容に基づいてアップロードされたファイルのタイプを判断することです。コード例は次のとおりです。

01 $handle = fopen( $_FILES[. ..]['tmp_name'], 'rb');
02 $content = fread($handle, 2);
03 fclose($handle);
04
05 $info = unpack('c2chars', $content);
06
07 if (empty($info['chars1']) || empty($info['chars2'])) {
08 exit( 'エラー!');
09 }
10
11 if ($info['chars1'] < 0) {
12 $info['chars1'] += 256;
13 }
14 if ($info['chars2'] < 0) {
15 $info['chars2'] += 256;
16 }
17
18 $ code = $info['chars1'] . $info['chars2'];

興味がある場合は、「バイナリ データの処理」を参照してください。 Pack() と unpack( ) を使用した PHP

注: オンラインで検索された関連プログラムのほとんどは、256 の関連操作を実行しません。これは、実験データに基づいて私が想像した TDD の結果です。正しいかどうかは読者自身が判断してください。

スイッチを使用して、ファイル タイプに対応する $code 変数を決定します。一般的な画像タイプの結果は次のようになります:

GIF: 7173
JPG: 255216
PNG: 13780

もちろん、他のファイルタイプも自分で実験して判断することができます。ただし、最初の 2 バイトの内容も偽造される可能性があるため、この方法は必ずしも安全であるとは限りません。そのため、誤って解析されないようにファイル拡張子を制限することをお勧めします。たとえば、foobar ファイルという名前のファイルを作成します。内容は次のとおりです:

GIF89


最初の 2 バイトを使用してファイル タイプの時間を検出すると、結果は GIF: 7173 になります。シェルで file コマンドを使用して検出したとしても、GIF 画像と誤認されます:

# file foobar.php
foobar.php: GIF画像データ 16188 x 26736

拡張子が .php であるため、このファイルは php エンジンによって解析され、ハッカーに Web シェルが与えられ、セキュリティが不可能になります。したがって、ファイル拡張子を制限することが非常に重要です。覚えておいてください。この種の偽装を検出する方法としては、次のシェル コマンドを使用してフィルタリングするのが最も簡単です。

# strings foobar.php | grep -i "

このような危険を完全に防ぎたい場合は、gd、imagemagick、graphicsmagick などのツールを使用して、アップロードされた画像に必要な編集を行うことを検討できます。ユーザーを削除してから、埋め込みコードを削除できるようにします。より安全にしたい場合は、画像サーバーも分離し、PHP をインストールせず、静的ファイルのみを解析する必要があります。

補足: 画像だけを判断する場合は、getimagesize というより簡単なメソッドがありますが、このメソッドは名前から画像のサイズを取得するために使用されますが、結果には画像の種類も含まれます。この方法はドキュメントの GD セクションにまとめられており、GD がインストールされていない場合でも使用できます。ただし、以前と同様、セキュリティの問題にも注意する必要があります。
------解決策------------------
たとえば、画像 1.jpg をアップロードし、その拡張子を 1.php;1.jpg に変更した場合、プログラムは許可されますか? iis6.0 では、修飾された機能サフィックスを PHP として解析できます。ファイルを保存するときに名前を自動的に変更しないと、脆弱性が発生します。
------解決策------------------
実行可能な PHP ファイルを画像ファイルとして偽装することができますが、これは確実にバイパスできます。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!