WordPress 用プラグイン Forminator Forms – Contact Form, Payment Form & Custom Form Builder は、不十分な入力サニタイズと出力エスケープにより、1.50.2 を含む全バージョンにおいて、form_name パラメータを介した Stored Cross-Site Scripting の脆弱性があります。これにより、管理者レベルのアクセス権を持つ認証済み攻撃者が、任意の Web スクリプトをページに注入し、ユーザーがその注入されたページにアクセスするたびに実行させることが可能になります。このプラグインは、管理者が下位レベルのユーザーにフォーム管理権限を付与することを許可しているため、購読者などのユーザーによっても悪用される可能性があります。
根本原因は、ロジックバグに対する認識の繊細さを必要とするものです: (ファイル /fields/html.php 内のこの関数)
public function markup( $field, $views_obj ) {
$settings = $views_obj->model->settings;
$html = '';
$label = esc_html( self::get_property( 'field_label', $field ) );
$id = self::get_property( 'element_id', $field );
$form_id = false;
$html .= '<div class="forminator-field forminator-merge-tags" data-field="' . $id . '">';
if ( $label ) {
$html .= sprintf(
'<label class="forminator-label">%s</label>',
self::convert_markdown( $label )
);
}
// Check if form_id exist.
if ( isset( $settings['form_id'] ) ) {
$form_id = $settings['form_id'];
}
// To allow iframes in content.
add_filter( 'wp_kses_allowed_html', array( 'Forminator_Core', 'add_iframe_to_kses_allowed_html' ) );
$content = wp_kses_post( self::get_property( 'variations', $field ) ); // root cause here
remove_filter( 'wp_kses_allowed_html', array( 'Forminator_Core', 'add_iframe_to_kses_allowed_html' ) );
$html .= forminator_replace_variables(
$content,
$form_id
);
$html .= '</div>';
return $html;
}
このコードは、低権限ユーザーからの XSS を防ぐためにサニタイズ関数(wp_kses_post)を使用していますが、問題は変数を置換する前にサニタイズしていることです。その結果、適切な権限を持つ攻撃者は、有効な HTML タグを使用して wp_kses_post をバイパスし、XSS をトリガーするために JavaScript ペイロードを変数に注入することができます。
Edit Form 権限を持つ攻撃者は、HTML フィールドに次のような HTML を挿入できます
そして、form_name を次のように変更します
javascript:alert(1) or javascript:<Payload>
| スコア | 深刻度 | バージョン | ベクター文字列 |
|---|---|---|---|
| 4.4 | MEDIUM | 3.1 | CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:C/C:L/I:L/A:N |
私の意見では、このバグは深刻度が高いわけではありませんが、ロジックとコードレビューに対する繊細な認識を必要とします。ほんの 2 行のコードの間にある小さなミスが脆弱性を生み出すことが、ご覧のとおりです。
もしこの種の研究に共感し、さらなる調査を支援したいと思われるなら、寄付やサポートをしていただけると幸いです。ご協力に感謝いたします。
╰(°▽°)╯