はい
以前の PHP バージョンでは、ファイルのアップロードはおそらく次のコードを通じて行われていました:
偽造は不可能になったのでしょうか?多くのスクリプトでは、初期化部分に @extract($_POST) などの操作があり、レジスタ グローバルがオフになっている環境でもプログラムが実行し続けることができるようになっています。そのような環境では $ を簡単に偽造できます。 _FILES 配列は、元の $_FILES 配列を上書きすることもできますが、is_uploaded_file() と move_uploaded_file() を節約することはできないため、$_FILES 配列を完全に偽装することは依然として非常に困難です。
しかし、Windows の PHP 環境でテストすると、PHP の一時ファイルは C:WINDOWS TEMPPHP93.tmp という形式で、アップロード時のファイル名は C:WINDOWSTEMPPHPXXXXXX.tmp になることがわかりました。つまり、今回アップロードされた一時ファイル名が C:WINDOWSTEMPPHP93.tmp の場合、次回は一時ファイル名 C:WINDOWSTEMPPHP94.tmp になります。ファイル名が通常のものになります。
しかし、現在のファイル名が何であるかわからない可能性があります。たとえば、一時ファイルを許可なくディレクトリにコピーしたり、ターゲットファイルにファイルシステムで禁止されている文字を含めたりした場合、これが漏洩する可能性があります。 , もちろん、エラー抑制処理がなければ、現在の一時ファイル名が漏洩します。
では、is_uploaded_file() と move_uploaded_file() を省略するにはどうすればよいでしょうか? PHPのuploaded_files関数部分のコードを見てください:
<ol class="dp-xml"> <li class="alt">PHP<span>_FUNCTION(is_uploaded_file) </span> </li> <li><span>{ </span></li> <li class="alt"><span>zval **path; </span></li> <li><span>if (!SG(rfc1867_uploaded_files)) { </span></li> <li class="alt"><span>RETURN_FALSE; </span></li> <li><span>} </span></li> <li class="alt"><span>if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &path) != SUCCESS) { </span></li> <li><span>ZEND_WRONG_PARAM_COUNT(); </span></li> <li class="alt"><span>} </span></li> <li><span>convert_to_string_ex(path); </span></li> <li class="alt"><span>if (zend_hash_exists(SG(rfc1867_uploaded_files), Z_STRVAL_PP(path), Z_STRLEN_PP(path)+1)) { </span></li> <li><span>RETURN_TRUE; </span></li> <li class="alt"><span>} else { </span></li> <li><span>RETURN_FALSE; </span></li> <li class="alt"><span>} </span></li> <li><span>} </span></li> </ol>
現在のrfc1867_uploaded_filesハッシュテーブルから検索して、現在のファイル名が存在するかどうかを確認します。このうち、rfc1867_uploaded_files は、現在の PHP スクリプト実行プロセス中にシステムと PHP によって生成されたファイル アップロードに関連する変数とコンテンツを保存します。存在する場合は、指定されたファイル名が今回実際にアップロードされたことを意味し、存在しない場合はアップロードされていないことを意味します。
PHP の非常に奇妙な機能は、アップロード フォームを送信すると、ファイルは PHP が処理する前に一時ディレクトリにアップロードされ、PHP スクリプトが終了するまで破棄されないことです。つまり、$_FILSE 変数を受け入れない PHP スクリプトにそのようなフォームを送信した場合でも、$_FILSE 変数は生成され、ファイルは最初に一時ディレクトリにアップロードされます。問題が発生します。次のスクリプトは、この問題を示している可能性があります:
<ol class="dp-xml"><li class="alt"><span><span class="tag"><</span><span> ? </span></span></li><li><span>$</span><span class="attribute">a</span><span>=$_FILES['attach']['tmp_name']; </span></li><li class="alt"><span>echo $a.”………….”; </span></li><li><span>$</span><span class="attribute">file</span><span>=’C:\WINDOWS\TEMP\</span>PHP<span>95.tmp’; </span></li><li class="alt"><span>echo $file; </span></li><li><span>if(is_uploaded_file($file)) echo ‘………………Yes’; </span></li><li class="alt"><span class="tag">?></span><span> </span></span></li></ol>
ここで、C:WINDOWSTEMPPHP95.tmp は、私が推測した一時ファイルの名前です。このスクリプトをテストするとき、1 つまたは 100 個のファイルをアップロードする必要がありました。そのうちの一時的なファイル名は C:WINDOWSTEMPPHP95.tmp です。この時点でスクリプトに抽出操作がある場合、$_FILES 変数を簡単に偽造できます。
そうですよね? $_FILES 変数の偽造の役割は何なのかを知りたいかもしれません。PHP はアップロードを処理する際に、元のプログラムで許可されていないファイル名を生成することができます。元のファイルに対して、basename() と同様の操作が実行されます。名前は、一度偽造できます。後は、ファイル名に「ああ../ああ」などを簡単に追加できます。好きなものを付けてください
PHPのuploaded_files関数の実際の使い方は、少し厳しいかもしれませんが、結局のところ、それは PHP の欠陥です (笑)。
http://www.bkjia.com/PHPjc/446081.html