プログラミングコンテスト。 プログラミングコンテスト回避xmlrpc php

30.11.2023 ルーターとモデム

WordPress には、サイトにリモート アクセスするためのツールが常に組み込まれています。 確かに、サイトにアクセスする必要があるのに、コンピューターが遠くにある場合があります。 長い間、解決策は xmlrpc.php というファイルでした。 しかし、近年、このファイルは解決策というよりもむしろ問題になっています。

以下では、xmlrpc.php とそれが作成された理由を詳しく見ていきます。 また、それが引き起こす可能性のある一般的なセキュリティ問題と、WordPress サイトでそれらを修正する方法についても説明します。

XML-RPC は、HTTP がトランスポートとして機能し、XML がエンコードとして機能するデータ転送を可能にする WordPress の機能です。 WordPress は閉じられたシステムではなく、他のシステムと頻繁に通信するため、この問題に対する解決策が見つかりました。

たとえば、携帯電話から Web サイトに投稿したいとします。 xmlrpc.php によって提供されるリモート アクセスを使用する必要があります。

xmlrpc.php の主な機能は、スマートフォンからサイトに接続する機能、他のサイトからのトラックバックとリンクバックの実装、および Jetpack プラグインに関連するいくつかの機能です。

Xmlrpc.php はなぜ作成され、どのように使用されたのでしょうか?

XML-RPC の実装は、WordPress の初期の頃、そして WordPress が WordPress になる前にまで遡ります。

インターネットの初期の頃、接続は非常に遅く、記録して Web 上に公開するプロセスははるかに困難で時間がかかりました。 ほとんどの場合、ブラウザから直接変更を加えるのではなく、オフラインで変更し、コンテンツをオンラインでコピーして貼り付けていました。 そして、このプロセスは理想とは程遠いものでした。

(当時の) 解決策は、コンテンツを作成してブログに接続して公開できるオフライン ブログ クライアントを作成することでした。 この接続は XML-RPC 経由で行われました。 コア XML-RPC 機能により、これらの接続を使用する初期のアプリケーションにより、人々は他のデバイスから WordPress サイトにアクセスできるようになりました。

今日の XML-RPC

2008 年の WordPress バージョン 2.6 では、XML-RPC を有効または無効にするオプションが導入されました。 ただし、WordPress iPhone アプリのリリースにより、XML-RPC サポートはデフォルトで有効になり、無効にするオプションはありませんでした。 それは今でも変わりません。

もちろん、このファイルによって提供される機能は時間の経過とともに大幅に減少し、ファイルサイズは 83 kb から 3 kb に減少し、以前のような役割を果たさなくなりました。

XML-RPC プロパティ

新しい WordPress アプリケーション プログラミング インターフェイス (API) を使用すると、XML-RPC が完全に無効になることが期待できます。 現在、この新しい API はまだテスト中であり、特別なプラグインを介してのみ有効にできます。

ただし、将来的には API が WordPress コアに直接組み込まれ、xmlrpc.php の必要性が完全になくなることが予想されます。

新しい API は完璧ではありませんが、xmlrpc.php とは異なり、優れた信頼性の高いセキュリティを提供します。

Xmlrpc.php を無効にする理由

XML-RPC の最大の問題はセキュリティです。 この問題は XML-RPC とは直接関係ありませんが、サイトへの攻撃を可能にするために使用される可能性があります。

もちろん、非常に強力なパスワードと WordPress セキュリティ プラグインを使用して自分自身を保護することもできます。 ただし、最良の保護モードは、単純にオフにすることです。

XML-RPC には、過去に悪用された主な弱点が 2 つあります。

最初の攻撃では、ブルート フォース攻撃を使用してサイトにアクセスします。 攻撃者は、ユーザー名とパスワードのさまざまな組み合わせを試し、xmlrpc.php を使用してサイトにアクセスしようとします。 1 つのコマンドを効果的に使用して、何百もの異なるパスワードをテストできます。 これにより、通常はブルート フォース攻撃を検出してブロックするセキュリティ ツールをバイパスできます。

2 つ目は、DDoS 攻撃によってサイトをオフラインにすることです。 ハッカーは WordPress の逆通知を使用して、数千のサイトに同時に通知を送信します。 この xmlrpc.php 機能により、ハッカーは DDoS 攻撃を伝播するためにほぼ無限の IP アドレスを取得できます。

