危険なWordPressプラグインの作り方
WordBench東京 3月勉強会「WordPress プラグイン祭り」の発表資料です。
WordPressプラグインの脆弱性の分類
〜Sucuriブログからの抜粋を添えて
SQLインジェクション
-
$wpdb
の間違った使い方により発生。外部からデータベースから自由に情報が取り出せたり、変更できたり - 結果、ログインパスワードのハッシュが窃取されるなどの被害が起こる
クロスサイトスクリプティング
- Javascript を含んだ文字列が画面に表示されてしまうバグ。ログイン中の管理者のブラウザをJavascriptで操って不正な操作を行わせたり、Cookie情報を盗んだり
バックドア
- やりたい放題(ノ´∀`)ノ
- ファイル作成処理の不備により、攻撃者が外部からサーバーにファイルを作成できてしまう
- コード実行処理の不備により、攻撃者が外部から任意のコードを実行できてしまう
ローカルファイルインクルージョン
- 攻撃者が
wp-config.php
など重要なサーバー上のファイルの内容を読めてしまう
権限昇格
- 実行権限チェックの不備、または未実装により、本来管理者でしかできない操作が、管理者以外、悪い時にはログイン不要で実行できてしまう。プラグインではないが、WP Rest API の脆弱性が記憶に新しい
対策
そもそも、危険なことをしない
- m9( ゚Д゚) <その処理、あなたのプラグインで本当に必要不可欠ですか?
- SQLの実行が本当に必要?
- 本当にサーバーにファイルを作成する必要がある?
- 本当に任意のコードを実行する必要がある?
- 本当にファイルをインクルードする必要がある?
- 管理者にしかできてはいけない操作を、わざわざプラグインからできるようにする必要がある?
危険なことをするときは、危険なことをしてるという自覚を持つ
- 危険なものはちゃんとチェックする
$wpdb->prepare()
validate_file()
-
$_GET
,$_POST
,$_REQUEST
- ユーザーは信頼しない、自分も信頼しない
危険なプラグインの作り方
-
横着する、これに尽きる
- APIで実現可能なのに面倒だからSQLでやっちゃう
- 必須でもないのに、ちょっとしたログや一時データの保管に、面倒だからファイルを作っちゃう
-
update_option()
の第1引数を動的にしちゃう -
require()
fwrite()
の対象を動的にしちゃう - エスケープせずに画面に表示しちゃう
危険なプラグインを作っていませんか?
自己チェックに便利なツールを開発しました!
インストール方法
git clone https://github.com/hissy/php-code-scanner.git
composer install
実行方法
bin/console wp-code-scanner /path/to/your-plugin
最後に宣伝:WordPress の解説書を執筆しました
エンジニアのためのWordPress開発入門
- WordPress を知らないエンジニアが初めて WordPress に触れたとき、戸惑わないための本
- 絶賛発売中! → Amazon
- 著者:野島 祐慈、菱川 拓郎、杉田 知至、細谷 崇、枢木 くっくる
もひとつ宣伝
コンクリートファイブジャパン株式会社では、案件増加、事業拡大につき絶賛新規採用募集中!
未経験可
- ディレクター
- PHPエンジニア
- インフラエンジニア
詳細は懇親会で!