web-dev-qa-db-ja.com

PHP file_get_contentsの脆弱性

クライアントのWebポータルのセキュリティを評価していますが、脆弱性を発見しました。

これはPHPコード:

echo(file_get_contents("template/data/" $_GET['id']));

../../../index.php、config.phpなどを正常に読み取ることができました。

しかし、このバグが設定の読み取りよりも重要であることを証明できるようにしたいだけです。 MySQLのユーザー/パスを読み取りましたが、ローカルホストでのみリッスンしているため、接続できません。私が読んだ他のすべてのコードは何にもつながりませんでした。だから基本的に私が得たすべてはちょっと秘密のソースコードだけでした。

文字列の先頭に「template/data /」が含まれているため、phpフィルターを実行できません。

この脆弱なコードで他に何ができますか?何か案は?

7
GMX Rider

MySQLデータベースは同じマシン上にありますか?もしそうなら、あなたはデータベースファイルを引っ張ってあなたのマシンでDBを再構築することができますか?

他のユーザーが述べたように、ユーザーレイアウトに関する多くの情報を含む/ etc/passwdをプルできます。/etc/shadowにアクセスできれば、オフラインでパスワードを解読することができます。

Webアプリケーションにログインポータルがある場合は、mysql資格情報と、「admin」、「root」などをパスワードで試行します。

ソースコードまたは構成ファイルに他のアクセス認証情報/ APIキーが含まれていますか?サイトのSSL証明書は読み取り可能ですか?読み取り可能な場合は、Man In the Middle接続を使用できますか?

/ proc/version、/ etc/issueなど、およびWebサーバーのバージョンから詳細をプルして、他の既知の脆弱性を探すこともできます。

最後に、ソースは公開されているはずですか?そうでなければ、ソースコードはしばしば価値があると見なされます。そして、さらなる脆弱性についてそれを検査することができます。

5
Hector

ヘクターの答えにはいくつかの素晴らしい例がありますが、私はもう1つの非常に重要なポイントを強調したいと思います。

これは小さな脆弱性ではありません

「すべて」がシステム上の任意のファイルを読み取ることができる場合、この脆弱性は実際には脆弱性ではないという印象を受けているようです。私は正反対を主張します。セキュリティは多層防御の観点から最もよくアプローチされることを理解する必要があります。脆弱性のないシステムを構築することは事実上不可能である可能性があるため、目標はできるだけ多くの領域で可能な限り多くの防御層を持つことです。これにより、悪意のある俳優が1つの領域の弱点を見つけた場合、システム全体で防御することができます。それらが実際の損傷を引き起こすことを防ぎます。実際の侵害の多くは、誰かが利用した脆弱性があったからではなく、別の脆弱性を利用したり、何かを発見したりするまで別のことをさせてしまう脆弱性があったからです本当に =危険。

