Hello there, ('ω')ノ
jQuery-selectorへの注入がもたらす可能性のあるものを。
脆弱性:
CSRF
記事:
https://systemweakness.com/what-an-injection-into-jquery-selector-can-lead-to-1fcaabfd51e5
どういうわけか、ユーザ調査のようなページに出くわして。
調査の所有者は、(事前に準備されたリストから)調査に含める質問を選択して。
保存すると、フォームでサーバに移動します
{“chosen_questions”: [“country”, “gender”, “favorite_movie”]}
提供された質問のいずれにも一致しない文字列も含めて。
この配列に任意の文字列を追加できることがわかって。
これらの文字列は非常に正常に保存されて。
訪問者がアンケートに参加すると、質問付きのこのJSONがHTML内に表示され。
クライアント側で次のフォームが作成されて。
<form id=questions>
<input id=country>
<input id=gender>
<input id=favorite_movie>
</form>
そして、次のようなことを行うフォーム送信機能もあります
var results = {};
for (q of chosen_questions) {
results[q] = $('form#questions > input#' + q).val()
}
send_post('/results', results);
ユーザーがフォームに記入して送信すると、アンケートの所有者は。
自分の個人アカウントでユーザのメールを確認できて。
これにより、回答が得られて。
ご覧のとおり、質問名はフィルタリングなしでjQueryセレクタに挿入され。
jQueryバージョンが最新であるため、XSSを忘れることができて。
これまでjQueryを実際に使用したことがありませんが。
セレクターの少し異なるバリエーションを調べてみると。
興味深い動作が見つかって。
ページにid=invalidの要素がない場合。
セレクタは、$(‘#invalid,#valid’)のようになりますが。
2番目のid=validを返して。
つまり、複数のセレクタをコンマで区切ることができ、それらは1つずつ実行され。
そのうちの1つが成功するとすぐに、要素が返されて。
セレクタ内にインジェクションがあったので。
調査ページで機密データを含む入力を探すると。
他の形式のCSRFトークンを見つけて。
<input name=csrf value=123123123>
最後に、次の攻撃シナリオを作成して。
1.質問のリストとして、次のようなものを保存してアンケートを作成して。
{“chosen_questions”: [“country”, “gender”, “INVALID, [name=’csrf’]”]}
2.ユーザがアンケートを開き、フィールドに入力して[送信]ボタンを。
クリックすると、フォーム送信機能がJSONの質問を順番にループし。
jQueryセレクタに挿入して、目的の入力を見つけるとその値を結果にいれて。
3.3番目の質問になると、jQueryは次のようなセレクタを使用して。
入力を検索して。
$(‘form#questions > input#INVALID,[name=”csrf”]’)
form#questions > input#INVALID要素が最初に検索されますが。
IDがINVALIDの入力がないため、セレクタのこの部分は無視されて。
次に、要素[name='csrf’]が検索されて。
これは、入力と内部のCSRFトークンを照合して。
正常に検出され、その値が結果に含まれて。
したがって、フォームを送信した後。
攻撃者は、被害者のCSRFトークンを3番目の質問への回答として見ることができて。
特にすばらしいのは、各回答に自動的に添付されるため。
ユーザのメールも利用できることで。
したがって、この特定のユーザのCSRFトークンが含まれる特別に作成された。
CSRFフォームへのリンクを記載した電子メールを各被害者に送信し。
被害者に代わってサービスのリクエストを偽造することができて。
Best regards, (^^ゞ