xss-labs通关

XSS漏洞初学

Posted by Sprint#51264 on October 28, 2020

引言

XSS又称CSS,全称Cross SiteScript,跨站脚本攻击,是Web程序中常见的漏洞,XSS属于被动式且用于客户端的攻击方式,所以容易被忽略其危害性。其原理是攻击者向有XSS漏洞的网站中输入(传入)恶意的HTML代码,当其它用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击的目的。如,盗取用户Cookie、破坏页面结构、重定向到其它网站等。 xss常出现在数据交互的地方,如果交互过程中没有进行足够的防护,那么就容易引发xss漏洞被利用。


level 01

  • 原理

    传入的参数未经过其他处理直接引用导致恶意代码执行引发的XSS漏洞。

  • 步骤

    1.来到题目页面,看到没有输入框,但是url地址栏中传了一个参数

    BLmQET.jpg

    那么可以在该参数处进行一些尝试

    2.传入 xxxx ,发现页面有所变化,在”欢迎用户”后有一个显示位能对传入的参数进行输出,在下方payload长度处也有字符串长度的统计

    3.尝试恶意脚本<script>alert(1)</script>

    过关

  • 代码审计

    BLQFpD.jpg

    如图,GET参数后未经过任何过滤直接显示,导致代码执行


level 02

  • 原理

    在属性值处发生的转义

  • 步骤

    1.尝试上一关的代码注入发现并没有成功而是原封不动地把注入的代码回显了出来,f12查看页面源码

    BLGeF1.jpg

    可以看到,处在显示位的参数已经被转义过了,特殊的标签被转化成了html实体,但是可以发现处在input标签中的value属性值没有被转义,这里就可以使用闭合标签的方式插入新的代码

    2.输入

      `"><script>alert(1)</script>//`
    

    “>是为了闭合value值还有input框,而//是为了注释掉原有的html代码

    完成得不错√

  • 代码审计

    BLt3mF.jpg

    可以看到在显示处使用了htmlspecialchars()函数进行过滤,但是在input value属性处没有过滤,从而导致XSS漏洞


level 03

  • 原理

    利用标签属性为恶意代码产生自己的事件,并且使用javascript:执行恶意代码,

    在javascript:后的代码将被解析成js代码执行

  • 步骤

    1.还是尝试基本的弹窗代码

      `<script>alert(1)</script>`
    

    Bvk6qP.jpg

    如图所示,两处显示位置都原封不动地返回且没有弹窗,猜测是被转义了

    BvAVRH.jpg

    可以猜测都被经过htmlspecialchars()处理

    那么我们可以尝试为恶意代码创建自己的事件来绕过

    2.payload

      `'onfocus=javascript:alert(1) >//`
    

    输入之后,发现搜索框变为空,这时恶意代码已经被嵌入到input框中了,而onfocus属性指的就是点击该搜索框所触发的事件,再次点击搜索框即可过关

  • 代码审计

    BvAX0P.jpg

    如图,如我们料想的那样,两处都对特殊符号进行了转义


level 04

  • 原理

    对特殊字符直接进行替代,但是不够全面,还可以产生恶意代码自身的事件

  • 步骤

    1.老样子尝试警告框

      `<script>alert(1)</script>`
    

    发现页面传回如下

    BvETEV.jpg

    值得注意的是,上方显示位并没有什么特殊的变化,仍旧猜测是htmlspecialchars函数处理,但是下方搜索框payload中标签都被过滤掉了,既然没有标签可以用那就说明不能用<script></script>或者重新创建标签的方式进行注入了

    2.于是乎我们可以创建自己的事件,仍旧如同上一关一般

      `"onfocus=javascript:alert(1) > //`
    

    注意这一关是双引号括住的

    3.成功过关

  • 代码审计

    BvVgVx.jpg

    可以清楚的看到这里使用了两个匹配替代函数,将标签都过滤了,但是不全面,从而存在XSS安全隐患


