私は見ていますXSSゲームと呼ばれるこの1チャレンジジェフ。
課題は、と呼ばれるクエリパラメータ取るjeff
入力として、およびという名前の変数に格納しますjeff
。課題の目標は、ページ上の警告ボックスをロードすることです。解決策は、内Javascriptを実行するためにハイフンを使用してeval()
機能。
そこで、我々はこの評価を持っています:
eval(`ma = "Ma name ${jeff}"`)
そして、警告ボックスを取得するためのソリューションの入力がある(!スポイラー警告ませしゃれは意図していません。):
"-alert(1337)-"
今、私はJavascriptがそれらのハイフンを扱う方法を理解の切実に必要です!助けて!?
サイトが使用するコードは次のとおりです。
let jeff = (new URL(location).searchParams.get('jeff') || "JEFFF")
eval(`ma = "Ma name ${jeff}"`)
注searchParams
あなたに与えURLSearchParams
たオブジェクトを、その.get
方法は、あなたに与えた文字列パラメータに対応します。だから、客観的に挿入、一部の文字を考え出すことです
ma = "Ma name <CHARACTERS>"
そして、、任意のコードの実行で結果を実行します。
最初のステップは、内の文字囲むようにある"
後の文字列リテラルを終了するように、Sのname
文字の後に文字列リテラルを再開する。
ma = "Ma name " <SOMETHING ELSE> ""
だから今は、ソート文字に入ることができるかを把握する必要があり<SOMETHING ELSE>
、有効なJavaScriptコードになりますました。
あなただけに置けばalert()
、それは有効になりません。
ma = "Ma name " alert() ""
それは構文エラーです。あなたは何を示すために何かを必要とするalert
だけで、それの前に来る文字列リテラルトークンに関係しています。Aは、-
トリックを行うことができますが、そのいずれかの他のオペレータ、などの可能性+
、%
などが。あなたはまたの終わりを接続する必要がありalert
、文字列リテラル、最後に別のオペレータのためにこのように必要性を再開して:
ma = "Ma name "-alert('foo')-""
// ^^^^^^^^^^^^^^^^
ma = "Ma name "-alert('foo')-""
だから、挿入する必要がある文字は、次のとおりです。
"-alert('foo')-"
文字列が検索パラメータの内部に配信されているので、注意することを+
リテラル文字として解釈されることはありません+
、むしろ、それがすることがあります- スペースとして解釈。だから、jeff="+alert(1337)+"
仕事ではなくなりjeff="%2balert(1337)%2b"
ます。
彼らはにつながるため、セミコロンは、同様に動作します。
ma = "Ma name " <SOMETHING ELSE> ""
ma = "Ma name "; alert() ;""
これは有効な構文です。