Armoris日記 CVE-2020-14092編

今回はTwitterでの情報収集中にCVE-2020-14092*1に関するTwitterのツイートを発見したので、今回の日記は、これを取り上げます。
ツイート発見時には、まだPoC*2は公開されていなかったため、技術的知見・調査スキル向上を兼ねて実際のコードを見ながら自ら調査をしてみました。

CVE-2020-14092の概要

WordPressプラグインであるPayment Form For Paypal ProのVer. 1.1.64以下でSQLインジェクションが可能になるというものです。
脆弱性に関する情報はこちらに詳しくまとめられています。

調査してみました

まず脆弱性が修正されたバージョンである1.1.65と脆弱性修正前の1.1.64で差分を確認して、どの部分に問題があったのかを確認します。

画像は、以前Armoris日記で紹介したdiffコマンドを使用して比較してみたものです。結果は一部省略しています。

$ diff -u -r 1.1.64 1.1.65
diff -u -r 1.1.64/README.txt 1.1.65/README.txt
--- 1.1.64/README.txt   2020-04-06 10:22:04.000000000 +0900
+++ 1.1.65/README.txt   2020-06-14 09:36:50.000000000 +0900
@@ -323,7 +323,10 @@
 = 1.1.64 =
 * WordPress editor block update

+= 1.1.65 =
+* Bug fixes
+
 == Upgrade Notice ==

-= 1.1.64 =
-* WordPress editor block update
\ No newline at end of file
+= 1.1.65 =
+* Bug fixes
\ No newline at end of file
・
・
・

差分を確認するとバージョン1.1.65では特定のファイルに大幅な変更が加えられていることがわかりました。 この部分が脆弱性の原因だと考えられるので(脆弱性があるので修正されているのではないか?)、そのファイルを詳しく分析すると、データベースの操作を行う処理が含まれていることが確認できました。 f:id:Armoris:20200717104144p:plain

今回の脆弱性SQLインジェクションであるため、データベースのクエリー周りを調査してみました。すると、URLに含まれるパラメータの値をそのままデータベースに渡している部分があり、そのコードが今回の原因である可能性が高いと考えました。

実際に脆弱性の再現のためプラグインを導入した環境を用意して(注:隔離された検証用環境です)、不正なパラメータが含まれるURLでアクセスしてみたところ、実際にユーザー情報を含めたデータベースに保存されている情報を不正に閲覧できてしまうことが確認できました。

以下の画面は、実際にブラウザーで不正なパラメーターを用いてデータベースに保存されたユーザー情報を表示した際の出力結果です。 f:id:Armoris:20200715185104p:plain 以下は実際に用意したデータベースにSQLインジェクションで実行したのと同じSQL文を実行した結果。

+----+------------+------------------------------------+---------------+-------------------+----------------------------+---------------------+-----------------------------------------------+-------------+--------------+
| ID | user_login | user_pass                          | user_nicename | user_email        | user_url                   | user_registered     | user_activation_key                           | user_status | display_name |
+----+------------+------------------------------------+---------------+-------------------+----------------------------+---------------------+-----------------------------------------------+-------------+--------------+
|  1 | admin      | $P$B8UCCMBwHiw1PV7rhJX/9JvOlhM53p/ | admin         | admin@admin.local | http://172.20.100.120:6014 | 2020-07-15 03:19:19 |                                               |           0 | admin        |
|  2 | USER       | $P$BaHDWUrgO/fvZMU4tAG9.Jj5nCNbhi/ | user          | user@user.local   |                            | 2020-07-15 03:49:52 |                                               |           0 | USER         |
|  3 | Subscriber | $P$BK0wIIW7Zbfjv.IbClX4LaZ3vkXWmt0 | subscriber    | s@s.local         |                            | 2020-07-15 03:50:22 | 1594785022:$P$BN7PmFJN83JE7SU7sKgxTlqbnbkDqs/ |           0 | Subscriber   |
+----+------------+------------------------------------+---------------+-------------------+----------------------------+---------------------+-----------------------------------------------+-------------+--------------+

調査してみて

今回は実際にコードを見てそこから調査を行ったおかげで、このプラグインが書かれた言語である「PHP」の関数や変数の書き方などについて学ぶいい機会になりました。また、自分でコードを見ながら調査することでプラグインの構造もよくわかり、知識の引き出しが増えたと思います。安全な検証用環境を構築して、脆弱性をコードから構造的に調査することで、サイバーセキュリティースキルのレベルアップになるかもしれないと感じました。(個人の意見です)

*1:CVEとは情報セキュリティにおける脆弱性や、インシデントについて固有の名前や番号を付与し、リスト化したもの

*2:PoCとは検証やデモンストレーションという意味で、この場合脆弱性の検証コードを指します