【解説】WordPress 用プラグイン YOP Poll におけるクロスサイトスクリプティングの脆弱性(CVE-2017-2127)


こんにちは。セキュリティ事業部の宇野です。

先日、JVNで以下の脆弱性が報告されました。

JVN#55294532
WordPress 用プラグイン YOP Poll におけるクロスサイトスクリプティングの脆弱性

本脆弱性ですが、当社で存在を確認し、IPAに報告後、公開された情報になります。

今回は、 YOP Pollに存在していたクロスサイトスクリプティングの脆弱性についての紹介と、仕組みについてお伝えします。

YOP Pollとはどんなプラグイン?

アンケートを作成するプラグインで、記事の中に簡単にアンケートを作ることができます。
アンケートを作成する処理の中に脆弱性が存在していました。
YOP Pollプラグイン

クロスサイトスクリプティングの脆弱性とは?

クロスサイトスクリプティングの脆弱性とは、HTTPレスポンスを出力する際に、特殊文字に対する無害化処理が不十分であるため、悪意あるユーザのWebページから対象のWebページに対するリンクなどに不正なスクリプトを注入され、正規ユーザが攻撃者の意図したスクリプトを動作させられる脆弱性のことです。

クロスサイトスクリプティングの脆弱性が存在し悪用された場合、被害者は攻撃者の意図したコンテンツを表示させられたり、攻撃者にcookieの情報が盗まれ、なりすまし等の被害が起こる可能性があります。

クロスサイトスクリプティングの脆弱性には、反射型、格納型、DOM型等の種類がありますが、今回は、格納型のクロスサイトスクリプティングの脆弱性に該当します。


引用:(別紙)「クロスサイトスクリプティング(XSS)」の脆弱性の種類

格納型クロスサイトスクリプティングの脆弱性とは、Webアプリケーションが、悪意のあるユーザから入力された記号等の文字列を含むデータを、データベース等に保存します。保存されたデータがデータストアから読み戻された結果、レスポンス上に格納された記号を含むデータがそのまま出力されます。

検証手順

今回の検証は以下の環境で行っております。
・Ubuntu 16.04LTS
・Apache/2.4.18 (Ubuntu)
・PHP 7.0.8-0ubuntu0.16.04.3 (cli)( NTS )
・MySQL Ver 14.14 Distrib 5.7.16, for Linux (x86_64) using EditLine wrapper
・WordPress バージョン 4.7
・YOP Poll バージョン 5.8.0
・YOP Poll バージョン 5.8.2

!!注意!!
今回紹介する脆弱性はすでに修正されています。ですが、もし対象の脆弱なバージョンに対して試す際には、ご自身が管理するローカルの環境で実行してください。

1.WordPress の 管理者IDでログインし、管理者ページに遷移します。管理者ページから「Yop Poll」項目の「Add New」を押下し、Edit Poll画面に遷移します。

2.「Question Text」の入力欄に「<input onmouseover=”alert(‘セキュリティテスト’)”>」を埋め込み、アンケートを作成します。

3.投稿記事に作成したアンケートを載せます。

4.作成した記事ページに遷移し、質問の項目にマウスをあてるとスクリプトが動作することを確認できます。

htmlソースを確認すると検証手順2で入力した値「<input onmouseover=”alert(‘セキュリティテスト’)”>」が出力されていることを確認できます。

以下にhtmlソースを示します。(抜粋)

<div id = "yop-poll-question-container-3_yp58de0c9c735db-3" class = "yop-poll-question-container-3_yp58de0c9c735db">
		<div id = "yop-poll-question-3_yp58de0c9c735db-3"
             class = "yop-poll-question-3_yp58de0c9c735db">securitytest02<input onmouseover="alert('セキュリティテスト')"></div>
		<div id = "yop-poll-answers-3_yp58de0c9c735db-3" class = "yop-poll-answers-3_yp58de0c9c735db">
			<ul>
				<li  class="yop-poll-li-answer-3_yp58de0c9c735db yop-poll-li-answer-3_yp58de0c9c735db-3">
					<input type="radio" value="3" name="yop_poll_answer[3]" id="yop-poll-answer-3_yp58de0c9c735db-3" /> <label for="yop-poll-answer-3_yp58de0c9c735db-3">securitytest02</label>
				</li>	
			</ul>
		</div>
		<div  class = "yop-poll-customs-3_yp58de0c9c735db">
			<ul>	
			</ul>
		</div>

5.修正版のYOP Poll 5.8.2プラグインを同じように実行した結果、スクリプトが動作しないことを確認できます。

htmlソースを確認すると<input onmouseover=”alert(‘セキュリティテスト’)”>が出力されないことを確認しました。

以下にhtmlソースを示します。(抜粋)

<div id = "yop-poll-question-container-3_yp58de1937f22a2-3" class = "yop-poll-question-container-3_yp58de1937f22a2">
		<div id = "yop-poll-question-3_yp58de1937f22a2-3" class = "yop-poll-question-3_yp58de1937f22a2">securitytest02</div>
		<div id = "yop-poll-answers-3_yp58de1937f22a2-3" class = "yop-poll-answers-3_yp58de1937f22a2">
			<ul>
				<li  class="yop-poll-li-answer-3_yp58de1937f22a2 yop-poll-li-answer-3_yp58de1937f22a2-3">
					<input type="radio" value="3" name="yop_poll_answer[3]" id="yop-poll-answer-3_yp58de1937f22a2-3" /> <label for="yop-poll-answer-3_yp58de1937f22a2-3">securitytest02</label>
				</li>	
			</ul>
		</div>

仕組み

該当するYOP Pollのソースコード(抜粋)を示します。
YOP Poll バージョン 5.8.2では $this->custom_field = sanitize_text_field( $this->custom_field ); が追記されていました。

YOP Poll バージョン 5.8.0

private function insert() {
			$GLOBALS['wpdb']->query( $GLOBALS['wpdb']->prepare( "
					INSERT INTO " . $GLOBALS['wpdb']->yop_poll_questions . "
					SET
					poll_id					= %d,
					question				= %s,
					type                    =%s,
					question_author			= %d,
					question_date			= %s,
					question_status			= %s,
					question_modified		= %s,
					poll_order				= %s
					",

YOP Poll バージョン 5.8.2

private function insert() {
			$this->question = sanitize_text_field( $this->question );
			$GLOBALS['wpdb']->query( $GLOBALS['wpdb']->prepare( "
					INSERT INTO " . $GLOBALS['wpdb']->yop_poll_questions . "
					SET
					poll_id					= %d,
					question				= %s,
					type                    =%s,
					question_author			= %d,
					question_date			= %s,
					question_status			= %s,
					question_modified		= %s,
					poll_order				= %s
					",

まとめ

攻撃シナリオの例としては、WordPressを運営する際にレンタルサーバーを利用し、かつWordPressの管理者が攻撃者である場合、クロスサイトスクリプティングの脆弱性を利用して、同じドメイン上で運営されているWordPressのcookie情報を取得し、他のWordPressの管理者になりすますなどの被害が起きる可能性があると考えられます。

WordPressは5400万回以上ダウンロードされ(2017年3月31日現在)利用者が非常に多く、YOP Pollプラグインも2万回以上ダウンロードされている為、利用者が一定数いると考えられます。
引用:WordPressダウンロード数YOP Poll Active installs

もし、YOP Pollのプラグインを最新版にしていない場合、最新版へ更新されることをお勧めします。

以上です。

  • このエントリーをはてなブックマークに追加

PAGE TOP