zoukankan      html  css  js  c++  java
  • xss防御

    xss的防御

    反射型xss测试的时候,可以使用扫描器,或者burp进行fuzz

    存储型xss测试的时候,可以直接把字典中的payload都塞进去,根据弹窗的编号,就知道是哪个。但这个容易被发现,所以可以先试探一下特殊符号是否被过滤。

    DOM型xss测试,主要以阅读js代码为主。在页面上找打输入点的相关dom节点,在开发者选项中搜索一下,根据搜索结果去看是否被相关的JS操作,如果有js的操作,就去看我们的输入操作后输出在哪个地方,就按照常规的xss思路进行构建。

    防御一般来说,做实体字符编码,htmlspecialchars(), 函数功能就是把特殊符号,比如尖括号,引号转换成实体编码,这样就不会再输入的地方去干扰页面源代码。

    经过实体字符编码后,用户输入的特殊符号在源代码中就变成编码,但是在页面输出的时候,还是会显示成原来的样子。

    当输出位置在元素内容里面,并且被实体编码后,基本上就没有xss的可能了。

    但是如果输出在事件属性中,还是有可能存在绕过的可能性。

    比如在a标签中,<a href=javascript:alert(1)>,这种形式,没有尖括号也没有引号,就有可能被绕过。如果存在类似这种的情况,需要在链接属性中加上http://或https://的正则表达式来限制。

    xss的绕过方式

    绕过过滤

    1、前端限制,直接用F12开发者选项修改js既可,或者用burpsuite绕过。

    2、字符过滤,双写,大小写绕过 通过注释符绕过,也可以通过换行符绕过

    绕过编码

    1、明确浏览器解析的机制

    2、明白机制后,选择对应的编码

    (1)输出在标签间的情况:测试<>是否被过滤或转义,若无则直接<imgsrc=1onerror=alert(1)> (2)输出在script标签内:我们需要在保证内部JS语法正确的前提下,去插入我们的payload。如果我们的输出在字符串内部,测试字符串能否被闭合。如果我们无法闭合包裹字符串的引号,这个点就很难利用了。可能的解决方案:可以控制两处输入且可用、存在宽字节 (3)输出在HTML属性内:首先查看属性是否有双引号包裹、没有则直接添加新的事件属性;有双引号包裹则测试双引号是否可用,可用则闭合属性之后添加新的事件属性;TIP:HTML的属性,如果被进行HTML实体编码(形如'&#x27),那么HTML会对其进行自动解码,从而我们可以在属性里以HTML实体编码的方式引入任意字符,从而方便我们在事件属性里以JS的方式构造payload。 (4)输出在JS中,空格被过滤:使用/**/代替空格。 (5)输出在JS注释中:设法插入换行符%0A,使其逃逸出来。 (6)输出在JS字符串内:可以利用JS的十六进制、八进制、unicode编码。 (7)输出在src/href/action等属性内:可以利用javascript:alert(1),以及data:text/html;base64;加上base64编码后的HTML。

    (8)当我们的XSSpayload位于这些标签中间时,并不会解析,除非我们把它们闭合掉。

    ​<textarea></textarea>
    <title></title>
    <iframe></iframe>
    <noscript></noscript>​

    <noframes></noframes> <xmp></xmp> <plaintext></plaintext>



  • 相关阅读:
    Map与实体之间转换
    letsencrypt 免费SSL证书申请, 自动更新
    spring接收json格式的多个对象参数(变通法)
    controller函数中参数列表使用多个@RequestBody
    经典网页设计:30个新鲜出炉的扁平化网站设计《上篇》
    使用 iosOverlay.js 创建 iOS 风格的提示和通知
    字体大宝库:设计师必备的优秀免费英文字体
    RandomUser – 生成随机用户 JSON 数据的 API
    Salvattore:CSS 驱动的 jQuery Masonry 插件
    赞!jsPDF – 基于 HTML5 的强大 PDF 生成工具
  • 原文地址:https://www.cnblogs.com/gx991010/p/13054656.html
Copyright © 2011-2022 走看看