【セキュリティ学習】WordPress関数get_search_queryに細工して、フォームからjavascriptを実行する方法
| 更新: 2024/02/10 | 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に使います)。
■esc_url(WordPress codex)
https://wpdocs.osdn.jp/関数リファレンス/esc_url
■esc_html(WordPress codex)
https://wpdocs.osdn.jp/関数リファレンス/esc_html
PHPでは『htmlspecialchars()』でエスケープ処理する
管理人はPHPプログラミングで、1からメールフォームを作ったときがあったんですけど、このときは『htmlspecialchars』を使って、フォームからうけとった値にエスケープ処理をかけていました。
変換対象となる文字は『& (アンパサンド)・” (ダブルクォート)・’ (シングルクォート)・< (小なり)・> (大なり)』とのことです。
このほかに『flags 定数で、Unicode代替置換・シングル/ダブルクオート置換設定などを調整』という機能もあるので、プログラミングに興味がある方は、こちらもチェックしてみてください。
■htmlspecialchars(PHPマニュアル)
https://www.php.net/manual/ja/function.htmlspecialchars.php
WordPress関数get_search_queryに細工して、フォームからjavascriptを実行する方法
通常の、エスケープ処理がされている状態
テストサイトです。WordPress使用。WordPress公式のテーマは基本的に、『検索フォームに入力した値にはエスケープ処理がかかる』という形になっているので、スクリプトをフォームに入力しても、実行されません。テーマにもよりますが、search.phpあたりのファイルでesc_htmlがクエリにたいしてかかってることが多いです。
これはもちろん、リンクに対しても同様です。リンクタグをフォームにぶちこみましたが、リンクタグとしては機能しません。
get_search_queryパラメーターにfalseを渡すと、エスケープが解除される
で、テストサイトで使ったテーマ『onepress』の検索結果ファイル(search.php)部分です。公式テーマに出てくるものなので、基本的には、検索クエリにはエスケープ処理がされています。get_search_queryも、元の状態ではエスケープされているんですが、『false』を渡すとエスケープ解除することができます。
get search query(WordPress codex)
https://wpdocs.osdn.jp/関数リファレンス/get_search_query
結果:javascriptが実行され、リンクも機能するようになる
get_search_queryに細工した結果、フォームにjavascriptを入力したら、実行されるようになりました。 これはただのalertなので被害はでないんですけど、『ログイン状態のhttpクッキーをパクる』『勝手に転送』みたいなのもあって危険なので、エスケープは忘れず行いましょう。
リンクについても、エスケープ状態ではただの文字列が出ていたものが、リンクとして機能しています(マウスオーバーでリンク下線が出る)。
あとがき・まとめ
- WordPressはesc_urlやesc_html、PHPではhtmlspecialcharsでエスケープ処理ができる
- get_search_queryはパラメーターでエスケープ解除でき、フォームからのjavascript実行も可能になる
まとめると、こんなところでしょうか。悪意あるスクリプトはwafでハネたりもできますけど、基本的なエスケープ処理を忘れずに行うことで、リスクは低減できます。 WordPressユーザーの方は、『ファンクションによってエスケープがかかる/かからない』なども確認しておくと良いでしょう。
【カテゴリ】- 雑談/ニュース/ブログ
【タグ】- PHP, WordPress, エスケープ処理