level 05

  • 原理

    使用了转义特殊字符函数与匹配替代函数

  • 步骤

    1.script标签警告框测试

    发现行不通

    BvmuUx.jpg

    上面的显示位没有变化,仍旧是转义,但是搜索框中的payload再次被奇怪地更改了,发现在script中加了下划线,想到可能是匹配到关键字进行的替代。

    2.转念一想,不清楚是不是用了大小写检测,于是尝试大小写混写绕过,但是并没有效果,并且全部变成了小写,于是推测这里还用了转小写的函数

    3.尝试为恶意代码产生自己的事件,插入onfocus属性,仍旧不行

    转到源代码页面发现onfocus也被加了下划线

    BvuQje.jpg

    4.但是,搜索框并没有对标签括号进行替代,也就是说我们可以为其添加自己的标签

      `" > <a href=javascript:alert(1)>haha</a>`
    

    BvuBuQ.jpg

    点击产生的超链接,过关

  • 代码审计

    BvuWgU.jpg

    如我们料想的那样

    使用了strtolower()函数将输入的字符串小写处理,过滤script还有on关键字以过滤事件的产生

    但是没有过滤标签的使用


level 06

  • 原理

    更全面的敏感词过滤,但是没有大小写检测

  • 步骤

    1.警告框测试,发现还是被转义了,并且仍旧在script中添加了下划线

    2.尝试使用在标签属性处进行插入

    BvO5Z9.jpg

    发现on关键字应该也被做了过滤

    但是不清楚是不是存在大小写敏感,尝试混写绕过

    发现可以!!!!

    payload:

      `" oNfocus=javascript:alert(1) > //`
    

    3.(额外的)尝试在标签框外创建自己的标签,发现如果使用上题的方法会被过滤,href和src关键字都被替代,再次使用大小写混写绕过,可以

    payload:

      `" ><a hREF=javascript:alert(1)>haha</a>`
    
  • 代码审计

    BvX7wj.jpg

    观察这段代码

    • 对script标签做了过滤,明显是防止<script></script>这一类恶意代码的

    • 对on关键字做了过滤,防止恶意代码产生自己的事件onclick,onfocus等等

    • 对src关键字匹配过滤,在<img>标签中有src属性,可以指向图片的地址,如果src地址有误而无法访问到时就可以触发onerror事件

    eg:

      <img src=111 onerror=alert('xss')>
    
    • 对data关键字匹配过滤,对于data伪协议,

      使用格式样例:

      data:text/html;base64,PHNjcmlwdD5hbGVydCgieHNzIik8L3NjcmlwdD4=

      SuperHei对data:的总结是

      1.可以指定MIME-type如text/html

      2.可以指定编码如data:;charset=UTF-8,Hello

      3.firefox/ie8/Opera等支持它

    • 对href做了过滤,防止a标签中的href代码插入

    • htmlspecialchars函数转义特殊字符


level 07

  • 原理

    采用了关键字匹配去除,可以使用双写绕过

  • 步骤

    1.为了加快效率这次决定直接上大小写混写的payload

    payload:

      `<sCRipt>aler(1)</scRIpt>`
    

    Bxp2kQ.jpg

    发现这次关键字是被直接删去了的

    2.连续测试几个值,src,href,on,javascript

    无论大小写都被过滤,但是脑子反应慢了才想起来有双写绕过,尝试双写绕过

    payload:

      `" > <scrscriptipt>alert(1)</scrscriptipt>`
    

    直接过关[捂脸]

  • 代码审计

    BxENRg.jpg

    如图

    • 传参被小写

    • 关键字直接被删去

    • 输出位使用hemlspecialchars转义

    可以看出过滤全家桶被做得越来越全面了


