html & js - decode

Author Avatar
Aryb1n 3月 29, 2017

自解码机制

其实这也是我一直不太懂的,今天看了evalcos的书里有提到

html和javascript环境里自动解码的条件是不一样的

html

<input type="button" id="exec_btn" value="exec" onclick="document.write('&lt;image src=# onerror=alert(123) /&gt;')  ">

这个会被解码,页面载入的时候

就已经变成了

<input type="button" id="exec_btn" value="exec" onclick="document.write('<image src=# onerror=alert(123) />')">

html 环境里 {html标签里,认为<script>标签内的是js环境,而不是html环境}

  1. 进制编码: &#xH; &#D; (;可省略)
  2. HTML实体编码: &lt; &gt; ...

会自动解码

javascript

javascript 环境下

  1. Unicode: \uH(十六进制)
  2. 普通十六进制: \xH
  3. 纯转义: \’ \” \< > …..

会被自动解码

<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('&lt;image src=# onerror=alert(123) /&gt;')">
        <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>