
CalderaForms 1.5.9.1 XSS (WordPress plugin) - チュートリアル
CalderaForms 1.5.9.1 XSS (WordPressプラグイン) - チュートリアル
CalderaFormは、ドラッグ&ドロップで簡単にフォームを作成できるWordPressプラグインです。 最近の活動でいくつかのポータルをテストする機会があり、そのうちの1つはまさにこのプラグインで作成されたお問い合わせフォームをホストしていました。 対象インスタンスのカスタム設定により、脆弱性を発見することができました。その性質はシンプルで入門書的なものであるため、初心者にいくつかのメカニズムを説明する良い口実になると思います。
教育目的専用 - 明示的な許可なく対象をテストするため、または違法な目的でこれらの情報を使用しないでください - 消化中に冷水に飛び込まないでください - 暑いときは玉ねぎのように重ね着をしてください
完全なエクスプロイト:
https://www.exploit-db.com/exploits/44489/
CVE:
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-7747
分析対象の設定では、フォームはユーザーに感謝のメッセージを返し、入力された名前で呼びかけるように設定されていました。
テスト環境を再現するには、ローカルにWordPressインスタンスをインストールし、CalderaFormsバージョン1.5.9.1をインストールします(こちらまたはこちらから入手可能)。
インストール後、WordPress管理コンソール > 左側の列 > 「Caldera Forms」 > 上部ボタン > 「New Form」 > Contact Formを選択し、名前を変更して「Create Form」をクリック

作成後、設定を変更できます:上部ボタン > 「Form Settings」 > Success Messageを変更し、ユーザーが入力したデータの1つを含めるようにします。ボックスをクリックすると、ヒントのドロップダウンが表示されます。
%first_name%を追加

上部ボタン > 「Save Form」
フォームをページに挿入するには:左側の列 > 「Pages」 > 「Sample Page」 > 「Edit」 > 「Caldera Form」 > 先ほど作成したフォームを選択 > 「Insert Form」 > 右側の列 > 「Update」

完了。
分割統治のパラダイムに従い、このタイプの攻撃を構築するために必要な手順を一つずつ見ていきましょう。
テスト段階では、コンポーネントと対話する際、与えた刺激に基づく反応に常に注意を払う必要があります。特に、入力したデータの「経路」とそれらが受ける変換に焦点を当てます。
私たちのケースの具体的な例は次のとおりです:
フォームを含むページにアクセス:http://127.0.0.1/wordpress/sample-page/
フォームに次のデータを入力します
"First Name": myName
"Last Name": myLast
"Email Address": my@e.mail
"Comments": myComm
データはプラグインのロジックに従って処理されます
受け取った感謝メッセージには、First Nameフィールドに入力した文字列が含まれています
"Thank you myName, form has been successfully submitted."

「First Name」フィールドに入力した文字列が感謝メッセージに返されます。
具体的には、その文字列はHTMLのdivタグ内に含まれています。
私たちの入力はページのHTMLに含まれます。
考慮事項:「良い感じだ。接触点がある。」
一歩進みましょう。「処理」フェーズ(手順2)で入力はどのように扱われるのでしょうか?具体的には、使用できる文字(およびその組み合わせ)に制限はあるのでしょうか? もちろん目標は「何か」を注入できるようにすることです。インジェクションを試みる際は、入力がどこにたどり着くかを念頭に置き、適切な「言語」を使う必要があります。
入力はSQLインタプリタで処理される?その言語を話す必要がある
入力はPHPスクリプトで処理される?その言語を話す必要がある
入力はHTMLページにたどり着く?……
したがって、HTMLに典型的な文字や構文を使用できるかどうか、特にこの言語がJavaScriptコードを含む/解釈する能力があるため、「着地ゾーン」である先ほどのdivタグにコードを挿入する戦略を見つけられるかどうかを理解することが重要です。
これを行うために、「First Name」フィールドに単純なHTMLタグを入力し、それが「サニタイズ」(sanitized)されるかどうか、つまり無害/解釈不能に変更されるか、それともそのまま返されるかを確認します。この目的のために、テキストに改行を挿入するタグ<br>を使用します。
以前の番号付けに従って:
フォームに次のデータを入力します
"First Name": m<br>yName
"Last Name": myLast
"Email Address": my@e.mail
"Comments": myComm
感謝メッセージには、変更されていないHTMLタグが含まれており、それが正しく解釈され、メッセージの途中に改行が挿入されます
"Thank you m
yName, form has been successfully submitted."

