第一关
页面很简单,可以发现通过修改url中level1.php?name后面的字段,页面会改变,显示该字段的总长
再查看源代码,根据源代码可知当有个弹窗就会执行函数,最后得到我们想要的“完成的不错”
<script>alert(111)</script>
第二关
第二关似乎和第一关一样,不确定,试试
同样的代码在第二关并不适用,查看源代码
在input标签中是没有任何过滤的,为了让弹窗出现可以闭合掉<script>alert(111)</script>前面的语句,完整的代码是:
<input name=keyword value=""><script>alert(111)</script>//">
即在查询框中输入:
"><script>alert(111)</script>//
第三关
还是先输入<script>alert(1111)</script>进行尝试
没有什么效果,继续查看网络源代码
发现两处都将<,>转义了。猜测服务器端在这两处都用htmlspecialchars()函数进行了处理,浏览器中有一些事件可以执行js代码,这里可以使用onfocus事件,观察源代码为单引号闭合,把value闭合掉构造playload
onfocus事件绕过:当输入字段获得焦点时执行Javascript,在提交后,没有立刻弹出这里还需要点一下文本框让事件触发
onfocus常用于<input>,<select>,<a>标签中
//完整代码 <input name=keyword value='' οnfοcus=javascript:alert() '> //输入的代码 ' οnfοcus=javascript:alert() '
总结:onfocus可以绕过html实体化(即<>号的过滤)
第四关
在文本框中输入" , ' , < , > ,666,接着查看源代码
要避免使用<,>,所以本关仍采用事件触发的方式
//完整代码 <input name=keyword value="" οnfοcus=javascript:alert() "> //输入的代码 " οnfοcus=javascript:alert() "
第五关
先尝试:" ' < > 666,查看源代码
再尝试一下:<script>alert(111)</script> ,依旧不行,再次查看源代码
可以发现<script>标签被换成了<scr_ipt>导致代码无法执行,那么尝试一下前面两关的通关思路:闭合+事件驱动
" οnfοcus=javascript:alert() "
可以发现onfocus被替换成o_nfocus,可以推测,搜索框中的 payload 可能是匹配到关键字进行的替代。这样带on的事件就不能用了,可以再尝试一下大小写绕过,结果失败了,大写全部变成小写,这里应该还应用了转小写的函数
此处既然无法通过 <script> 标签和事件来执行js代码的话,那么可以换一个标签来执行js代码,使用新标签要先闭合<input>标签。
<input name=keyword value=""><a href=javascript:alert(1)>xss</a>"> "><a href=javascript:alert(1)>xss</a>
点击一下侧面的链接就ok了
第六关
先输入" ' < > 发现没有对这些特殊符号进行过滤
尝试<script>," οnfοcus=javascript:alert() "发现和第五关结果一样,都被替换了,导致代码无法运行
再尝试一下第五关的代码,发现href变成了hr_ef
直接查看XSS下level6.php文件,可以发现script,on,src,data,href都被替换成其他格式,代码中似乎也没有大小写转换的函数
尝试一下大小写绕过,可以发现大小写没有被过滤掉,所以就可以通过大小写的方式构造playload
"> <sCript>alert()</sCript> <" " Onfocus=javascript:alert() " "> <a hRef=javascript:alert()>x</a> <"
第七关
先尝试 " ,' , < ,>,发现没有被过滤
再尝试<script>alert(111)</script>,发现script被完全过滤掉了,换成大小写的形式也被完全替换掉
尝试闭合方式+事件驱动:" οnfοcus=javascript:alert() "
结果on被完全替换掉,换成大小写的形式而不行
尝试">xss
结果href被完全替换掉,换成大小写的形式也不行
大小写绕过不行就双拼写方式
"> <scrscriptipt>alert()</scrscriptipt> <" " oonnfocus=javascript:alert() " "> <a hrehreff=javasscriptcript:alert()>x</a> <"
第八关
尝试 " , ' ,< ,>, 发现 " ,<,>都转换成了html实体代码
尝试前面几关的做题思路统统不行,再查看一下XSS下level8的源代码,果然很多字符都要被过滤替换了
但是我们能利用href的隐藏属性自动Unicode解码,我们可以插入一段js伪协议
javascript:alert() //进行编码 javascript:alert()
本关小结:href属性自动解析Unicode编码
第九关
按照前面几关的尝试都失败了,直接查看源代码
php函数介绍—strpos(): 查找字符串中特定字符的位置
实例:
payload:
 javascript:alert('xss')//http://
