关于这个自解码机制,我们直接以一个例子来进行说明:
样例0:
<input type="button" id="exec_btn" value="exec" οnclick="document.write ('<img src=@ οnerrοr=alert(123) />')" />
我们假设document.write里的值是用户可控的输入,点击后,document.write出现一段img HTML,onerror里的JavaScript会执行。此时陷阱来了,我们现在提供一段HtmlEncode函数如下
样例A:
<script>
function HtmlEncode(str) {
var s = "";
if (str.length == 0) return "";
s = str.replace(/&/g, "&");
s = s.replace(/</g, "<");
s = s.replace(/>/g, ">");
s = s.replace(/\"/g, """);
return s;
}
</script>
<input type="button" id="exec_btn" value="exec" οnclick="document.write (HtmlEncode('<img src=@ οnerrοr=alert(123) />'))" />
我们知道HtmlEncode('<img src=@ οnerrοr=alert(123) />')
后的结果是:
<img src=@ οnerrοr=alert(123) />
这个样例A点击后会执行alert(123)吗?下面这个呢?
样例B:
<input type="button" id="exec_btn" value="exec" οnclick="document.write ('<img src=@ οnerrοr=alert(123) />)" />
在样例A和样例B中,document.write的值似乎是一样的?实际结果是样例A点击不会执行alert(123),而是在页面上完整地输出<img src=@ οnerrοr=alert(123) />
,而样例B点击后会执行alert(123)。
阅读全文