XML-RPC がサイトで動作しているかどうかを確認するには、XML-RPC Validator と呼ばれるツールを使用して XML-RPC を実行できます。 このツールを使用してサイトを実行してエラーが発生した場合は、XML-RPC がサポートされていないことを意味します。

成功メッセージを受け取った場合は、以下の 2 つの方法のいずれかを使用して xmlrpc.php を停止できます。

方法 1: プラグインを使用して Xmlrpc.php を無効にする

WordPress サイトで XML-RPC を無効にするのは非常に簡単です。

セクションに移動 プラグイン › 新規追加 WordPress 管理コンソールで。 プラグインを探す XML-RPC を無効にするインストールすると、次の図のようになります。

プラグインを有効化すれば完了です。 このプラグインは、XML-RPC を無効にするために必要なコードを自動的に挿入します。

ただし、インストールされたプラグインは XML-RPC の一部を使用する可能性があり、これを無効にするとプラグインまたはその個々の部分間で競合が発生し、動作モードが解除される可能性があることに注意してください。

個々の XML-RPC 要素のみを無効にし、他のプラグインや機能の動作を許可したい場合は、次のようなプラグインを探してください。

  • XML-RPC 攻撃を阻止します。 このプラグインはすべての XML-RPC 攻撃を阻止しますが、Jetpack などのプラグインやその他の自動化ツールやプラグインに xmlrpc.php ファイルへのアクセスを許可することで実行を継続できるようにします。
  • XML-RPC パブリッシングを制御します。 これにより、制御を維持し、リモートで公開できるようになります。

方法 2: Xmlrpc.php を手動で無効にする

プラグインを使用せず、手動で実行したい場合は、このアプローチに従ってください。 WordPress に渡される前に、受信するすべての xmlrpc.php リクエストを停止します。

.htaccess ファイルを開きます。 このファイルを見つけるには、ファイル マネージャーまたは FTP クライアントで「隠しファイルの表示」を有効にする必要がある場合があります。

このコードをファイルに貼り付けます .htaccess:

# WordPress xmlrpc.php リクエストをブロックする 注文拒否、許可 すべてから拒否 123.123.123.123 から許可

最終的な考え

全体として、XML-RPC は、WordPress サイトでのリモート公開に伴ういくつかの問題に対する確実な解決策でした。 しかし同時に、一部の WordPress サイト所有者にとって非常に危険であることが判明したセキュリティ ホールもいくつか出現しました。

サイトの安全を確保するには、リモート パブリッシングと Jetpack プラグインに必要な機能の一部が必要でない限り、xmlrpc.php を完全に無効にすることをお勧めします。 その後、セキュリティ ホールにパッチを当てながらこれらの機能を使用できるようにする回避策プラグインを使用できます。

やがて、XML-RPC 機能が、セキュリティを犠牲にすることなくリモート アクセスをサポートする新しい WordPress API に統合されることが期待されます。

プラグイン経由または手動で XML-RPC へのアクセスをブロックしましたか? それとも以前はアクティブだったためにセキュリティ上の問題があったのでしょうか? 以下のコメント欄であなたの経験を共有してください。

自分の Web サイトを持っている人は誰でも、その Web サイトのセキュリティを強化したいと考えています。そうでない場合は、常に安全であることを望んでいます...実際、この記事では、WordPress エンジンを保護する原則と基本を分析し、具体的には次のことを検討します。詳細はファイルで xmlrpc.php。 ファイルを変更したり変更したりするときは、バックアップを作成することを忘れないでください。 はじめましょう。

xmlrpc.php ファイルによる WordPress の脆弱性、問題の解決策:

このファイルの目的を知らない、または理解できない人のために説明しましょう。 その助けを借りて、さまざまなアプリケーションを通じて WordPress ブログを管理できます。 もちろん、大多数については知りませんが、私は個人的にこれを使用しません。したがって、なぜサイトをハッキングする余分な機会を残す必要があるのでしょうか、削除します... 結局のところ、このファイルはかなり脆弱です。 ただし、使用しないように削除することができ、必要に応じていつでも後で戻すことができることを覚えておいてください。

まず、ファイルを無効にしましょう xmlrpc.php、サイトに対するかなり多くの攻撃が通過しますが、これは良くありません。 いつものように、これを行うには 2 つのオプションがあります。1 つ目は、.htaccess ファイルと function.php ファイル、および header.php を変更することです (私の意見では、最も正しい方法です)。 プラグインのインストール方法については後ほど詳しく説明します。 ファイルの編集に進みましょう。

function.php ファイルに以下を挿入します。

