やられアプリ BadTodo - 13.1 クリックジャッキング

前回:やられアプリ BadTodo - 12 メールヘッダ・インジェクション - demandosigno

該当する機能がマウス操作のみで使用可能な場合、細工された外部サイトを閲覧し操作することにより、利用者が誤操作し、意図しない機能を実行させられる可能性があります。

安全なウェブサイトの作り方 p.41 1.9 クリックジャッキング

まず「安全なWebアプリケーションの作り方 第2版 4.5.2 クリックジャッキング」の実習環境の例から参照します。

こちら罠ページ(サイトA)ですが<iframe>タグを使って上に実際に投稿が行われるページ(サイトB)を重ね合わせ、かつサイトBの見た目を透明にしています。
(実習用仮想マシン (Docker版 Ver 1.1.0) だと「応募」ボタンが「投稿」ボタンとなっていて分かりにくかったので「応募」に直しています)

上に重ねられているサイトBの不透明度を上げていくと

サイトBが現れます。ボタンの位置が同じため、サイトAの「応募」をクリックしたつもりが実際には透明になって上に重ねられているサイトBの「投稿」をクリックすることになり「脅迫文」を掲示板に投稿してしまいます。

(BurpSuiteの組み込みChromiumブラウザだと不透明度の操作がうまく動かなかったためFirefoxで試しています。)

詳細

最初、部品を並べただけだと以下のようになります。
<form>要素と黄色のマージン部分があり、その下に<div>で「クリックしてスマートフォンを当てよう」の部分、その下に<iframe>があります( iframe は frameborder="1" にして枠を表示させました)。

<div style="position: absolute; top:35; left:5; z-index:0;">クリックしてスマートフォンを当てよう</div>のように position: absolute で絶対位置を指定し上に移動させます。

同様に<iframe>も少しずらしてみます。また"z-index: 5"としてデフォルトより優先度を上げているため表側に重なります。

"position: absolute; top: 0px;"にして完全に重ねます。(opacity: 0; frameborder="0" にすれば完成です)

BadTodoの方でも試す

非公開のTodoを公開させます。
事前準備としてtestユーザで1件登録します。

「公開」チェックボックスにチェックが入っていないため非ログインユーザなどには公開されていません。

さて次のような罠ホームページ(trap.example.org)を作り、ログイン中のtestユーザがアクセスしたとします。

透かすとこう。クリックすると「公開」にチェックを入れ「更新」してしまうことになる。

クリック後。公開されてしまった。
CSRFと似た脆弱性と言えます。

実際にはインラインフレーム内のURLに item=10 と変更するitem番号を指定し、この番号の編集権限を持つユーザがアクセスする必要があるため単純にはいきません。
またクリックの画面上の位置はブラウザや環境によって変わりますので微調整してください。

<html>
<head>
<meta charset="UTF-8">
<title>100万円!</title>
</head>
<body style="background-color: #FFFFFF">
  <div style="position: absolute; top:200; left:200; z-index:0;"><img src="./hacker.png" width="359" height="359"></div>
  <div style="position: absolute; top:150; left:300; z-index:0;">100万円あげるから</div>
  <div style="position: absolute; top:280; left:180; z-index:0;">○←ココと</div>
  <div style="position: absolute; top:515; left:47; z-index:0;">○←ココをクリック</div>
  <iframe src="https://todo.example.jp/edittodo.php?item=10" style="position: absolute; top: 0px; left: 0px; z-index: 5; opacity: 0;" width="880" height="750" frameborder="1"></iframe>
</body>
</html>

サードパーティクッキーの廃止について

注:サードパーティクッキー(訪問しているWebサイト trap.example.org とは異なるドメイン todo.example.jp から発行されるクッキー)が段階的に廃止され始めており、iframe内のページをうまく読み取れない可能性があります。
クッキーがブロックされ、ログイン状態になっていないためです。

URL左のアイコンをクリックし→「トラッキング防止」の部分を確認するとブラウザの機能により「サードパーティクッキーの使用が制限」されていることが分かります。

URL右の眼のアイコンに「\」のマークで禁止されていることが一目で分かるようにもなっています。

サードパーティクッキーの使用を許可し、ページを再読み込みすると問題なく読み取れるようになっているはずです。(キャッシュを消すためスーパーリロードしてください)

サードパーティ Cookie の段階的廃止に備える  |  Privacy Sandbox  |  Google for Developers
追記:Google、サードパーティークッキー廃止方針を撤回 - 日本経済新聞

次回:やられアプリ BadTodo - 13.2 クリックジャッキング対策方法(X-Frame-Optionsヘッダ) - demandosigno

/* -----codeの行番号----- */