注釈
- ブラウザが勝手にエスケープしてくれちゃうので、本の例と揃えるためにあえて
unescape
してます - リクエストはすべて下記で試しています
http://0.0.0.0:8000/index.html#%3Cimg%20src=x%20onerror=alert(1)%3E
脆弱性あり
<script src="https://code.jquery.com/jquery-1.8.3.min.js"></script>
<script>
$('input[name="color"][value="'+unescape(location.hash.slice(1))+'"]')
</script>
脆弱性なし
<script src="https://code.jquery.com/jquery-1.9.0.min.js"></script>
<script>
$('input[name="color"][value="'+unescape(location.hash.slice(1))+'"]')
</script>
この例は、先頭に<
が来ているのでどちらも脆弱性あり
<script src="https://code.jquery.com/jquery-1.8.3.min.js"></script>
<script>
$(unescape(location.hash.slice(1)));
</script>
<script src="https://code.jquery.com/jquery-1.9.0.min.js"></script>
<script>
$(unescape(location.hash.slice(1)));
</script>
Ref: http://jquery.com/upgrade-guide/1.9/#jquery-htmlstring-versus-jquery-selectorstring