この小さな脆弱性により、悪意のある攻撃者はシステムへの完全な読み取りアクセス権を与えられます。これは、これがかなり明白なセキュリティの失敗であったという事実によってさらに悪化します。問題の会社に十分な訓練を受けた開発者がいて、定期的なコードレビューを行っている場合、そのようなコードが実稼働システムに移行することは(IMO)非常にありません。この事実の重要性は、これが存在する唯一のセキュリティ脆弱性ではないことを示唆していることです。システムのソースコードを直接表示できるようになったということは、セキュリティの脆弱性をさらに見つけるのが実質的に簡単になるということです。かなりゲームオーバーかもしれません。私が悪意のある俳優であった場合、私はこれを見つけました:

  1. システム全体のソースコードをダウンロードします(1日かかる場合がありますが、ほぼ確実に可能です)。
  2. SQLiの脆弱性を探し(たぶんたくさんあります)、それらを使用してデータベース全体をダウンロードします。適切なパスワードセキュリティを使用していない可能性が高いと思います。彼らのソースコードから明らかです。つまり、彼らがパスワードを適切に保護していない場合、SQLiの脆弱性により次のことが可能になります。
  3. 管理者パスワードをブルートフォースにします。今、私はあなたのウェブポータルにいます。しかし、何だと思いますか?まだ終わらない
  4. ほとんどのビジネスユーザーは、パスワードを常に再利用しています。それでは、管理者パスワードを取得して、自分のメールアカウントにログインできるかどうかを確認します。そこから、少しの運があれば、ホスティングアカウントの管理に入ることができるかもしれません。または多分給与や銀行口座。特に管理者アカウントの場合、メールパスワードを取得したら、空は限界です。会社のメールがクラウドホスティングプロバイダー(Office 365など)でホストされており、クラックした管理者パスワードでメールホスティングプロバイダーにアクセスできる場合はさらに良いでしょう。これにより、社内のすべての電子メールアドレスにアクセスできます。
  5. SQLiの脆弱性を見つけてデータベースをダウンロードしたのかもしれませんが、パスワードのセキュリティは優れていて、何もクラックできませんでした。次に、ソースコードのXSS脆弱性を探し始めます。いくつかの簡単なソーシャルエンジニアリングメールと私はXSSを使用して、パスワードを知らなくてもシステムの管理者アカウントにアクセスできます。今何?
  6. システムの更新に管理者が使用できるシステムの領域があるに違いない。 CMSはありますか?ワードプレスなど、管理者がWebポータルからテンプレートを編集できる機能はありますか?もしそうなら、私はそれを使ってマシンにバックドアをインストールし、基礎となるシステムに直接アクセスしました。私は、Webサーバーが実行しているユーザーの権限で行き詰まります。うまくいけば、サーバーはrootとして実行されていません。他に何もない場合は、数か月も起動しないMoneroマイニングボットをインストールし、バックドアを隠し、CPU時間とお金を使ってお金を稼ぎます。彼らがライブサーバーの外にシステムのクリーンなコピーを持っていない限り(多くの小さな会社は持っていない)、彼らは私を連れ出すことは決してないだろう。彼らは無数の時間とお金を費やして、このミステリーウイルスをシステムから取り除こうと試みます。このミステリーウイルスは、どれだけの頻度でクリーンを開始しても復帰し続けます。
  7. その間、Webポータルにログインするすべてのユーザーの電子メールアドレスとパスワードを自動的に送信するコードをインストールします。上記の手順4に戻ります。
  8. 彼らがシステムの中にそれ自体で何か価値のあるものを持っているなら、天国は彼らを助けます。社会保障番号?クレジットカード?彼らが従業員や顧客のためにそのような情報を保持している場合、それは今私のものです。

これは孤立したセキュリティ問題ではありません。そのようなことは実際には決してありません。

5
Conor Mancone

多くの現実が含まれる可能性があり、真剣に受け止める必要がある他の回答の多くの良い情報。

ホスティングの設定は不明ですが、他のアカウントでWHMサーバーを使用していて、関数が/etc/passwdのコンテンツを取得するために使用されているとします。

username:x:123:654::/home/username:/usr/local/cpanel/bin/noshell
username:x:123:654::/home/username:/usr/local/cpanel/bin/noshell
username:x:123:654::/home/username:/usr/local/cpanel/bin/noshell
etc...

次に、ユーザー名のパスごとに:

/home/username/public_html/wp-config.php 

そして、すべてのwpサイトの構成ファイルが作成されます。これはほんの一例です...最終的には、別のレイヤーとして、コードより上位のものを保護するために最善を尽くす必要があります。

/ etc/passwdのようなローカルパスが関数に提供された場合、すべきが発生します。

<br />
<b>Warning</b>:  file_get_contents(): open_basedir restriction in effect. File(/etc/passwd) is not within the allowed path(s): (/home/uservalue/public_html) in <b>/home/uservalue/public_html/test.php</b> on line <b>2</b><br />
<br />
<b>Warning</b>:  file_get_contents(/etc/passwd): failed to open stream: Operation not permitted in <b>/home/uservalue/public_html/test.php</b> on line <b>2</b><br />

"open_basedir制限が有効です。"

2
Chris