ID Attribute
October 1, 2020
Category
Attack
id
属性はHTML要素を識別するために広く利用されています。残念ながらクロスオリジンのウェブサイトでfocus
イベントとURL
フラグメントを利用することによって、ページのどこにid
属性が与えられているかを決定することができます。例えば、https://example.com/foo#bar
が読み込まれると、ブラウザはid="bar"
が与えられた要素までスクロールしようとします。これはクロスオリジンのサイトで定義したiframeでhttps://example.com/foo#bar
を読み込むことによって検出することができます。もし、 id="bar"
を持つ要素がある場合は、 focus
イベントが発生します。 focus
イベントもまた同じ目的で使用することができます1。
いくつかのウェブアプリケーションはfocusable
要素にid
属性を設定しており、ユーザ情報の開示につながります。これらのid
属性には、ユーザに直接関連する機密情報やユーザの状態(アカウントの状態)に関連する情報を含めることができます。
コード #
以下のコードは別のサイトからID属性を検出する例を示しています:
// onblurイベントをリッスン
onblur = () => {
alert('Focus was lost, so there is a focusable element with the specified ID');
}
var ifr = document.createElement('iframe');
// ページに id="x" のフォーカス可能な要素がある場合、フォーカスを得ることができます。
// 例: <input id="x" value="test" />
ifr.src = 'https://example.org/#x';
document.body.appendChild(ifr);
info
上記の手法はFireFoxではうまく動作しない可能性があります。
攻撃シナリオ #
id
属性を利用した攻撃は以下のような物があります。
- とある銀行がモバイルデバイスのセッションを認証するために短い数字のワンタイムPin(OTP)を生成することを許可しています。この銀行のページはクライアントにPINコードを表示するための
button
要素のid
にOTPコードそのものを使用していました。この挙動を悪用し、すべてのオプションをブルートフォースすることでOTPコードを窃取し、ユーザアカウントを侵害することができます。 - とあるウェブアプリケーションが、プレミアムアカウントのステータスを持つユーザや、特定の性別のユーザである場合、あらかじめ定義された
id
とHTML
要素の組み合わせを利用します。攻撃者は、被害者のページに特定のid
があるかを検出し、被害者のアカウント情報を漏えいさせることができます。
対策 #
Document Policies | SameSite Cookies (Lax) | COOP | Framing Protections | Isolation Policies |
---|---|---|---|---|
✔️ | ✔️ | ✔️ | ❌ | FIP |