このブログではお久しぶりです。azaraです。
近況の報告などは別の記事で書くとして、本記事はIPFactory Advent Calendar 2020の17日目の記事です。IPFactoryに関してはこちらをご覧ください。
注意喚起
本ブログの内容はセキュリティに関する知見を広く共有する目的で執筆されており、脆弱性の悪用などの攻撃行為を推奨するものではありません。許可なくプロダクトに攻撃を加えると犯罪になる可能性があります。筆者が記載する情報を参照・模倣して行われた行為に関して筆者は一切責任を負いません。
また、該当製品は常に今回する脆弱性への修正を行っているため、影響を確かめながらアップデートを行うことを強くお勧めします。
JVN#56450373 GROWI における複数の脆弱性 / JVN#94169589 GROWI における複数の脆弱性
今回採番されたCVE
- CVE-2020-5676
- CVE-2020-5677
- CVE-2020-5678
- CVE-2020-5682
脆弱性解説
今回報告した脆弱性において、RCEやNoSQLiなどの脆弱性は報告していないため、緊急度の高いものではありません。ただし、攻撃手法に関しては簡単なものが多かったため先の注意喚起でも述べた通り、影響を確かめながらアップデートを行うことを強くお勧めします。
CVE-2020-5676
ユーザーが設定した非公開状態のemailがHTML常に表示されているというものです。
再現手順
- メールアドレスの公開を非公開に設定

- 別アカウントでログインをし先程設定したユーザーのページを閲覧する
DevツールなどでHTMLを確認するとユーザー情報がJSON形式で表示されている。その中に先程設定したメールが表示されている。

リスク
遠隔の第三者によって、ユーザが非公開にしている情報を窃取され。
修正状況
emailが表示されていたid=content-mainを確認すると、emailが表示されていないことが確認できます。

CVE-2020-5677
Header タグ内にPathが出力された際のXSSフィルターの処理が不完全な状態だったためHTMLタグが出力されてしまい、XSSが実行できてしまう脆弱性でした。
Pathをtitleに表示するページ全般で発生し、攻撃の手法としては簡単に実行できてしまいます。
Plane : http://localhost:3000/Sandbox</title</s>><script<s>>alert(1);</script</s>>
URL encode: http://localhost:3000/Sandbox%3C/title%3C/s%3E%3E%3Cscript%3Cs%3E%3Ealert(1);%3C/script%3C/s%3E%3E
再現手順
報告当時のGrowiではXSS対策のためにタグ文字(例: <s>のように完全に閉じられたもの)を削除するという機構がありました。
実際にリクエストを投げると次のように表示されます。
URL: http://localhost:3000/Sandbox%3Cs%3Ehoge%3C/s%3E

CTFの問題でみたことのある挙動だったので試しに<s<s>>hoge</s<s>>のような形式で入力をしてみました。
URL: http://localhost:3000/Sandbox%3Cs%3Cs%3E%3Ehoge%3C/s%3Cs%3E%3E

すると素直にタグが表示されるようになりました。あとは</title>でタグを閉じられ、<script></script>が挿入できればXSSができます。
そこでこの機構を回避するために</title<s>><script<s>>alert(1)</script<s>>のような入力をURLに行いました。
URL: http://localhost:3000/Sandbox%3C/title%3Cs%3E%3E%3Cscript%3Cs%3E%3Ealert(1)%3C/script%3Cs%3E%3E
するとalert(1)の表示がポップアップします。

HTMLの表示を確認すると、HTMLタグが表示されておりXSSが作動していることが確認できます。

リスク
当該製品を使用しているサイトにアクセスしたユーザのウェブブラウザ上で、任意のスクリプトを実行される 。
修正状況
/より右に位置する文字列のみ<title>内に表示することで修正されていました。
CVE-2020-5678
ページの配下にあるページをリストで表示する箇所で発生したXSSで、先のCVE-2020-5677の発展で発見したものです。
再現手順
XSSフィルター自体がマークダウンには有効でしたがそれ以外の部分ではCVE-2020-5677同様のXSSへの対策機構を利用していました。
検証のため、まず初めに<s>test1</s>のようなタイトルて新規ページを作ってみましょう。

するとPathでは<s>test1</s>のURLエンコードされた文字列が見えます。
しかし、HTMLの表示上は反映されていなさそうです。

そのあと新規作成をする際のリクエストを見ても、<s>タグは削除されて送信されています。

リストの表示上も当然、打ち消されていません。

次に先程のCVE-2020-5677同様に<s<s>>test2</s<s>>のような形式でページを作成しましょう。

文字符号化はしてそうですが表示されているのがわかります。

一部ではありますがHTML上に表示されているPathを見ても文字符号になっています。

リクエストをみると<s>test2</s>となっているのでもしかしたらと思いリストを見に行きます。

確認をすると、<s>タグはしっかりと削除されています。

最後の確認として、CVE-2020-5677よりもう一つ<s>タグを増やしページを作成します。

実際に新規作成をしてみると<s>タグが打ち消し線を引いているのがわかります。

最後に<script<s<s>>>alert(1)</script<s<s>>>でページを作ってみましょう。

でました。

修正状況
ページ名に含まれるタグ文字がリストに表示される場合は削除された状態で表示されるようになっている。
CVE-2020-5682
Growiでは記事に対してタグを付与することができます。このタグを検索するAPIでは、mongodbの正規表現検索を利用しており、その検索の際にAPIの正規表現を直接利用しているためDoSを引き起こすことができました。
謝辞
脆弱性の修正を行ってくださった開発者の皆様、そして関連する業務やサポートをしてくださったJPCERT/CC,IPAの皆様に心より感謝申し上げます。
ありがとうございます。
また、注意喚起のため詳細の開示を許していただいたGrowiの開発陣には改めて感謝申し上げます。