level 08

  • 原理

    HTML中属性值本身是支持ASCII码的,所以我们可以对属性值进行Unicode编码之后进行传参

  • 步骤

    1.进到第八关的页面可以感到风格的变化,新增了一个超链接

    Bxuzwj.jpg

    输入值进行测试再次观察源码,

    BxK8XD.jpg

    可以看到输入的内容被插在了a标签的href属性值中,想到使用javascript:执行代码

    2.尝试javascript执行,但是关键字再次被过滤,仍旧是那些,词中被加了下划线,也不能使用双写绕过,大小写混写也没有起作用

    3.使用编码,HTML标签属性本身是支持ASCII码的,于是乎使用Unicode进行编码传输

    编码前

      `javascript:alert(1)`
    

    编码后

      `&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;`
    

    添加标签成功过关

  • 代码审计

    BzpjxI.jpg

    如图所示

    • 敏感字符已经被加下划线过滤

    • 新建标签不可能,双引号也被过滤,所以说也没有办法给属性值闭合

    • 还有小写处理,所以不能大小写混写

    • 没有敏感字符去除,所以不能双写绕过

    • 所以说才考虑到字符编码转码,用Unicode进行编码并且正好插入属性值处,HTML解析之后直接执行


level 09

  • 原理

    有点白名单和盲注的感觉

    题目要求插入友情链接中必须有网址的格式http://,匹配到之后才认定这是一个合法的网址

    否则就会说你的链接不合法

    但是仍旧没摆脱编码的魔爪

  • 步骤

    1.尝试了警告弹窗,发现没有发生任何事情

    BzFUcd.jpg

    并且href处还没有任何提示,只有一串”您的链接不合法,有没有!”字样,这样一来我们就不知道到底对其采用了什么操作

    到这里我其实是有些懵了,不知道该怎么继续下去,看了前辈的博客才知道这里应该是网址关键字匹配

    不过还是提醒之后的自己,如果发现注入没有成功,应该想一下用正常的网址进行输入,可能选一个正常的网址写进去发现成功就能想到这里可能是网址的关键字匹配

    2.我们继续,得知可能是http://关键字匹配后,我们给他加上,然后再注释掉,尝试

      `javascript:alert(1) //http://123.com`
    

    BzACd0.jpg

    发现这里对script有一个关键字匹配过滤,就想到可能又用到前几关的过滤全家桶,直接把关键字输入框中来一遍,果然都过滤了

    3.接着尝试一下大小写混写绕过

      无果
    

    那也就是说即使新建了标签,那也没用

    4.上编码,编码后接上被注释的网址,点击链接,过关

      `&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41; //http://123.com`
    
  • 代码审计

    BzVaPf.jpg

    如图所示

    • 1处来了一个过滤全家桶对所传参数进行处理,作用同上题

    • 2处多出来了一个strpos函数,查找关键字在字符串中第一次出现的位置,没有则返回false,没有的话网页用错误提示代替代码进行返回,如果有的话就把字符显示 ***

      level 10

  • 原理

    页面隐藏了输入框,并且输入框可以被赋值,没有过滤

    属性值注入

  • 步骤

    1.来到题目页面,发现这次页面长得与之前的大不相同,没有输入框,没有友情链接,但是可以发现url栏中传了一个参数

    2.传入报警弹框,发现,完整输出,应该是被转义了

    BznSL4.jpg

    3.查看页面源码看看发生了什么

    BznlFI.jpg

    这一看,不仅看出显示位有特殊字符转义,还看到了页面偷藏的三个输入框,现在我们不仅能给keyword传参,还能给三个input传参

    4.尝试给t_link传参,再次打开源码,发现其值没有任何动静,多次尝试也没有反应

    5.为了防止其它框也出现累死情况,对三个框同时进行了传参,甚至还给t传了参

      `?keyword=10&t_link=1&t_history=2&t_sort=3&t=4`
    

    再次查看

    Bzuk7j.jpg

    只有t_sort接受了我的参数,那也就是说可以从t_sort下手了

    6.开始动手,要想使用这个标签就要注意注释掉后面原有的hidden类型,把它改为其它类型,比如说button类型,写payload的过程中传了几次参数发现页面对这个值并没有太多的过滤,我们就可以为所欲为了

    7.上payload

      `?keyword=1&t_sort=1" onclick="alert(1)" type=button >//`
    

    BzuRv8.jpg

    给它变成了一个值为1的按钮,点击即可过关

  • 代码审计

    BzKsLF.jpg

    观察代码

    • 如我们料想的那样,str被htmlspecialchars过滤了

    • 也只有t_sort接受参数值

    • 对t_sort的过滤只有左右尖括号,所以注入显得很容易

    看来作者目的是提醒我们注意隐藏框以及假输入框的存在