// xmlrpc.php を無効にする add_filter("xmlrpc_enabled", "__return_false"); 削除_アクション("wp_head", "rsd_link");

header.php ファイル内で以下を削除します。

拒否を命令し、すべての拒否を許可する

この方法に加えて、先ほど話した、いわば自動の方法もあります。 その本質は、追加のプラグインをインストールすることです。 この方法は確かに優れており、非常に簡単ですが、使用はお勧めしません。 なぜ? まあ、単純なことですが、追加のプラグインは余分な負担になります。 そして、大まかに言えば、数行追加するだけで不要な機能が削除され、サイトの生産性が向上し、使いやすくなるプラグインをインストールする必要があるのです。


彼の投稿では、以下のようにブラウザ認証を行う方法も示しています。
$request = xmlrpc_encode_request ("メソッド名" , array("メソッドParam" ));
$auth = Base64_encode ($username . ":" . $password );
$header = (version_compare(phpversion(), "5.2.8"))
? array("Content-Type: text/xml" , "認可: Basic $auth " )
: 「コンテンツ タイプ: text/xml\r\n認証: Basic$auth " ; //
$context = stream_context_create (array("http" => array(
"メソッド" => "POST" 、
"ヘッダー" => $header 、
"コンテンツ" => $request
)));
$ウェブサービス = 「http://www.example.com/rpc」;
$file = file_get_contents($webservice, false, $context);
$response = xmlrpc_decode ($file);
if (xmlrpc_is_fault($response)) (
return "xmlrpc: $response [faultString] ($response [faultCode])" ;
) それ以外 (
$response を返します。
}
?>
1 - 編集者注: これは「SandersWang dt php at gmail dot com」からの修正です。

16年前

バイナリ文字列 (xmlrpc_set_type で設定) は ...しかし、この関数は、80 文字ごとに、改行を引き起こすかのように、Unicode 改行である XML エンティティ " " を挿入しますが、これは明らかに愚かです。

愚かなことかもしれませんが、これは http://jakarta.apache.org/xmlrpc/ (旧名 Helma) などの一部の XML-RPC サーバーに深刻な問題を引き起こします。 次のようなものでそれらのエンティティを削除します

$req = preg_replace("/ /", "", xmlrpc_encode_request("my.method", $args));

問題を回避します。

11年前

エンコーディングは何もエンコードしているようには見えず、XML ヘッダーに何を入れるかを指定するだけであることに注意してください。

この関数を使用し、それを Apache xml-rpc サーブレットに送信し、mysql データベースに保存するときに、二重エンコードされた UTF 文字列がデータベースに保存されるときに問題が発生しました。 「エスケープ」を「マークアップ」だけに設定し、「エンコード」を「UTF-8」に設定することで解決しました(xmlrpc_decode にも「utf-8」を設定することを忘れないでください)。

UTF-8 でエンコードされた文字列は、文字をエンティティとしてではなく、バイトをエンティティとしてエスケープされるようです。

9年前

xmlrpcで以下のような配列を送信してみたことはありますか?
$var1=array(7=>14,9=>18);

出力配列はまったく異なって見えます。 次のようになります。
$var2=配列(14,18);

私が見つけた唯一の解決策は、インデックスの先頭にスペースを追加することです。
$var3=array(" 7"=>14," 9"=>18);

その方法を使用すると、正しい結果が得られます。($var1)

16年前

この関数は、XML-RPC クライアントが XML-RPC 要求の XML ペイロードを作成するために使用する必要があります。

$params = "system.methodSignature" ;
$method = "system.methodHelp" ;
$request = xmlrpc_encode_request ($method, $params);
エコー ($request);
?>

生産します。



system.methodヘルプ

system.methodSignature



2 番目の引数は変数の型を認識し、正しい XML-RPC 構造を生成します。 詳細については、xmlrpc_encode() を参照してください。

12年前

オーバーロード機能を備えたシンプルな OO クライアント:

php メソッド test_helloworld は、xmlrpc メソッド test.helloworld に変換されます。

