啥都不懂的童鞋,可参考文章
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编码解码
javascript:alert()
接着我们插入href里面
点击友情链接
本关小结: href属性自动解析Unicode编码
level 9
老套路,看看过滤了啥子
" sRc DaTa OnFocus <sCriPt> <a hReF=javascript:alert()> j
emmm,小老弟怎么回事,没插入成功???
看一下这关的源码
里呢,当false等于false的时候(就是传入的值没有http://)就会执行if,为了防止false===false,我们需要向传入的值里面添加http://并用注释符注释掉否则会执行不了无法弹窗,让函数strpos返回一个数字,构造payload
javascript:alert()/* http:// */
本关小结:插入指定内容(本关是http://)绕过检测,再将指定内容用注释符注释掉即可
level 10
这里可以看到,Get传参的值,只插入了h2标签里头,额那下面的input标签啥东西,还隐藏掉了
不管那么多,老规矩,先测试一下关键字
" sRc DaTa OnFocus <sCriPt> <a hReF=javascript:alert()> j
居然都被实体化了,没法子,只能看一下这关的源码了
好吧,原来还有其他隐藏的传参方法,学到了,下次就一个个测,这里是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()> j&t_history=" sRc DaTa OnFocus <sCriPt> <a hReF=javascript:alert()> j&t_sort=" sRc DaTa OnFocus <sCriPt> <a hReF=javascript:alert()> j
没赋值成功,再试试看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()> j
再查看一下源码
对比发现,把大于小于号><给删掉了,但是我们还能用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()> j
再查看一下源码
跟上题一样,构造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()> j
对比发现,这里有个html实体化函数在,没有删掉东西,所以不影响我们接下来的操作,我们可以包涵第一关并让第一关弹窗(注意,这里不能包涵那些直接弹窗的东西如<script>,但是可以包涵那些标签的东西比如、<input>、、 标签等等,这些标签是能需要我们手动点击弹窗的),这里我们使用img标签,可参考XSS常见的触发标签,构造payload 当鼠标移动到图片的时候就触发了弹窗 当然也能用p标签,可以构造payload 点击哈哈哈即可弹窗,接下来我们看一下这关的后端源码 实体化函数,形同虚设 本关小结:ng-include文件包涵,可以无视html实体化 test插入到了center标签中,所以这里就不用闭合了,老规矩,先测试一波关键字 对比发现,这里先是将字母小写化了,再把script替换成空格,最后将空格给实体化,想尝试一下p标签 abc?src='/level1.php?name=<img src=1 onmouseover=alert()>'
?src='/level1.php?name=<p onmousedown=alert()>哈哈哈</p>'
level 16
?keyword=" ' sRc DaTa OnFocus OnmOuseOver OnMouseDoWn P <sCriPt> <a hReF=javascript:alert()> j
果然给过掉了,空格可以用回车来代替绕过,回车的url编码是%0a,再配合上不用/的、
随便选个标签,将空格替换成回车的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
终于通关了!!!太不容易啦
版权归原作者 金 帛 所有, 如有侵权,请联系我们删除。