PHPプログラムのよくある脆弱性をどうやって攻撃しますか?


[ライブラリファイル]
前に議論したように、include()とrequire()は主にコードライブラリをサポートするためです。私たちは通常、いくつかのよく使う関数を独立したファイルに置いています。この独立したファイルはコードライブラリです。その中の関数が必要なときは、このコードライブラリを現在のファイルに含めるだけでいいです。
最初に、人々はPHPプログラムを開発して発表する時、コードライブラリとメインプログラムコードを区別するために、コードバンクファイルのために「.inc」の拡張子を設定しますが、彼らはすぐにこれが間違っていることを発見しました。このようなファイルはPHP解釈器に正確にPHPコードに解析されません。このようなサーバー上のファイルを直接要求すると、このファイルのソースコードが得られます。これはPHPをAppacheのモジュールとして使用する場合、PHP解釈器はファイルの拡張によって名来でPHPコードに解析するかどうかを決定します。拡張子はサイト管理者が指定しています。一般的に「.php」です。 “.php 3と「.php 4」です。重要な構成データが適切な拡張子のないPHPファイルに含まれていると、遠隔攻撃者はこれらの情報を入手しやすいです。
最も簡単な解決方法は、各ファイルにPHPファイルの拡張子を指定することで、ソースコードの漏れを防ぐことができますが、新たな問題が発生しました。このファイルを要求することにより、攻撃者はコンテキスト環境で実行するべきコードを独立して実行させることができます。
以下は明らかな例である。
In main.php:
<?php
  $libDir = "/libdir";
  $lang Dir = "$libdir/langagems";
  ...
  include("$libdir/loadlangage.php")

In libdir/loadlangage.php:
<?php
  ...
  include(「$lang Dir/$userLang」);

「libdir/loadlangage.php」が「main.php」によって呼び出されるとかなり安全ですが、「libdir/loadlangage」は「.php」の拡張子を持つので、遠隔攻撃者はこのファイルを直接要求することができ、「langDir」と「USerLang」の値を任意に指定することができます。
[セッションファイル]
PHP 4または更新されたバージョンはsessionsのサポートを提供しています。その主な役割はPHPプログラムにページとページの間の状態情報を保存することです。例えば、ユーザーがログインしてウェブサイトにアクセスすると、彼はこの事実にログインし、誰がこのサイトにログインしてもsessionに保存されています。彼はウェブサイトの中をあちこち見ていると、すべてのPHPコードはこれらの状態情報を得ることができます。
実際に、一つのセッションが開始されると(実際にはプロファイルで最初の要求時に自動起動するように設定されています)、ランダムな「セッション」が生成されます。 ID」は、リモートブラウザがいつも要求を送信する時にこの「session」を提出します。 ID」をつけると、セッションはずっと保持されます。これはCookieによって容易に実現できます。各ページにフォーム変数を提出することによってもいいです。 実現する。PHPプログラムはセッションで特殊な変数を登録できます。その値はPHPスクリプト毎の終了後にsessionファイルが存在します。PHPスクリプト毎の開始前に変数にロードされます。以下は簡単な例です。
<?php
  session_destroy(); // Kill any ダタ currently in the セッション
  $session_auth = "shun";
  session_レジスターauth"); // レジスター $session_auth as a. セッション variable

新しいバージョンのPHPは自動的に「$session_」を押します。authの値は「shun」に設定されていますが、それらが修正されると、以降のスクリプトは自動的に修正された値を受け取ります。これは無状態のウェブにとっては素晴らしいツールです。しかし、私たちも注意すべきです。
一つの明確な問題は変数が確かにsessionから来ていることを確保することです。例えば、上記のコードを与えて、もし後続のスクリプトが次のような場合:
<?php
  if (!empty($session_)auth)
   // グラント access ト シンプル here

