Shikata Ga Nai

Private? There is no such things.

What an injection into jQuery-selector can lead toを訳してみた

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, (^^ゞ