PHP キャスト タイプとリモート管理プラグインのセキュリティ リスクの分析_PHP チュートリアル

WBOY
リリース: 2016-07-13 10:26:18
オリジナル
961 人が閲覧しました

リモート管理プラグインは、WordPress サイト管理者にとって人気のあるユーティリティ ツールで、ユーザーは最新リリースへの更新やプラグインのインストールなど、複数のサイトで同時に同じ操作を実行できます。ただし、これらの操作を実装するには、クライアント プラグインはリモート ユーザーに重要な権限を付与する必要があります。したがって、管理サーバーとクライアント プラグイン間の通信が安全であり、攻撃者によって偽造できないことを保証することが重要です。この記事では、利用可能ないくつかのプラグインを簡単に分析します。これらのプラグインの弱点を悪用すると、攻撃者はこれらのプラグインを実行しているサイト自体を完全に侵害することさえできます。

WP の管理InfiniteWP、および CMS コマンダー

これら 3 つのサービスは同じ基本的なクライアント プラグイン コードを持っているため (視覚的には、もともと ManageWp によって実装され、その後、他の 2 つがそれを調整したものです)、そのため、それらはすべてシグネチャ バイパスの脆弱性を抱えており、リモートでコードが実行される可能性があります。

管理サーバーは、ユーザーに管理者の資格情報 (MAC、通常はハードウェアの MAC アドレスとして認識されます。ここではメッセージ認証コード)。メッセージ ダイジェストは、メッセージが共有秘密キーを使用してメッセージ ダイジェスト アルゴリズムを通過するときに生成されます。 MAC はメッセージに添付されて送信され、受信後、受信側は共有秘密キーを使用して受信メッセージを計算し、MAC2 を生成し、それを MAC1 と比較します。メッセージ ダイジェストは、メッセージの信頼性と整合性を検証するために使用されます (暗号化を学習した学生はこれを知っているはずです)。ただし、これら 3 つのサービスのクライアント プラグインには実装上の欠陥があります。これにより、重大な脆弱性が発生しました。

helper.class.php によって認証された受信メッセージは次のようになります:

リーリー

非厳密な等号を使用すると、比較の前に型の「スプーフィング」[型変換] が発生します。 md5() 関数の出力は常に文字列ですが、$signature が整数に変更されると、比較中に発生する型変換により、一致する MAC が簡単に偽造される可能性があります。たとえば、実際の MAC が「0」または数字以外の文字で始まる場合は、0 が一致し、「1xxx」の場合は整数 1 が一致します。 (これは実際には PHP の機能であり、もちろん他の言語にもあります。文字列と数値が非厳密に等しいかどうかを比較するとき、最初の文字が数値の場合は、対応する整数に変換されます比較用の場合 0-9 以外の文字の場合は 0 として扱います。 php.net の公式説明: 数値と文字列を比較する場合、または数値の内容を含む文字列を比較する場合、文字列は次のようになります。数値に変換され、数値に基づいて比較が続行されます。

文字列を数値に変換します:

文字列を数値として扱う場合、結果と型は以下のようになります。

文字列に「.」、「e」、または「E」が含まれておらず、その数値が整数の範囲内(PHP_INT_MAX で定義されている)の場合、文字列は整数として扱われます。それ以外の場合はすべて、値は浮動小数点数として扱われます。

文字列の先頭によって値が決まります。文字列が有効な数値で始まる場合は、その数値が使用されます。それ以外の場合、その値は 0 (ゼロ) です。有効な値は、オプションの符号、その後に続く 1 つ以上の数字 (小数点を含む場合もあります)、およびオプションの指数部分で構成されます。指数部は、「e」または「E」とそれに続く 1 つ以上の数字で構成されます。

リーリー

残念なことに、攻撃者は署名として整数を提供する可能性があります。 init.php では、受信リクエストはbase64_decode() を使用してデコードされ、結果が逆シリアル化されます。 Unserialize() を使用すると、入力データの種類を制御できることを意味します。 偽のシリアル化メッセージは次のとおりです。

a:4:{s:9:"署名";i:0;s:2:"id";i:100000;s:6:"アクション";s:16:"execute_php_code";s:6: "params";a:2:{s:8:"ユーザー名";s:5:"管理者";s:4:"コード";s:25:"exec('touch /tmp/owned');" ;}}

このメッセージは整数 0 を署名として使用し、プラグインによって提供されるexecute_php_codeを使用して任意のPHPコードを実行します。

リーリー
この偽造された例は、直接使用することはできません。まず、id のキーの値は、以前の正規のメッセージの値よりも大きい必要があります (増加したメッセージ ID は、リプレイ攻撃を防ぐために使用されます。現在、両方のリクエストの偽造が存在します)。これは、CSRF、クロスサイト リクエスト フォージェリを思い出させます。中間者攻撃はありますか?)、次に、署名の照合に使用される整数は、ブルート フォース クラッキングによって突破される可能性があります。 。