考慮事項:「良い感じだ。小なりと大なりの記号を使用でき、サニタイズされずに解釈されるHTMLタグを挿入できる。」
一歩前進。フォーマットタグをより有用なもの、例えばページ内にJavaScriptコードを挿入して実行できる<script>タグに置き換えます。
フォームに次のデータを入力します
"First Name": m<script>alert(1);</script>yName
"Last Name": myLast
"Email Address": my@e.mail
"Comments": myComm
感謝メッセージには、変更されていないHTMLタグが含まれており、正しく解釈され、alertボックスが表示されます

考慮事項1:「良い感じだ。ユーザーのブラウザのコンテキストで任意のJavaScriptコードを実行できる。」
考慮事項2:「良くない。JavaScriptを実行するユーザーは自分自身である。」
状況は次のとおりです:自分たちが管理していないサイトを介して、ユーザーのブラウザのコンテキストでJavaScriptを実行できますが、現時点では、そのユーザーはフォームに値を入力した本人です。これはまったく役に立ちません。
アイデアは次のとおりです:実行したいコードを含む感謝メッセージを呼び出す方法はあるでしょうか?
最初の「偵察」サブミット(または最初の手順を再実行)に戻りましょう。
ネットワークトラフィックまたはページのソースを分析すると、フォームがhttp://127.0.0.1/wordpress/cf-api/CF5ad9b3176c0f4(最後の部分は異なる場合があるため、以下のすべての例で適宜変更)へのPOSTリクエストを実行していることがわかります。つまり、アドレスhttp://<target>/cf-api/<form-id>へのPOSTです。
このリクエストの応答は、感謝メッセージを含むいくつかのデータを含むJSONであり、次の構造を持っています:
{
"data":
{"cf_id":"48"},
"html":"<div class=\" alert alert-success\">Thank you myName, form has been successfully submitted.<\/div>",
"type":"complete",
"form_id":"CF5ad9b3176c0f4",
"form_name":"MyContactForm",
"status":"complete"
}
この情報は取っておきます。すぐに戻ります。特に"form_id"と"cf_id"フィールドに注目してください。
POSTが実行されるアドレスには何があるのでしょうか?あまり推測せずに、GETを実行した場合、つまりhttp://127.0.0.1/wordpress/cf-api/CF5ad9b3176c0f4 のページにアクセスした場合、そこにあるのはまさに問題のフォームのHTMLです。
そして、サブミットから生じるネットワークトラフィックを確認します

今回は、ロケーション/wordpress/cf-api/CF5ad9b3176c0f4/?cf_su=1&cf_id=49へのHTTP 302コード(リダイレクト)を受け取り、そのページには感謝メッセージのdivタグを含むHTMLがそのまま返されます。
このアドレスの形式に注目:
http://<target>/cf-api/<form-id>/?cf_su=1&cf_id=<cf-id>
ここで、<form-id>と<cf-id>の値は、先ほど分析したJSONに含まれているもので、それぞれ"form_id"と"cf_id"です。
最初の質問に答えましたか?はい。感謝メッセージの内容を呼び出す方法を見つけました。
考慮事項:「良い感じだ。必要に応じて、データを含むメッセージを呼び出すことができる。」
これまでに収集したすべての情報をまとめ、攻撃を仕立てましょう。
1)ターゲットに悪意のあるコードを保存する
2)そのコードを取得するために必要なデータを収集する
3)攻撃を「トリガー」するための適切なURLを構築する
フォーム(どちらのページでも構いません)に次のデータを入力します
"First Name": m<script>document.body.innerHTML=String.fromCodePoint(128046);</script>yName
"Last Name": myLast
"Email Address": my@e.mail
"Comments": myComm
生成されたトラフィックの分析(sample-pageページの場合は受信したJSONを読み取るか、フォームのみのページの場合はリダイレクトを読み取る)により、form_idとcf_idの識別子を取得します
{
"data":
{"cf_id":"69"},
"html":"...",
"type":"...",
"form_id":"CF5ad9b3176c0f4",
"form_name":"...",
"status":"..."
}
http://127.0.0.1/wordpress/cf-api/CF5ad9b3176c0f4/?cf_su=1&cf_id=69

いくつかの考慮事項:
読者には、関心があれば、以下を提案します:
'(アポストロフィ、シングルクォート)、"(引用符、ダブルクォート)、またはイタリア語キーボードレイアウトにない`(グレイヴアクセント、バックティック、バッククォート)の文字を使用せずに繰り返してください