【セキュリティ学習】WordPress関数get_search_queryに細工して、フォームからjavascriptを実行する方法

                    更新: 2022/01/12   2561文字

今回は管理人のセキュリティ学習の一環として、『WordPressテストサイトを作って、自分でサイバー攻撃仕掛けてみた』というのをやったので、内容をお話しします。『フォームからjavascriptを実行』みたいなのは危険ですが、エスケープ処理の重要性がわかるかもしれません。さっそく確認してみましょう。
(許可なく他人のサイトに対して行うと、不正アクセス禁止法などの罪に問われるので注意しましょう。)

WordPress / PHPでのエスケープ処理方法

フォームから受け取った内容や、出力内容に悪意のあるスクリプトやリンクが含まれると良くないので、基本的にエスケープ処理して無害化することが推奨されています。ここでは予備知識として『WordPress組み込みファンクション』『PHPファンクション』の、よく使われるエスケープ処理をまとめます。

WordPressはesc_urlやesc_htmlを使ってエスケープする

WordPress開発者の間でおなじみになっている事柄に『get_〇〇〇じゃなくてthe_〇〇〇を使え』というのがあります。なんでかというと、『内部でesc urlやesc_htmlでエスケープ処理がかかる』からです。これはWordPressのエスケープ処理で使われる関数です。

そのほかテーマなど(例Twenty Twenty-One)でも、『 esc_html( get_search_query() )』のように使われています。

リンクタグやスクリプトのカッコを『>』のように変換して、無害化してくれる組み込みファンクションです(esc_htmlはhtmlブロック、esc_urlはurlに使います)。

PHPでは『htmlspecialchars()』でエスケープ処理する

管理人はPHPプログラミングで、1からメールフォームを作ったときがあったんですけど、このときは『htmlspecialchars』を使って、フォームからうけとった値にエスケープ処理をかけていました。

変換対象となる文字は『& (アンパサンド)・” (ダブルクォート)・’ (シングルクォート)・< (小なり)・> (大なり)』とのことです。

このほかに『flags 定数で、Unicode代替置換・シングル/ダブルクオート置換設定などを調整』という機能もあるので、プログラミングに興味がある方は、こちらもチェックしてみてください。

WordPress関数get_search_queryに細工して、フォームからjavascriptを実行する方法

通常の、エスケープ処理がされている状態


テストサイトです。WordPress使用。WordPress公式のテーマは基本的に、『検索フォームに入力した値にはエスケープ処理がかかる』という形になっているので、スクリプトをフォームに入力しても、実行されません。テーマにもよりますが、search.phpあたりのファイルでesc_htmlがクエリにたいしてかかってることが多いです。


これはもちろん、リンクに対しても同様です。リンクタグをフォームにぶちこみましたが、リンクタグとしては機能しません。

get_search_queryパラメーターにfalseを渡すと、エスケープが解除される


で、テストサイトで使ったテーマ『onepress』の検索結果ファイル(search.php)部分です。公式テーマに出てくるものなので、基本的には、検索クエリにはエスケープ処理がされています。get_search_queryも、元の状態ではエスケープされているんですが、『false』を渡すとエスケープ解除することができます。

結果:javascriptが実行され、リンクも機能するようになる


get_search_queryに細工した結果、フォームにjavascriptを入力したら、実行されるようになりました
これはただのalertなので被害はでないんですけど、『ログイン状態のhttpクッキーをパクる』『勝手に転送』みたいなのもあって危険なので、エスケープは忘れず行いましょう。


リンクについても、エスケープ状態ではただの文字列が出ていたものが、リンクとして機能しています(マウスオーバーでリンク下線が出る)。

あとがき・まとめ

  • WordPressはesc_urlやesc_html、PHPではhtmlspecialcharsでエスケープ処理ができる
  • get_search_queryはパラメーターでエスケープ解除でき、フォームからのjavascript実行も可能になる

まとめると、こんなところでしょうか。悪意あるスクリプトはwafでハネたりもできますけど、基本的なエスケープ処理を忘れずに行うことで、リスクは低減できます。
WordPressユーザーの方は、『ファンクションによってエスケープがかかる/かからない』なども確認しておくと良いでしょう。

WordPressサイト制作&リニューアル・機能開発サービス | アトリエSS


【カテゴリ】 - webサイト制作関連
【タグ】 - , ,

  関連記事

【WordPressテーマ改造】カスタマイザープレビューが表示されなくなった件の対応(ファンクション名変更・twenty seventeen)
WordPressサイトの独自ドメイン解除方法
WPカスタムフィールド~記事にthe_metaでフィールド出力&評価つける・get_post_metaとの違い
baserCMS(ベーサーシーエムエス)サイト制作2~テーマCSSやパーツPHP編集でデザイン
【WordPress2019公式テーマ】Twenty Nineteenってどう?→文字デカすぎ&PCも1カラムは難点・ブロックエディタとの親和性はok
【WP/contact form 7】$_POST変数の中身で判定して、『メール送信ありがとうページ』に遷移させる方法
WordPressで車販売サイトが作れる『Car Dealer, Classifieds & Listing』・英語なのでネックも
wordpressの仕組み~ヘッダーに入ってくるCSSは、どのように出力されるか(wp_headにcustomize_cssをadd_action)
ワードプレスホームページ制作『ブログ記事投稿ページ・固定ページ』使い分け
【悲報】アメブロがヤバい(特に無料プラン・スマホレイアウト)書いても書いても売れないのは何故?
【WordPressフィールド画像取得】array_push&foreachループ、代替テキストをクラス出力、表示/非表示を切り替える方法
ランキングサイト:ブログ村で、複数のブログをひとつのアカウントで管理する方法