クラス RpcClient(

プライベート $_methods;
プライベート $_context;
プライベート $_url;

関数 __construct ($url, $user, $passwd) (
$auth =base64_encode(sprintf("%s:%s", $user,$passwd));
$this->_context = stream_context_create(array(
"http" => 配列(
「メソッド」=>「POST」、
"header" => "Content-Type: text/xml\r\n"。
"認可: Basic $auth" ,

)
));
$this->_url = $url;

$this->registerMethod("Test_HelloWorld");

関数 __call($methodName, $params) (
if (array_key_exists($methodName,$this->_methods)) (
// 異議申し立て RPC について
$m = str_replace("_", ".", $methodName);
$r = xmlrpc_encode_request($m, $params,array("verbosity"=>"newlines_only"));
$c = $this->_context;
stream_context_set_option($c,"http","コンテンツ",$r);
$f = file_get_contents($this->_url,false,$c);
$resp = xmlrpc_decode($f);
$resp を返します。
) それ以外 (
// オブジェクトの機能に関する訴え
call_user_method_array($methodName, $this,$params);
}
}

プライベート関数 registerMethod ($method) (
$this->_methods[$method] = true;
}

XML-RPC テクノロジーは、ピンバック、トラックバック、管理パネルにログインせずにリモート サイトを管理するなど、さまざまな優れた機能のために WordPress システムで使用されています。 残念ながら、攻撃者はこれを使用して Web サイトに対して DDoS 攻撃を実行する可能性があります。 つまり、自分自身または注文のために美しく興味深い WP プロジェクトを作成すると同時に、何も疑うことなく DDoS ボットネットの一部になることができます。 悪意のある人々は、何万、何十万ものサイトを接続することで、被害者に対して強力な攻撃を仕掛けます。 同時にあなたのサイトも被害を受けますが、なぜなら... 負荷は、それが配置されているホスティングに送られます。

このような不正なアクティビティの証拠は、次の行を含むサーバー ログ (nginx の access.log) に記録される可能性があります。

103.238.80.27 - - "POST /wp-login.php HTTP/1.0" 200 5791 "-" "-"

さて、XML-RPC の脆弱性に戻りましょう。 視覚的には、サーバー上でサイトを開くのが遅い、またはサイトをまったく読み込めない (502 Bad Gateway エラー) という形で現れます。 FASTVPS ホストのテクニカル サポートは私の推測を裏付け、次のようにアドバイスしてくれました。

  1. WordPress とプラグインを最新バージョンに更新します。 一般に、これに従っている場合は、最新の 4.2.3 をインストールする必要性について読んだことがあるかもしれません。 (以前のバージョンと同様に) セキュリティ上の批判のため。 要するに、更新するのは良いことです。
  1. XML-RPC ピンバックを無効にするプラグインをインストールします。

WordPress での XML-RPC の無効化

以前は、XML-RPC を有効または無効にするオプションがシステム設定のどこかにあったような気がしますが、現在はそこに見つかりません。 したがって、これを取り除く最も簡単な方法は、適切なプラグインを使用することです。

「XML-RPC ピンバックを無効にする」を見つけてダウンロードするか、システム管理パネルから直接インストールします。 追加の設定は必要なく、モジュールはすぐに動作を開始します。 XML-RPC インターフェイスから pingback.ping メソッドと pingback.extensions.getPingbacks メソッドが削除されます。 さらに、HTTP ヘッダーから X-Pingback が削除されます。

ブログの 1 つで、XML-RPC の無効化を解除するためのさらにいくつかのオプションを見つけました。

1. テンプレートで XML-RPC を無効にします。

これを行うには、テーマのfunctions.phpファイルに次の行を追加します。

注文拒否、すべての拒否を許可

私は個人的に最後の 2 つの方法を使用しませんでした。 Disable XML-RPC Pingback プラグインを接続しました。これで十分だと思います。 不必要なインストールを好まない人のために、代替オプションを提案しました。

  • xmlrpc クライアントとサーバーの両方の作成のサポート
  • 完全に自動化または完全に手動で、PHP 値から xmlrpc へのきめ細かいエンコードとデコード
  • UTF8、Latin-1、および ASCII 文字エンコーディングのサポート。 php mbstring 拡張機能を有効にすると、さらに多くの文字セットがサポートされます。
  • リクエストとレスポンスの両方の http 圧縮、Cookie、プロキシ、基本認証と https、ntlm 認証、php cURL 拡張機能によるキープアライブのサポート
  • 受信 xmlrpc リクエストのパラメーター タイプのオプションの検証
  • system.listMethods、system.methodHelp、system.multicall、system.getCapabilities メソッドのサポート
  • のサポート そして xmlrpc の拡張機能
  • 既存の php 関数またはクラスメソッドを Web サービスとして登録し、phpdoc コメントから付加価値情報を抽出する可能性
  • Web ベースのビジュアル デバッガがライブラリに含まれています

要件

  • PHP 5.3.0以降。 5.5以降を推奨
  • SSL または HTTP 1.1 を使用してリモートサーバーと通信したい場合は、php「curl」拡張子が必要です。
  • ASCII、Latin-1、UTF-8 以外の文字セットでのリクエスト/レスポンスの受信を許可するには、php の「mbstring」拡張子が必要です
  • PHP の「xmlrpc」ネイティブ拡張機能は必要ありませんが、インストールされている場合でも、このライブラリの動作に干渉はありません。

ダウンロード

ニュース

  • 2017 年 7 月 1 日
    ライブラリ バージョン 4.2.0 および 3.1.0 をリリースしました。
    リリースノートはGithubで入手できます
  • 2016 年 1 月 20 日
    ライブラリ バージョン 4.0.0 をリリースしました。
    API に大きな変更が加えられ、過去が廃止され、最新の PHP への移行が開始されるのはこれが初めてです。
    名前空間が導入され、UTF-8 の場合はデフォルトの文字セットが使用されます。 mbstring のサポートなどが追加されました。
    変更の完全なリストについては、Github にアクセスしてください。
  • 2015 年 4 月 19 日
    ライブラリバージョン 3.0.1 をリリースしました。
  • 2014 年 6 月 15 日
    ライブラリバージョン 3.0.0 をリリースしました。
  • 2013 年 12 月 15 日
    プロジェクトは GitHub に移動されました

    オンラインxmlrpcデバッガー

    このライブラリ上に構築されたデモ xmlrpc デバッガー アプリケーションは、アドレス http://gggeek.altervista.org/sw/xmlrpc/debugger/ でアクティブになります。 デバッガを使用すると、たとえば SF デモ サーバーにクエリを実行するか、ネット上でアクセス可能な場合は独自の個人用 xmlrpc サーバーをデバッグします。

    発達

    説明ステータス - 2009/07/26 更新
    バージョン 2 以降に追加されたすべての機能のドキュメントを更新するゆっくりと進んでいます...
    XMLメッセージのフォーマットを選択する機能を追加PHP ネイティブの xmlrpc 拡張機能の機能と同様
    PHP 5 を STRICT モードで実行するときに発行される警告を修正バージョン 3.0 ですでに行われており、php 4 との互換性は放棄されている可能性があります...
    自動 PHP 関数を xmlrpc メソッド ラッパーに拡張して、例外処理を利用し、xmlrpc エラー応答を返します。
    PHP 関数を PHP の xmlrpc メソッドに自動的に変換するための自動スタブ ジェネレーターを拡張します。<= 5.0.2 その方法については AMFPHP コードを参照してください。
    バージョン 2.1 の多くの機能強化
    サーバーが php 関数を自動的に登録できるようになったので、その必要性は減りました...
    mbstring が有効になっている場合のサポートの向上たとえば、 文字セットエンコーディングの推測が高速化
    「バージョン 1」Cookie のサポートを改善
    ネイティブエラーコードの代わりに使用できる機能を追加
    PEAR 互換性: PEAR バージョンのライブラリに異なる名前で存在する関数の同義語を追加します。
    xmlrpc 拡張機能のサポートを追加
    デバッガーに、validator1 テストの完全なセットを起動する機能を追加します。
    公開されたサービスの記述、および system.methodSignature および system.describeMethods への/からの変換に関する WSDL の使いやすさを調査します。XSD を使用して xmlrpc を厳密に定義する場合には、いくつかの問題が存在します。 Relax NG は間違いなく優れた代替手段ですが、他のツールキットではそれを WSDL ファイルと組み合わせて使用​​するためのサポートがほとんどありません...
    http リダイレクトのサポート (302)
    sf.net に小さなデータベースを追加して、xmlrpc.com サイトにあるような、受信ユーザーをログに記録する検証ページを実装できるようにします。
    結果を sf.net にアップロードする機能をベンチマーク スイートに追加
    ライブラリの最も頻繁に使用される関数を高速化する php 拡張機能を作成します。例として adodb がどのように実行したかを参照してください
    XML を手作業で解析する代わりに、simplexml と Relaxng を使用して速度とメモリの増加をテストします。

    安全

    3 回目のセキュリティ侵害: 2005 年 8 月

    これは、以下の 2 番目のセキュリティ侵害に対するさらなる積極的な対応でした。 eval() はまだ悪用される可能性があるため、使用はすべて削除されました。

    このライブラリが最初に作成されたとき、当時利用可能な php のバージョンには call_user_func() などが含まれていませんでした。 したがって、これらの制約内で、XML パーサーによって呼び出される 2 つの関数で eval() を使用するように記述されました。 この使用法により、サーバー クラスは同じ関数を使用して XML を解析する必要があるため、eval() も使用しました。

    これらのハンドラー関数と、元のメッセージのコンテンツを維持するために使用される配列は、評価用の php コードを構築するのではなく、php 値を構築するように書き直されました。 これにより、コードが実行される可能性が排除されます。

    2 回目のセキュリティ侵害: 2005 年 7 月

    2005 年 6 月 27 日に GulfTech Security Research の James Bercegay によって発見されたセキュリティ脆弱性は、大きな波紋を引き起こしました。 Salshdot のトップページに掲載され、Netcraft、LWN、その他多くのサイトで言及されました。

    エクスプロイト コードを構築するための詳細な手順がインターネット上で公開されており、多くの Web ホスティング管理者は、何が最善の防御計画なのか、また実際のリスクは何なのか疑問に思っています。 ここにいくつかの答えがあります。

    問題の範囲

    • このバグは、PEAR::XMLRPC および PHPXMLRMPC として知られる 2 つのライブラリに影響します。
      これは、php に組み込まれており、コンパイル時に「--with-xmlrpc」オプションを使用して有効になる xmlrpc 実装には影響しません (Unix では、Windows では通常、php.ini の適切な行を変更することで有効/無効になります) )
    • バグ(リモートホストによって挿入されたphpコードの実行)はファイル内にのみ存在します xmlrpc.inc phpxmlrpc ディストリビューション内と RPC.php PEAR ディストリビューション内
    • PEAR::XMLRPC と PHPXMLRMPC の両方が、問題を修正したライブラリの更新バージョンをリリースしました。
    • どちらのライブラリも、多数の PHP アプリケーションで使用されています (上記の不完全なリストを参照)。
      ライブラリ全体は基本的に 2 つの非常に単純なファイルで構成されているため、誰もが自分の好みやニーズに応じてパッチを適用し、アプリを配布するときにそれらをバンドルする傾向があります。
      ほとんどの注目度の高いプロジェクトは、それぞれのアプリの新しいバージョンを非常に迅速にリリースしていますが、すべてのユーザーがシステムを更新するにはさらに長い時間がかかるでしょう。
      多くのアプリケーションは最近まで、phpxmlrpc ライブラリの非常に古いバージョンが含まれた状態で出荷されていたと言わざるを得ません。 最初のインジェクションのバグは 2001 年に修正されていました誰も気づいていない様子で(...)

      このため、残念ながら、システム管理者が問題を簡単に解決する方法を見つけることが非常に困難になっています。パブリック ホスティング サーバーでは、前述のファイルがさまざまなディレクトリとさまざまなバージョンで見つかる可能性が非常に高くなります。

    脆弱性が引き起こされる仕組み

    • バグを引き起こすには、攻撃者は、xmlrpcval オブジェクトの作成プロセスで特別に作成された XML を評価する必要があります。 Xmlrpcval オブジェクトは、サーバー スクリプトが xmlrpc 要求をデコードするとき、または一部の php スクリプトが xmlrpc クライアントとして機能し、サーバーから送信された応答をデコードするときに作成されます。
      サーバー スクリプトはアプリケーション固有であり、多くの場合、server.php という名前が付けられます (ただし、プロジェクトまたはユーザーが選択した任意のバリアントも可能です)。また、xmlrpc.inc と xmlrpcs.inc ファイルの両方を含める必要があります (Pear バージョンの場合は、server .php は xmlrpcs.inc と同等です)。
    • PHP スクリプトに xmlrpc.inc と xmlrpcs.inc を含める場合のみ (私の知る限り...) 完全に安全です。また、http リクエスト経由でこれらを直接呼び出すことも同様です。これは、関数、変数、クラスの定義のみがこれら 2 つのファイルで実行されるためです。 即時のコード実行はありません。
    • 完全な phpxmlrpc ライブラリとともに配布されるserver.php ファイルとDiscussion.php ファイルは、実際にはライブ xmlrpc サーバーを実装しているため、これらのファイルへのアクセスをブロックすることを検討するか、実稼働サーバーにデプロイされていることがわかった場合は削除することを検討することをお勧めします (私のサイトのトップから) takeover-php-file-inclusion 侵害に苦しんでいる 2 番目の PHP アプリを引き込み、ライブラリの既知のバグを悪用する、ある種の攻撃を思いつく可能性があることに注意してください)

    保護手段

    • Web サーバー プロセスには、できる限り少ないシステム権限を与えます。 Unix では通常、Apache をユーザー none として実行するか、jailroot/chroot 環境で実行する必要があります。 PHP エンジンは Web サーバーと同じユーザーで実行されるため、これが防御の第一線となります。攻撃者によって挿入されたすべての PHP コードはサーバー上で最も特権のないユーザーとして実行され、それが及ぼす可能性のある損害はすべて以下に限定されます。 PHPアプリケーション自体を中断する
    • セーフモードでphpを実行します。 あなたがパブリックホストであり、これを行っていない場合は、サーバーがルート化されている可能性があります。 これにより、php スクリプトが system() や eval() など、安全でないと思われる関数を使用するのを防ぎます。
    • 難しいブロック: 既存のすべての phpxmlrpc ファイル (xmlrpc.inc および xmlrpcs.inc) を見つけて、システム全体でそれらを無効にします (chmod 0)。
      もちろん、これにより一部のユーザー アプリケーションが動作しなくなる可能性があるため、実行時にユーザーに通知する必要があります。
    • ソフト ブロック: 既存の phpxmlrpc ファイル (xmlrpc.inc および xmlrpcs.inc) のすべてのコピーをバージョン 1.1.1 のものに置き換えます。
      残念ながら、この方法ではすべてのアプリが動作し続けることが 100% 保証されません。 lib オブジェクトの内部の一部はバージョン 0.9、1.0、1.1 と変更されており (xmlrpcresp オブジェクト内に格納されている http ヘッダーの表現など)、サーバー上にデプロイしたコードがそれらをサブクラス化すると、問題が発生する可能性があります。 回線経由で送信される XML も、一部の古いバージョンのライブラリに関して変更されています (特に、バージョン 1.0.99.2 では、ASCII 範囲外の文字が HTML エンティティとして誤ってエンコードされましたが、現在は XML 文字セット エンティティとしてエンコードされています)。 いくつかの新しいエラー応答コードも追加されました。 そうは言っても、そのスクリプトを実行するのは 95% 安全であり、ユーザーが何かが壊れていると叫び始めるのを待っている必要があります...
    • PHP PEAR ライブラリは 1 行のコマンドでアップグレードできるため、それほど大きな問題ではありません。
      pear は XML_RPC をアップグレードし、それがアップグレードされているかどうかを確認します (1.3.1 以降は OK、現時点での最新は 1.3.2)。
      梨リスト | grep RPC

    追加の考慮事項

    リリース 1.1.1 では、ユーザー エクスペリエンスを向上させるために、ファイル xmlrpcs.inc にもパッチが適用されました。 詳細: 特別に作成された不正な XML をサーバーに送信すると、PHP スクリプトは適切な XML 応答を返さずに PHP エラーを生成します。
    一部の人によると、これは実際には「パス開示のセキュリティ違反」を伴うとのことです (つまり、表示される PHP エラー メッセージには通常、ファイル システム パスに関する機密情報が含まれています)。しかし、システム管理者が運用サーバーを実行している場合、単一の PHP スクリプトでも同じセキュリティ問題が発生します。 ini ディレクティブの display_errors=On。
    また、xmlrpc.inc には、予期しないパラメーターを使用して関数を呼び出すと php 警告またはエラーが生成される場所が多数あることも事実として知っています。また、すべての関数に対して厳密なパラメーター チェックをすぐに実装する予定はありません。それを目指して、最初から Java でコードを書いた方が良いかもしれません。

    これは世界の終わりですか?

    そうならないことを願います。
    その理由は、コードインジェクションエクスプロイトの被害を受ける PHP アプリケーションが数十個存在するためです。 掲示板のセキュリティ トラックを見てください...それでも多くの人は、Web 開発には PHP が良い選択だと考えています。
    セキュリティはプロセスであり、到達可能な状態ではないことに注意してください。

    最初のセキュリティ侵害: 2001 年 9 月

    私はダン・リビーからこのアドバイスを受けました。 彼の許可を得て、ここに転載します。 このエクスプロイトは、XML-RPC for PHP のリビジョン 1.01 以降で修正されていることに注意してください。 -- Edd Dumbill 2001 年 9 月 24 日火曜日 ============= PHP セキュリティ ホール: XML-RPC エクスプロイトの可能性 ================== == ======================== 要約: Useful Inc の php xmlrpc ライブラリの最新リリース、バージョン 1.0 を使用すると、攻撃者はxml-rpc ライブラリをだまして Web サーバー上で PHP コードを実行させるような方法で XML を編集しました。PHP のセーフモードをオフにしてシステム コマンドを実行すると、任意の PHP コードを実行できました。 攻撃者はこれをウイルスを起動するためのゲートウェイとして簡単に使用する可能性があります。 詳細: xmlrpc ディストリビューションに含まれるserver.php サンプル スクリプトを変更し、これもディストリビューションの一部である client.php スクリプト経由で呼び出すことで問題を実証しました。 標準のサーバー コードをバイパスし、単純にエコーで応答をクライアントに返しました。クライアントに任意の PHP コードを実行させることができました。次に、server.php サンプルを元の状態に復元し、Telnet を使用して変更されたコードを送信しました。また、少し異なる構文が必要ではありますが、サーバー上でコードを実行することもできました。攻撃の中心は、php の eval() 関数の使用です。 xml-rpc ライブラリが eval を使用して xml 入力からデータ構造を構築することは知っていたので、次のような方法で入力 xml を構造化するだけで済みました。 a) eval に渡される前にエスケープされない b) エスケープされるPHP 構文エラーを生成しない 通常、数値以外のデータはすべて、eval に渡される前にライブラリによってエスケープされます。 ただし、送信すると、 タグの後に予期しないタグが続きます。 の場合、エスケープ コードはバイパスされ、代わりに「生の」データが評価されます。 クライアントの悪用: 一般的な xml-rpc 応答を次に示します。 こんにちは世界 このような応答が eval されると、次のようになります。 new xmlrpcval("hello world", "string") 以下は、php コードを実行して " をエコーする xml-rpc 応答です。

    こんにちは世界

    " クライアント側: ", "文字列"); エコー "

    こんにちは世界

    "; \$waste = 配列("
    この場合、eval される文字列は次のとおりです: new xmlrpcval("", "string"); echo "

    こんにちは世界

    "; $waste = array("", "string") "string"); と \$waste の間のすべてを、ほぼ任意の長さの任意のコードに置き換えることができます。最後に、内容を出力するコードを次に示します。現在のディレクトリの: ", "文字列"); エコー "

    "; エコー `ls -al`; エコー "

    "; 終了; \$waste = array("
    サーバーのエクスプロイト: サーバーのエクスプロイトは、サーバーが異なる eval コマンドを使用していることを除いて、クライアントとほぼ同じです。そのため、PHP 構文エラーを避けるために、開始構文と終了構文が若干異なる必要があります。 これは上記と同じコードですが、サーバーに対して機能します。 system.listMethods ", "文字列")); エコー "

    ディレクトリのリストが表示されている場合は、xml-rpc 経由で php とシステム コードを実行しただけです。

    "; echo "今度は ls -al: を使用してディレクトリのリストを試みます\n "; エコー `ls -al`; エコー ""; echo "簡単に rm -rf を呼び出すか、プログラムをディスクに書き込んで実行するか (ウイルスなど)、いくつかのファイルを読み取ることができました。 良い1日を。

    "; 終了; $waste = array(array("
    問題領域: xmlrpc.inc には、文字データを処理するために XML パーサーによって呼び出される xmlrpc_cd() という関数があります。 function xmlrpc_cd($parser, $data) ( global $_xh, $xmlrpc_backslash, $xmlrpc_twoslash; //if (ereg("^[\n\r \t]+$", $data)) return; // print " [$(data)] を追加します\n"; if ($_xh[$parser]["lv"]==1) ( $_xh[$parser]["qt"]=1; $_xh[$parser][ "lv"]=2; ) if ($_xh[$parser]["qt"]) ( // 引用符で囲まれた文字列 $_xh[$parser]["ac"].=str_replace("\$", "\\ $", str_replace(""", "\"", str_replace(chr(92),$xmlrpc_backslash, $data))); ) else $_xh[$parser]["ac"].=$data; ) それエスケープせずにデータを追加する最後の else です。 これを持っていると非常に危険です。 これは数値データを対象としているようで、エスケープのオンとオフを切り替える "qt" (引用符) 変数を設定または設定解除するのに多大な労力がかかります。 ただし、この種の悪用の可能性がゼロになるように、数値データを同様にエスケープし、if/else を削除すべきではない理由がすぐにはわかりません。