【セキュリティ学習】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のアーカイブって、記事が増えると長くてたいへん!CSSで短くして使いやすくするには?
WPカスタムフィールド~記事にthe_metaでフィールド出力&評価つける・get_post_metaとの違い
cssフレームワーク利用サイトで、意図しないpaddingなどを消すには?→同クラス上書き(例:bootstrap)
WordPressで車販売サイトが作れる『Car Dealer, Classifieds & Listing』・英語なのでネックも
WPカスタムフィールドを使って、soundcloudみたいに記事一覧でオーディオ再生できるサイトを作る方法
wordpressの仕組み~ヘッダーに入ってくるCSSは、どのように出力されるか(wp_headにcustomize_cssをadd_action)
【WordPressテーマ改造】カスタマイザープレビューが表示されなくなった件の対応(ファンクション名変更・twenty seventeen)
ワードプレスサイトを独自ドメインで公開するまでの流れや注意点
WordPressサイトの独自ドメイン解除方法
【WordPressフィールド画像取得】array_push&foreachループ、代替テキストをクラス出力、表示/非表示を切り替える方法
【CSSエディット】『&nbsp;』みたいな空白スペース・改行タグでレイアウト調整が良くない理由
【おすすめWordPressテーマ】Maxwell~シンプル・洗練されたブログメディア向きテーマ・スライダーやレイアウト変更も簡単