リーリー

上面的伪代码尝试发送具有很大ID值得虚假消息,并且对每个ID都进行十次单独的数字指纹匹配(前面说到过,对于一个字符串,只要一个数字就可以在比较时进行匹配,这里从0-9是因为每一种情况都能遇到)。

这一缺陷可以通过使用全等运算符[===]和对传入的指纹进行检查来修复。这几个插件服务都通过使用严格的全等运算符进行了修复(php.net的说明:a===b,则a和b值相等,且类型也相等;a==b,在发生类型转换后再判断其值是否相等)。

另外还有一些其他的问题,但是他们还没有采取行动。首先,这一做法是有弱点的(密钥追加到$data,然后进行散列),应该用HMAC(Hash-based Message Authentication Code,以一个密钥和一个消息为输入,生成一个消息摘要作为输出)。其次,仅用于操作的action和消息ID被用于创建签名。这意味着,一个活跃的网络攻击者可以改变消息中的参数而签名依旧是有效的(例如改变execute_php_code消息执行任意代码)。为了进行保护,MAC应该包含整条消息。

(注意,基于MD5的消息摘要是一种后退,可以的话这些插件使用openssl_verify();***2014-04公布出来的Openssl 1.0.f heartbleed漏洞号称世纪级漏洞***)

WORPIT

Worpit是另一个远程管理服务,但它使用从头开始构建的客户端插件,它同样有强制类型转换漏洞,可以让攻击者以管理员权限登陆。

该插件提了远程管理员登陆的方法,使用仅Woprit传递系统可配置的临时的token值。这款插件会检查请求中提供的token值是否和存储在数据库中的值匹配。

if ( $_GET['token'] != $oWpHelper->getTransient( 'worpit_login_token' ) ) { 
  die( 'WorpitError: Invalid token' ); 
}
ログイン後にコピー

令牌是从一次使用的数据库中删除。这意味着大多数的时候都是在数据库中没有令牌。因此,在调用getTransient()方法可能返回false。非严格的比较是,这意味着任何“falsey价值,比如字符串0,将被视为一个有效的令牌。一个例子网址以管理员身份登录:

这个token一经使用就会从数据库中删除,这意味着,大多数时候数据库中是没有token的。因此,对getTransient()方法的调用很可能返回false。非严格的比较也用到了,这意味着任何相当于false的值,例如字符串0会被当做一个有效的token,以管理员身份登陆的例子如:http://victim/?worpit_api=1&m=login&token=0

至此,该站点就为攻击者所控制了,他有权限安装恶意插件或修改已有的插件。

这里的修复方案是使用!==并进行其他检查及从数据库进行检索。

结论:

一定要记住检查用户输入的是预期的类型并在安全性很重要的函数中使用进行严格比较,如检查身份验证令牌。

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/824742.htmlTechArticle远程管理插件是目前广受WordPress站点管理员欢迎的实用工具,它允许用户同时对多个站点执行相同的操作,如更新到最新的发行版或安装插...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!