本关小结:插入指定内容(本关是http://)绕过检测,再将指定内容用注释符注释掉即可
第十关
和前面几关不一样,可以发现页面已经没有任何文本框了,直接查看源代码,在<input>标签里他的type是隐藏的,但是还是get请求,所以直接在url输入即可
127.0.0.1/xss/level10.php?keyword=t_link=2&t_history=3&t_sort=4
查看源代码发现只有t_sort接收到了参数,所以可以从t_sort下手,同时想要使用这个标签就需要注意type是hidden类型,可以把他改为其他类型button或者type
还是先输入 " ,' ,< ,>,可以发现< , > 被过滤掉,还是采用闭合方式+事件驱动
http://127.0.0.1/xss/level10.php?t_link=&t_history=&t_sort=" οnfοcus=javascript:alert() " type=""
第十一关
和第十关一样,页面没有出现任何文本框,直接查看源代码
还是先测试哪一个文本框可以接收到参数,最后发现只有t_sort可以接收到传递的参数
127.0.0.1/xss/level11.php?keyword=t_link=1&t_history=2&t_sort=3&t_ref=4
测试特殊字符: " ' < >,可以发现 " ,< , > 都被过滤掉了
直接查看一下源代码
$str11=$_SERVER['HTTP_REFERER']; 获取当前页面的来源URL,并将其存储在变量$str11中。 $str22=str_replace(">","",$str11);将str11中">"字符替换为空字符串,并将结果存储在变量str22中。 $str33=str_replace("<","",$str22); 将str22中的"<"字符替换为空字符串,并将结果存储在变量str33中 t_sort:值为URL中的"t_sort"参数值。 t_ref:值为经过处理的来源URL(已删除尖括号)。
经过分析可知本题的关键点其实就是referer请求头(Referer请求头包含了当前请求页面的来源页面的地址,即表示当前页面是通过此来源页面里的链接进入的)
我们尝试在referer处传参,发现果然可以
尝试在referer处闭合+事件驱动
" οnclick="alert(1)" type=""
第十二关
先查看源代码,和上一关的不同之处是t_ua处已经有了参数,虽然第四个<input>的t_ua已经有了参数,但是仍然尝试给这四个隐藏的文本框传参,结果发现t_sort成功接收到传的参,但是t_ua还是原来的参数,没有接收到刚才传的参
查看XSS下的level12的源代码,可以发现这里其实和第十一关很像
$str11=$_SERVER['HTTP_USER_AGENT']; agent // 获取用户代理字符串
那么按照上一关的思路,还在agent处进行传参操作就可以了
" οnclick= " alert(1) " type=""
第十三关
直接查看XSS下的level 13的源代码,和前两关一样都是在http请求头上做文章,本关是在cookie上
但是有一个关键点是cookie这还有一个参数user
无法直接和前面一样直接构造:" οnclick= " alert(1) " type=""
这里用抓包更清晰一点:
user= " οnclick="alert(1)" type=""
第十四关
空的,直接到第十五关
第十五关
查看源代码
<span>标签:对文本中的一部分进行着色 ng-include 指令用于包含外部的 HTML 文件。 包含的内容将作为指定元素的子节点。ng-include 属性的值可以是一个表达式,返回一个文件名。默认情况下,包含的文件需要包含在同一个域名下。 值得注意的是: 如果单纯指定地址,必须要加引号 加载外部html,script标签中的内容不执行 加载外部html中含有style标签样式可以识别 可以包含同一域名的 html 文件,那也就是说可以包含之前做过的有xss漏洞的文件,但是不能执行script中的代码.
源码中可以发现是通过src传参,还对 < > 进行了过滤,既然类似于包含,那我们就包含一个level1.php,构造payload:
'level1.php?name=<a href="javascript:alert(1)">'
第十六关
先查看源代码没有发现什么特别之处
先尝试最简单的构造<script>alert(111)</script>,可以发现script被完全过滤掉
为了快速找到都有什么字符被过滤掉,直接查看XSS下的源代码,可以发现script,空格,/都被过滤掉了
既然不能有空格,空格最常见的绕过方法就是用回车,回车的url编码是%0A
<img%0Asrc=1%0Aοnerrοr=alert(1)> //串代码意思就是如果在加载src给的图片时发生错误则执行 js。
第十七关
查看源代码
embed标签可以理解为定义了一个区域,可以放图片、视频、音频等内容,但是embed标签打开不了文件的时候就会有块错误的区域。也可以绑定各种事件,比如尝试绑定一个onmouseover事件。后台看代码用了htmlspecialchars,所以直接写标签是不行的。embed标签基本不怎么用了,所以这一关就简单了解一下即可。
通过代码发现,本关卡有两个参数:arg01、arg02,当我们发送的时候,发现他们是会互相拼接起来的,那么我们就容易想到这里会不会就是突破口,发现这两个参数是在embed上,embed标签定义嵌入的内容,并且做了尖括号过滤,那么我们可以加入一个属性进去,生成恶意代码
http://127.0.0.1/xss/level17.php?arg01=a&arg02=%27%20οnmοuseοver=alert(%22aini%22)
第十八关
查看源代码可以发现和第十七关一样,构造的playload也一样,但是火狐不支持,换了一个浏览器才可以
' οnmοuseοver=alert("aini")
第十九关
要用到flash反编译,这方面的知识还是空白。有兴趣的同学可以看一下别的大佬的writeup:http://t.csdnimg.cn/pqodWhttp://t.csdnimg.cn/pqodW
第二十关
要用到flash反编译,这方面的知识还是空白。有兴趣的同学可以看一下别的大佬的writeup:http://t.csdnimg.cn/6rarWhttp://t.csdnimg.cn/6rarW