web-dev-qa-db-ja.com

jQueryセレクター内のエスケープされた等号を使用したXSS

Webサイトでは、セレクターに既知のXSS脆弱性があるjQuery 1.8.3を使用しています。 ( https://snyk.io/vuln/npm:jquery:20120206 )。

セレクター内でフィルター処理され、URLデコードされた_document.location.hash_(以下の_val2_)値を渡します。

_$('div[data-foo=\''+filter(val1)+'\'][data-value=\''+filter(val2)+'\']')

function filter(str) {
    if (str)
        return str.replace(/([ #;?%&,.+*~\':"!^$[\]()=>|\/@])/g,'\\$1');
    return str;
}
_

私は次のペイロードを考え出しました:

_<img%09src%09onerror=alert`1`%09>
_

等号が_\=_に置き換えられなかった場合に機能します。ブラウザは_\=_をまったく許容しないようです。

これをバイパスする方法、またはここで機能する別のペイロードをアイデアはありますか?

UPDATE:

ここで述べたように: https://security.stackexchange.com/a/60915/196507

<script defer>alert(2)</script>は一部のブラウザーで動作する可能性があります(また、どこかにIEがこのブラウザーであることがわかりました)。しかし、残念ながら、単純化された形式のIE11イベントではフォークされませんでした:

document.getElementById('test').innerHTML = "<script defer>alert(1)<\/script>";

UPDATE2:

_<script defer>_はIE9で機能しますが、バッククォート( `)はサポートされていません。したがって、エスケープされた括弧の問題が発生します。

9
Alex Velickiy

文字セットが非定型でない場合は、おそらくそれを行うことができ、マルチバイト文字を等号に変換することで有効な結果を得ることができるかもしれませんが、おそらく文字セットを自分で変更することはできませんサーバーの応答ヘッダーに表示されます。デフォルトはUTF-8です。

HTML標準のセクション12.1.2.1- では、タグをU+003Eで閉じる必要があるため、スクリプトタグを使用しても機能しません。属性は 'disabled'などの空の構文で指定できますが、JavaScriptを実行することはできません。質問で指摘したように、引用符で囲まれていない値の構文を使用できますが、引用符で囲まれていない部分は、単一引用符または二重引用符で囲まれた属性の場合と同様に、U+003D記号に従う必要があります。

1
LTPCGO