xss-labs通关教程
level 1

首先观察一下页面,我们可以知道:采用get类型传参,并且得到的参数会回显到页面之上,而且会计算它的长度。

通过观察源码我们可以发现标红的位置存在注入点。注入类型为XSS反射型注入。
将name的参数改变为
1 | <script>alert('xss')</script> |
直接通关!!
level 2

将test改为
1 | <script>alert('xss')</script> |
发现它并没有进行弹窗,这时候我们查看源码

发现它将<>都变成了HTML的实体字符了,猜测是使用htmlspecialchars()函数。
但是我们发现仍有地方没有被更改

但是它的语句在属性的值里,原来的语句是无法进行弹窗的这是我们更改语句使语句闭合。
"><script>alert('xss')</script>//
成功通关
level 3
插入注入语句之后发现并没有出现弹窗,查看源码。

发现两处都被转义成为了HTML实体的字符了。猜测后端有两个htmlspecialchars()函数,通过查看后端的代码证实了我们的猜想。
我们可以通过<input>
标签的一些特殊事件来执行JS代码。
构造代码:level3.php?keyword='onfocus=javascript:alert('xss') > //&submit=搜索
或者是' onclick='alert(1)
onfocus 事件是在对象获得焦点时才产生,onfocus 通常用于 <input>, <select>
, 和<a>
.
简单的说就是要鼠标点击输入框的时候才会触发。
成功通关
level 4
插入注入语句并没有出现弹窗,查看页面的源代码

我们可以发现1处被转译成的HTML实体的字符,2处直接除去<>,这时我们考虑采用
test" onclick="alert(1)
采用事件触发的方式不需要用到<>,通关后端我们可以知道后端采用str_replace() 函数将<>消去了。
成功通关
level 5
插入注入语句并没有出现弹窗,查看页面的源代码

可以发现后端将script转换为scr_ipt并且转义为HTML实体的字符。
然后发现on也被过滤了,而且所有的事件属性都是带有on的,所以在此处无法采用事件
构造一个Payload闭合闭合原标签,重新创建一个a标签
a标签中引入一个script超链接来调用弹窗
这时我们考虑采用
"><a href="javascript:alert(1)">link</a>
成功绕过,通过后端代码我们可以知道后端将script转义为scr_ipt,将on转义为o_n,转义为HTML实体的字符。
成功通关
level 6
插入注入语句并没有出现弹窗,查看页面的源代码

使用注入语句"><a href="javascript:alert(1)">link</a>
发现并没有弹窗,查看页面的源代码发现href被转义成了hr_ef

此时我们查看后端的代码可以发现它转义了很多东西,但是我们发现它并没有强制变为小写,所以我们采用大写的方式绕过。
构造语句 "><a Href="javascript:alert(1)">link</a>
成功绕过!
level 7
插入注入语句并没有出现弹窗,查看页面的源代码

发现script被删,改用 "><a Href="javascript:alert(1)">link</a>
发现Href,script被删,猜测后端进行了小写转换,并且删去了href,script。
双写href和script,构造语句 "><a hrhrefef="javascscriptript:alert(1)">link</a>
这一题其实也可以采用编码绕过。
成功绕过
level 8
插入注入语句没有出现弹窗,查看页面的源代码

发现它将‘ ’,script转义。而且因为我们只需要一个连接,所以我们采取编码的方式绕过。
采用javascript:alert(1)
的编码:javascript:alert(1)
成功绕过。
level 9
插入注入语句没有出现弹窗,查看页面的源代码.

发现它转义成了HTML字符,而且它它还输出了链接不合法的通知,我们查看后端的代码。发现它会寻找是否有http://的字符。

于是我们在编码之后加上字符串”http://“,构造语句 javascript:alert(1)//http://
成功绕过