level 11

  • 原理

    http头部xss,对http头部属性信任,未进行过滤直接引用导致的xss漏洞

  • 步骤

    1.打开11关的页面,看起来与上一关相仿,索性直接F12查看源码

    Bz4emt.jpg

    可以发现这次偷藏了四个隐藏的输入框,不过值得注意的是,第四个隐藏输入框t_ref已经有了值,并且仔细观察可以看出是第十关用到的payload

    特别留意这里,能够成为后续解题的提示

    2.在地址栏给keyword赋几个敏感字符,发现还是特殊字符被转义,但是敏感字符没有被替代,显示位也是完完整整输出

    3.但是肯定是要用到那几个隐藏输入框的,于是乎对其进行传参

      `?keyword=haha&t_link=1&t_history=2&t_sort=3&t_ref=4`
    

    BzoifU.jpg

    可以看到又只有t_sort被赋值成功,同时t_ref没有了

    尝试对t_sort的属性进行闭合,发现引号被转义了

    BzoifU.jpg

    如果双引号不能用那就不能从value属性中脱离出来,也就不能创造自己的事件或者进行闭合标签

    所以要另外想其他的办法

    前面我们还记得t_ref是第十关的pyload网址,而ref又可能是http头中的referer属性,我们且可尝试一下抓包进行注入

    4.抓包之后在http头部添加一个referer属性进行测试传入1

    BzoifU.jpg

    发现t_ref的值变为1,那我们就找到了注入点

    5.尝试闭合value值并创建自己的事件

    payload:

      `Referer:1" onclick="javascript:alert(1)" type=button >//`
    

    抓包改包放包,点击按钮即可过关

  • 代码审计

    BzHm0s.jpg

    • 接收keyword进行htmlspecialchars处理并打在显示位上

    • 接受t_sort参数进行htmlspecialchars处理再次赋给value

    • 果然!接受HTTP-Referer头部参数并进行除尖括号处理,只要没有特殊字符转义,没有双引号去除,那么这个标签的属性就可能是危险的


level 12

  • 原理

    仍旧是发生在HTTP头部的XSS注入,这次的位置点是useragent属性,原因是对http头部参数过于信任,过滤不全导致的XSS

  • 步骤

    1.经过上一关的调教,养成了一进关卡先看代码的好习惯

    F12

    BzLVXD.jpg

    发现四个隐藏框,其中第四个额外亮眼,t_ua

    这一下就能想到HTTP请求头部的User-Agent呀

    怕是和上一题是兄弟题

    2.抓包改包放包

    payload同上

      `User-Agent:1" onclick="javascript:alert(1)" type=button > //`
    

    点击中央小按钮即可通关

  • 代码审计

    BzXiQK.jpg

    • 这不就换汤不换药嘛,意在让我们了解不同的注入位置,仍旧像上一关那样分析就好啦

level 13

  • 原理

    HTTP头部cookie注入

  • 步骤

    1.直接F12查看网页源码

    BzjvCR.jpg

    所以应该是cookie注入吧,其他的直接都不试了,应该是一样的

    2.抓包,仍旧是相同的方式,在cookie处进行测试,发现cookie可以传参,尝试在cookie处闭合value值并创建onclick属性以及button类型

    当然,如果玩按钮玩腻了,也可以换成text类型,onfocus事件,或者其他事件,多尝试多搭配

    然后点击按钮过关

  • 代码审计

    BzxpJs.jpg

    • 先设置了一个cookie,call me maybe?

    • get keyword,htmlspecialchars函数处理,

    • 还有t_sort,还是同样的转义

    • 唯独cookie,只有标签去除,没有其他过滤,一样的注入,同上


