html & js - decode
自解码机制
其实这也是我一直不太懂的,今天看了evalcos的书里有提到
html和javascript环境里自动解码的条件是不一样的
html
<input type="button" id="exec_btn" value="exec" onclick="document.write('<image src=# onerror=alert(123) />') ">
这个会被解码,页面载入的时候
就已经变成了
<input type="button" id="exec_btn" value="exec" onclick="document.write('<image src=# onerror=alert(123) />')">
html 环境里 {html标签里,认为<script>
标签内的是js环境,而不是html环境}
- 进制编码:
&#xH; &#D;
(;可省略) - HTML实体编码:
< > ...
会自动解码
javascript
javascript 环境下
- Unicode: \uH(十六进制)
- 普通十六进制: \xH
- 纯转义: \’ \” \< > …..
会被自动解码
<input type="button" id="exec_btn" value="exec" onclick="document.write(jsEncode('<image src=# onerror=alert(123) / >'))">
<script type="text/javascript">
function jsEncode(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>
这样的过滤并没有啥用,会被js自动解码
总结一下
<input type="button" id="exec_btn" value="exec" onclick="document.write('<image src=# onerror=alert(123) />')">
<input type="button" id="exec_btn" value="exec" onclick="document.write(HtmlEncode('<image src=# onerror=alert(123) / >'))">
<input type="button" id="exec_btn" value="exec" onclick="document.write('<image src=# onerror=alert(123) />')">
<input type="button" id="exec_btn" value="exec" onclick="document.write(jsEncode('<image src=# onerror=alert(123) / >'))">
1,2,4 会弹框
3 不会
另外有一些标签不解析html,他们是
<iframe></iframe>
<noscript></noscript>
<noframes></noframes>
<xmp></xmp>
<plaintext></plaintext>
<textarea></textarea>
<title></title>