0

このページでは、以下のコードが注入可能であることを示唆しています。しかし、私は方法がわかりません。オンラインの回答では、これ\74a onclick=alert(1)\76Wを「入力」というラベルの付いたテキストエリア(名前の下)に入れ、Wをクリックすることが解決策であると述べています。

ページには確かに私が勝つと書かれていますが、それは間違っていると思います

jsfiddleで実行したところ、適切にエスケープされ、注入されていないことがわかりました。ページは何と言っていますか?本当にインジェクションがあるのか​​、それともチャレンジページが間違っているのか?

HTML:

<div id="c">text</div>

JS:

//from challenge page
function escape(s) {
  function htmlEscape(s) {
    return s.replace(/./g, function(x) {
       return { '<': '&lt;', '>': '&gt;', '&': '&amp;', '"': '&quot;', "'": '&#39;' }[x] || x;       
     });
  }

  function expandTemplate(template, args) {
    return template.replace(
        /{(\w+)}/g, 
        function(_, n) { 
           return htmlEscape(args[n]);
         });
  }

  return expandTemplate(
    "                                                \n\
      <h2>Hello, <span id=name></span>!</h2>         \n\
      <script>                                       \n\
         var v = document.getElementById('name');    \n\
         v.innerHTML = '<a href=#>{name}</a>';       \n\
      <\/script>                                     \n\
    ",
    { name : s }
  );
}

//the solution 
$('#c').html(escape('\74a onclick=alert(1)\76W'));
4

1 に答える 1

1

バックスラッシュをエスケープして、エスケープ機能を変更せずに到達\74する必要があります。\76そうしない<と、変換が>早すぎます。

$('#c').html(escape('\\74a onclick=alert(1)\\76W'));

デモ: http://jsfiddle.net/Lj7v4/1/

于 2013-10-05T07:16:43.170 に答える