level 14

非常抱歉这关的iframe框架引用失败了

所以参考别人的wp monikaXSS挑战之旅


level 15

  • 原理

    由于上一题不得搞,于是url地址栏跳到15关,但是这样过来的地址栏里是没有参数的,导致没有头绪,看了前辈的wp得知有src参数

    还需要注意的是这个网页一开始打开的时候是真的慢,一定要换个源,不然传一次参等八百年

    参考博客链接:XSS通关bywo41个小白菜

  • 步骤

    既然此处用了ng-include指令的话,先了解一下其具体的用法。

    1、ng-include 指令用于包含外部的 HTML文件。

    2、包含的内容将作为指定元素的子节点。

    3、ng-include 属性的值可以是一个表达式,返回一个文件名。

    4、默认情况下,包含的文件需要包含在同一个域名下。

    特别值得注意的几点如下:

    1.ng-include,如果单纯指定地址,必须要加引号

    2.ng-include,加载外部html,script标签中的内容不执行

    3.ng-include,加载外部html中含有style标签样式可以识别

    有种include文件包含的感觉,但是不能执行script中的代码的话,我们就得另寻出路,之前有一关用到加载src失败出发onerror事件的方法,于是乎我们这关也可以使用

    1.先尝试引用1.php查看页面

    D9cm1s.jpg

    发现已经成功引用level1的文件了,那么相应的漏洞应该也转移了过来,向name进行传参,payload

      `?src='level1.php?name=<img src=1 onerror=alert(1)>'`
    

    成功弹窗√

  • 代码审计

    D9gZVK.jpg


level 16

  • 原理

    这关主要考察的是空格的替代符,回车TAB以及换行符

    在JS代码执行过程中,如果运行过程中如果语句不完整并且没有匹配到分号结束符,那么就会继续向下执行知道形成一个完整的语句才会停止,所以即使没有分号分隔用换行也能断句,还能防止空格被替代引发的尴尬境地。

  • 步骤

    1.使用告警弹窗<script>alert(1)<script>

    D92eLq.jpg

    发现我的script没了!

    查看页面源码

    D92KoT.jpg

    输入的内容被插到了<center></center>中,

    敏感字符也被空白的实体替代了,反斜杠也不能用

    甚至连空白也不能用

    可以想到,要使用标签,但是不能有闭合标签,还不能有空格,那么就用回车换行TAB代替

    回车(CR,%0d,ASCII 13,\r)换行(LF,%0a,ASCII 10,\n)

    payload:

      `<img%0asrc=1%0donerror=alert(1)>`
    
  • 代码审计

    D9RggJ.jpg

    • 对关键字进行空白实体替代

    • 插入到<center></center>标签中


level 17

  • 原理

    Flash XSS

  • 步骤

    1.该题的页面格外的简洁

    D9WyZt.jpg

    如图所示,貌似没有任何东西,点击链接也确实直接进入下一关了

    2.查看页面源码

    D9WcIf.jpg

    发现页面中是有个swf文件没有被加载出来

    swf文件,即shockwave flash文件,能被flash player打开

    经测试,传入的两个参数是被插到了embed标签中,embed标签可以引用flash对象。

    3.换了个浏览器

    D9flY8.jpg

    源码之中src的值是没有双引号的,所以我们可以不用闭合引号,尝试直接给其添加一个事件属性

      `?arg01=a&arg02=b onmouseout=alert(1)`
    
  • 代码审计

    D9fNmn.jpg

    如图,没有太多的过滤,直接属性处注入


level 18

比起上关来说只有src多了双引号包括,加个双引号直接过关

payload:

`?arg01=a&arg02=b" onmouseout=alert(1)//`

level 19(暂无)

  • 原理

    flash xss

  • 步骤

  • 代码审计


level 20(暂无)

  • 原理

  • 步骤

  • 代码审计