クラウド型Web脆弱性診断ツール VAddyブログ

- 継続的セキュリティテストへの道 -

本場のWordPressプラグインのSQLインジェクションはVAddyで検出できるか

この記事で示す内容は日本国内の情報セキュリティ技術者が攻撃のリスクを正しく評価できるようにするための情報共有を目的に提供されます。自身の管理下にないコンピュータ等に対し攻撃やスキャンを実施する行為は場合によっては犯罪行為となりますので絶対に行わないでください。

WP-StatisticsのSQLインジェクション脆弱性

WP-StatisticsというWordPressプラグインSQLインジェクション脆弱性があることが明らかになりました。

www.wordfence.com

上記サイトによるとこのプラグインは60万以上のWordPressインスタンス上で動作しているとのことで、かなりインパクトが大きい脆弱性です。また、WP Statisticsプラグインについての日本語での解説記事も比較的多く見つかることから、国内でもそれなりに広く利用されていると思われます。

脆弱性はどのようなコードに存在するか

このSQLインジェクションの原因は下記コミットログで確認できます。

github.com

SQLを文字列連結で組み立ててしまっているという、SQLインジェクション脆弱性が混入してしまう典型的なパターンです。しかし、今回のコードでは、単純にユーザ入力を無防備に連結したわけではなく、一応、WordPressSQLエスケープするために用意した関数(esc_sql)を経由していました。つまり、このコードを書いた人自身は、「SQLインジェクション対策を行った」と考えている可能性が高いと言えるでしょう。

「esc_sql」という関数の名前から、これで安全性が確保されるように感じる人もいるかもしれません。しかしこちらのマニュアルのページをよく読めばわかるように、この関数は文字列に対して使うために用意されたもので、今回のようにシングルクオートで囲まれていない部分への使用は不適切でした。このように今回の脆弱性「開発者自身はSQLインジェクションの対策を行ったと考えているが、実際にはセキュリティ対策できてない」という形になっています。

VAddyでの検出

VAddyにはSQLインジェクション脆弱性を見つけるために大きくわけて2つの脆弱性診断ロジックが実装されています。一方はシングルクオートやabs関数を使ってウェブアプリケーションが500エラーなどを起こすかどうかを見るもの、もう一方はsleep系の関数を使うTime-basedのもの*1です。

上記のWordfence社のブログには「今回のSQLインジェクション脆弱性はTime-basedなものであり、情報を盗むにはそれなりの時間を要するものだ」と書かれていますが、VAddyの検査ロジックのどちらでも脆弱性を見つけることができました。つまり、今回の脆弱性は必ずしもTime-basedな手法を使わなくても見つかるものであることがわかりました。

調べてみたところ、SQLの内容によってステータスコードが変化するという、SQLインジェクションとしては典型的な挙動となるようで、そのためVAddyのTime-basedではない方のロジックでも見つけることができたようです。

WordPressプラグイン導入時にぜひVAddyでの検査を

VAddyはWordPressプラグインSQLインジェクションを見つけることができます。例えば今回のWP-Statisticsであれば、普通にWordPressにインストールした後、管理画面内に登場するこのプラグイン特有のページを一通りクロールしてから検査すれば、SQLインジェクション脆弱性があることを明らかにできます。WordPressプラグインは便利ですが、開発している人や組織がそれぞれバラバラであるため、コードのクオリティにばらつきがあります。導入前に一度ステージング環境でVAddyを使用することで、新たなプラグインを安心して導入することができるでしょう。

対策したと思っていてもできていないケースに要注意

また、WordPressプラグインに限らず、今回のケースのようにフレームワーク側は開発者に対してSQLインジェクション対策のための手法を提供しているが、その適用方法に致命的な間違いがある」ことによって脆弱性が混入するケースがよくあります。このようなミスもVAddyで動的に脆弱性診断してみることであぶり出すことができます。エスケープ関数を適用したから安心するのではなく、ぜひVAddyを使ってみてください。

おまけ

Wordfence社のブログにもありますが、今回の脆弱性は少し珍しいポイントがありました。SQLインジェクションが発生するURLがWordPress管理画面内のものなので、「管理者以外はSQLインジェクションできないのではないか?そもそも管理者ならばデータベースへのアクセス権限があるのだから、SQLインジェクションがあったとしても現実的には問題にならないのでは?」と思われたのです。

しかし、実は管理者としてログインしていないブラウザからのアクセスであっても、この管理画面内のURLにアクセスすると裏でSQLが動いてしまうため、結果として管理者以外でも(誰でも)SQLインジェクションが成立する、というものでした。おそらく珍しいパターンだとは思いますが、このようなケースがあることを考えると、管理画面側も油断せずにしっかり検査しておくことが大事だと言えるでしょう。

まとめ

今回はVAddyでWordPressプラグインSQLインジェクションを見つけることができること、また開発者が間違ったやり方でセキュリティ対策をした(つもりになっている)場合にもVAddyが役に立つことを示しました。

 

vaddy.net

*1:VAddyのブラインドSQLインジェクション検査