上のコードを仮定したら、$session_authが置かれると、sessionからではなく、ユーザーから入力して位置を置くことになります。攻撃者がフォーム入力で位置を設定すれば、サイトへのアクセス権を得ることができます。注意攻撃者はこの変数をセッションに登録する前にこの攻撃方法を使用しなければなりません。変数がセッションに入れられると、どのフォーム入力も上書きされます。
Sessionデータは一般的にファイルに保存されています。(位置は配置可能で、一般的には「/tmp」です。)セッション ID>」の形式では、このファイルには変数名、変数タイプ、変数値、その他のデータが含まれています。マルチホストシステムでは、ファイルはWebサーバを実行するユーザID(一般的にはnobody)として保存されているので、悪意のあるサイト所有者は、sessionファイルを作成することによって他のサイトへのアクセスを得ることができ、sessionファイル中の感度情報を確認することもできる。
Sessionメカニズムも攻撃者に自分の入力をリモートシステムのファイルに保存するためにもう一つの便利なところを提供しています。上記の例では、攻撃者はリモートシステムにPHPコードを含むファイルを置く必要があります。ファイルを利用してアップロードできない場合、彼は通常sessionを利用して変数に自分の意思で値を与えます。そしてsessionファイルの位置を推測します。彼はファイル名が「php」ですので、カタログを推測するだけで、目次は一般的に「/tmp」です。
また、攻撃者は任意に「セッション」を指定できます。 id(例えば「hello」)を使って、この「session」を使います。 id」はsessionファイルを作成します。hello),「session」 idはアルファベットと数字の組み合わせしかできません。
[データタイプ]
PHPは分散を比較するデータタイプを持ち、変数のタイプはそれらのコンテキスト環境に依存する。例えば、「hello」は文字列変数で始まり、値は「」ですが、値を求めると整形変数「0」になります。これは思いがけない結果を招く場合があります。「$hello」の値が「000」か「0」かが違っていたら、empty()の戻りは本物ではない。
PHPの配列は関連配列であり、つまり配列の索引は文字列型である。これは「$hello[000]」と「$hello[0]」も違います。
プログラムを開発する時は、上の問題をよく考えなければなりません。例えば、ある変数が「0」かどうか、別のところでempy()を使って検証するべきです。
[エラーしやすい関数]
私たちはPHPプログラムのバグを分析する時、ソースコードを入手できれば、間違いやすい関数リストが必要です。これらの関数のパラメータを遠隔的に変えることができれば,その中の脆弱性を発見する可能性が高い。以下は詳細なエラーが発生しやすい関数のリストです。
<PHPコード実行>
require():指定されたファイルの内容を読み、PHPコードとして説明します。
include():同上
eval():与えられた文字列をPHPコードとして実行します。
preg_replace():「/e」スイッチと一緒に使用すると、置換文字列はPHPコードと解釈されます。
<コマンド実行>
exec():指定されたコマンドを実行し、実行結果の最後の行に戻ります。
指定コマンドを実行し、結果をクライアントブラウザに返します。
指定コマンドを実行して、すべての結果を行列に返します。
system():同じpassthruですが、バイナリデータは処理しません。
popen():指定されたコマンドを実行し、PHPファイル記述子に入力または出力を接続する
<ファイル漏洩>
fopen():ファイルを開き、PHPファイルの記述子に対応します。
readfile():ファイルの内容を読み取り、クライアントブラウザに出力します。
file():ファイル全体の内容を一つの配列に読む
このリストはまだ完全ではありません。例えば、メールなどの命令も実行可能ですので、自分で補充してください。
[PHPの安全性の強化について]
上で紹介した全ての攻撃はデフォルトに設置されたPHPに対してです。 4はよく実現できますが、何回も繰り返しました。PHPの配置は非常に柔軟で、PHPオプションを設定することによって、私達は完全に一部の攻撃に抵抗することができます。以下は実現の難しさによっていくつかの構成を分類しました。
*難易度が低い
*中低難易度
**の難易度は高いです
****は難易度が高いです
上の分類は個人の見方ですが、もしPHPが提供するすべてのオプションを使ったら、PHPは安全です。第三者のコードであっても、多くの機能が使えなくなります。
**** 「レジェンド」を設定しますglobalsは「off」です。
このオプションは、PHPがユーザー入力のためにグローバル変数を作成することを禁止します。つまり、フォーム変数「hello」を提出すると、PHPは作成されません。 ハロー」は、「HTTP_」だけを作成します。GET/POST_VRS[’ハロー’]”。これはPHPの中で極めて重要なオプションです。このオプションをオフにすると、プログラミングに大きな不便を与えます。
**** 「safe_」を設定しますmodeはonです
このオプションを有効にすると、以下の制限が追加されます。
1.    どのコマンドが実行されますか?
2.    どの関数が使用できるかを制限します。
3.    スクリプトの所有権とターゲットファイルの所有権に基づくファイルアクセス制限
4.    ファイルアップロード禁止機能
これはISPにとって大きなオプションであり、PHPの安全性も大幅に改善されます。
** 「open_」を設定しますbasedir
このオプションは、指定されたディレクトリ以外のファイル操作を禁止し、ローカルファイルまたはリモートファイルの攻撃を効果的にキャンセルすることができますが、ファイルのアップロードとsessionファイルの攻撃には注意が必要です。
** 「display_」を設定しますerrorsはoffで、「log_」を設定します。errorsはonです
このオプションは、エラーメッセージをウェブページに表示せずにログファイルに記録することを禁止しています。これは攻撃者のターゲットスクリプトに対する関数の検出を防ぐ効果があります。
* 「allow_」を設定しますクルクルfopenはオフです
このオプションはリモートファイルの機能を禁止できます。
はい、文章はここまでです。他の関連情報を知りたいなら、原文を参考にしてください。http://www.securereality.com.au/studyinscarlet.txt。